V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
yafoo
V2EX  ›  Android

求助安卓开发大佬, App 崩溃,提示启动前台服务失败,问题是我并没有启动前台服务

  •  
  •   yafoo · 81 天前 via Android · 2865 次点击
    这是一个创建于 81 天前的主题,其中的信息可能已经有所发展或是发生改变。

    日志如下:

    Time: 2025-05-12 23:41:07
    Brand: Xiaomi
    Model: 2211133C
    Android Version: 13 (SDK 33)
    Exception: 
    Message:Context.startForegroundService() did not then call Service.startForeground(): ServiceRecord{5105f70 u0 com.android.app/.MQTTService}
    Stack Trace:
    android.app.RemoteServiceException$ForegroundServiceDidNotStartInTimeException: Context.startForegroundService() did not then call Service.startForeground(): ServiceRecord{5105f70 u0 com.android.app/.MQTTService}
    at android.app.ActivityThread.generateForegroundServiceDidNotStartInTimeException(ActivityThread.java:2078)	
    at android.app.ActivityThread.throwRemoteServiceException(ActivityThread.java:2052)
    at android.app.ActivityThread.-$$Nest$mthrowRemoteServiceException(Unknown Source:0)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2314)
    at android.os.Handler.dispatchMessage(Handler.java:106)	at android.os.Looper.loopOnce(Looper.java:210)
    at android.os.Looper.loop(Looper.java:299)	
    at android.app.ActivityThread.main(ActivityThread.java:8240)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:559)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:954)
    

    从日志看,大概意思是启动前台服务失败,问题时,我程序里根本没有启动前台服务,引用的第三方库,也不会启动前台服务。

    这个问题,仅在这个用户出现。

    而且诡异的是,正常情况下,app 连续崩溃几次,安卓就会禁止自启动,而这个用户的手机,居然可以一直在自启动,启动后后崩溃,然后继续自启动。

    有没有安卓开发的大佬,这是属于什么问题?

    第 1 条附言  ·  81 天前
    忘了说了,我自身代码里是启动的后台服务
    第 2 条附言  ·  81 天前
    我感觉是小米这个 android 系统强制把后台服务修改为前台服务了,造成跟代码不匹配,造成崩溃。又感觉系统不至于出现这种 bug
    35 条回复    2025-05-23 16:48:59 +08:00
    dingwen07
        1
    dingwen07  
       81 天前
    让用户把你的 App 禁用后台优化试试看
    Musong
        2
    Musong  
       81 天前
    “引用的第三方库,也不会启动前台服务。”,感觉是这的问题,可能有推送之类的。
    纯猜测阿
    wuruxu
        3
    wuruxu  
       81 天前
    应该先问 AI ,一般问题都能搞定的
    yafoo
        4
    yafoo  
    OP
       81 天前 via Android
    @dingwen07 哦,我看看能不能复现
    yafoo
        5
    yafoo  
    OP
       81 天前 via Android
    @Musong 我这个 app 本身是做推送的,引用的第三方库,只有简单的几个,一个 http 请求库,一个谷歌的 json 解析库,一个开源的 mqty 客户端,一个 markdown 解析库,所以说不会是第三方库引起的。

    app 虽然没几个用户,不过已经迭代了 2 年了,目前只有这一个用户出现这情况。
    yafoo
        6
    yafoo  
    OP
       81 天前 via Android
    @Musong mqtt 客户端
    yafoo
        7
    yafoo  
    OP
       81 天前 via Android
    @wuruxu 问过 AI 了,AI 的意思是,让检查第三方库
    yafoo
        8
    yafoo  
    OP
       81 天前 via Android
    忘了说了,我自身代码里是启动的后台服务
    nightlight9
        9
    nightlight9  
       81 天前
    @yafoo #6 日志里都写了 MQTTService 是前台服务....
    maokg
        10
    maokg  
       81 天前
    android.app.RemoteServiceException$ForegroundServiceDidNotStartInTimeException: Context.startForegroundService() did not then call Service.startForeground(): ServiceRecord{5105f70 u0 com.android.app/.MQTTServic
    rumengzhenxing
        11
    rumengzhenxing  
       81 天前
    @yafoo #8
    ~~~java
    @Override
    public void onCreate() {
    super.onCreate();
    // 创建通知渠道( Android 8.0+必需)
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    NotificationChannel channel = new NotificationChannel(
    "MQTT_CHANNEL_ID",
    "MQTT Service",
    NotificationManager.IMPORTANCE_LOW
    );
    NotificationManager manager = getSystemService(NotificationManager.class);
    manager.createNotificationChannel(channel);
    }
    // 构建通知并启动前台服务
    Notification notification = new NotificationCompat.Builder(this, "MQTT_CHANNEL_ID")
    .setContentTitle("MQTT 服务运行中")
    .setContentText("正在连接服务器...")
    .setSmallIcon(R.drawable.ic_notification)
    .build();
    startForeground(1, notification); // ID 必须非 0 ,通知不可为 null
    }
    ~~~
    winterbells
        12
    winterbells  
       81 天前
    全局搜 MQTTService ,ctrl + shift + f 搜,切换到 scope all place
    capric
        13
    capric  
       81 天前
    mqtt clientl 连接 broker 超时了?
    debuggeeker
        14
    debuggeeker  
       81 天前
    启动的后台服务,那就对了,启动后台服务,高版本需要 startForeground ,还需要带个通知显示,查一查官方 api 吧,需要配置权限和服务通知。
    Bichat
        15
    Bichat  
       81 天前
    以前接过 android 版本的 mqtt 库,他会创建一个前台 service 的
    DeweyReed
        16
    DeweyReed  
       81 天前
    我的 Crahlytics 中全是这个。试过很多方案都无法根治。
    Context.startForegroundService 启动一个 Service ,然后在 Service 中要调用 startForeground ,这是一个从后台启动前台服务的一种方法。没在规定时间内调用 startForeground ,就会触发这种崩溃。这种崩溃几乎必定会有用户遇到。
    逆向自己的应用,查找 startForegroundService ,可以定位到哪个 Library 触发的。
    a1210968738
        17
    a1210968738  
       81 天前 via Android
    可以 hook 对 ams 的 binder 调用,这样可以拿到发起启动服务的具体堆栈和参数,可以排查出是否有三方库以你意想不到的方式启动前台服务;或者 app 确实没有主动启动前台服务。
    joywan
        18
    joywan  
       81 天前
    启动后台服务必须同时启动前台服务,而你没有启动。
    yafoo
        19
    yafoo  
    OP
       81 天前
    @nightlight9 MQTTService 是我自己写的,我写的启动方式是后台启动
    yafoo
        20
    yafoo  
    OP
       81 天前
    @rumengzhenxing 你这段代码是用来启动前台服务的,我用的是后台服务
    yafoo
        21
    yafoo  
    OP
       81 天前
    @winterbells MQTTService 是我自己写的后台服务
    yafoo
        22
    yafoo  
    OP
       81 天前
    @debuggeeker APP 目前用户不多,支持安卓版本最低安卓 7 ,最高安卓 15 ,目前都没问题,最高安卓 15 正常运行没问题的。
    yafoo
        23
    yafoo  
    OP
       81 天前
    @capric 感谢,我验证验证试试
    yafoo
        24
    yafoo  
    OP
       81 天前
    @Bichat 客户端用的 https://github.com/eclipse-paho/paho.mqtt.java 这个,开源的,他自身不会创建前台 service
    yafoo
        25
    yafoo  
    OP
       81 天前
    @a1210968738 感谢回复,这个有点高级,我不会操作,留以后再研究吧
    yafoo
        26
    yafoo  
    OP
       81 天前
    @joywan 好像不是必须的
    nightlight9
        27
    nightlight9  
       80 天前
    @yafoo #19 14 楼说的靠谱。你把 targetapi 降低到 25 ,就不会报这个错了
    joywan
        28
    joywan  
       80 天前
    @yafoo #26 从 Android8 开始必须
    okakuyang
        29
    okakuyang  
       80 天前
    安卓早就不是当年那个安卓了,现在必须开启前台服务,并且弹一条通知。
    wobuhuicode
        30
    wobuhuicode  
       80 天前
    额,现在的人都不看日志的……这么明显的提示,都不看的
    yafoo
        31
    yafoo  
    OP
       80 天前 via Android
    @okakuyang 我这 App 目前从安卓 7 到安卓 15 ,都有用户在用,我自己也用了 2 年了,没问题。只有这一个用户报这个错
    yafoo
        32
    yafoo  
    OP
       80 天前 via Android
    @wobuhuicode 请大佬指教,这个是什么问题。
    App 目前用户不多,不过从安卓 7 到安卓 15 ,都有用户在用,我自己也用了 2 年了,没问题。只有这一个用户报这个错
    lemos1235
        33
    lemos1235  
       79 天前
    需要启动前台服务。之前遇到过
    mtdhllf
        34
    mtdhllf  
       70 天前
    你没 get 点,现在不允许你启动以前那种悄咪咪后台服务了,启动服务你就得是前台服务(用户消息通知能看到)。要么你就试试 bind service 方式,看不启用前台通知正否正常
    yafoo
        35
    yafoo  
    OP
       70 天前
    @mtdhllf 感谢回复!你说的这个点我知道。

    我现在的问题时,我有 100 个用户,这 100 个用户,从安卓 7 到安卓 15 的用户都有,而且都在正常使用,我自己也用了 2 年了,我手机安卓版本是 14 。

    所有用户都是正常的,目前只有这一个用户出现这个问题。我程序启动的是后台服务,如果不能正常运行,应该报后台服务的异常才对,这个用户现在报的错是启动前台服务异常,关键是我没有启动前台服务,咋会报启动前台服务的异常呢?

    我想了想,感觉是这个手机 os 本身,启动后台服务时,强制系统级给改为前台服务了,于是就报错了,这只是猜测,所以想问安卓开发的大佬,怎么看这个事
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2593 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 04:56 · PVG 12:56 · LAX 21:56 · JFK 00:56
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.