粘性前台服务无法重新启动,并显示“进程已损坏”错误

2022-09-01 07:02:01

我已启动前台服务。我已经小心翼翼地从START_STICKY返回。我观察到前台服务不会无限期运行,而是由一个名为.实质上,维护一个进程 LRU,并且如果将新终止的服务配置为这样做(粘性或非粘性),则会再次调度该进程 LRU。onStartCommandRestartProcessManager

我面临的问题是如何处理重新启动。Logcat 指示正在传递服务意图,但由于“进程不正确”而失败

在搜索了其他来源之后,我被引导相信我的服务中存在内存泄漏。为了验证此声明,我创建了一个普通的前台服务,该服务除了在同一应用中记录语句之外不执行任何其他操作。这也观察到了同样的问题。onStartCommand

在新项目中尝试了完全相同的事情(显然具有新的包名称),并且服务重新启动工作正常。此外,我通过单击 studio->logcat 下的红叉按钮来模拟重新启动(这基本上会杀死该过程)。无论如何,这次已成功交付服务意图,并且服务再次启动并运行。我以为这可能是我的项目中的一些依赖项,可能会以某种方式混乱。我在新项目中复制了依赖项,它继续按预期工作。

这就是它变得荒谬的地方。我在buggy项目中更改了软件包名称,并且不再遇到此问题。我本来会解决这个问题,因为我花了将近2天的时间诊断这个问题,但是更改包名称对我来说是不可行的,因为我的应用程序已经发布。

编辑-1:我必须提到,我目前在运行奥利奥的设备上观察到了这一点(一加5)

编辑-2:该服务在与应用相同的进程中运行。我也包括了 logcat 转储。

02-15 14:26:50.850  1395  1445 D RestartProcessManager: updateSelf :  com.ambee, size : 30
02-15 14:26:50.852  1395  1445 D RestartProcessManager: com.ambee got score 26.17240489145331 in DayDuration for duration : 525176
02-15 14:26:50.853  1395  1445 D RestartProcessManager: com.ambee got score 99.80218232889891 in DayLRU for LRU diff : 47707034
02-15 14:26:50.853  1395  1445 D RestartProcessManager: com.ambee got score 90.9090909090909 in DayLaunchTimes for launch times : 10
02-15 14:26:50.854  1395  1445 D RestartProcessManager: com.ambee : X : 2727.272727272727, Y : 785.1721467435993, Z : 2994.0654698669673
02-15 14:26:51.082  1395  1445 I ActivityManager: Killing 13839:com.ambee/u0a260 (adj 200): [BgDetect][RNK] kill com.ambee (uid 10260) usage 4
02-15 14:26:51.083  1395  1445 D ActivityManager: Process com.ambee has 1 services
02-15 14:26:51.083  1395  1445 W ActivityManager: Scheduling restart of crashed service com.ambee/.vson.LinkService in 10996ms
02-15 14:26:51.084  1395  1445 D EmbryoManager: prepare com.ambee user 0
02-15 14:26:51.099  3710  3710 D NotificationListener: onNotificationRemoved# hash: 68226270 sbn: StatusBarNotification(pkg=com.ambee user=UserHandle{0} id=903 tag=null key=0|com.ambee|903|null|10260: Notification(channel=default pri=0 contentView=null vibrate=null sound=null defaults=0x0 flags=0x72 color=0x00000000 actions=2 vis=PRIVATE))
02-15 14:26:54.121  1395  1444 I ActivityManager: Start proc 22570:com.ambee/u0a260 for embryo com.ambee
02-15 14:26:54.121  1395  1444 D Embryo_Uterus: Embryo created.com.ambee, pid=22570
02-15 14:26:54.796 22570 22570 D Embryo  : preload com.ambee, 10ms, hwui=true, layout=false, decor=false
02-15 14:27:02.084  1395  1445 W ActivityManager: Unable to launch app com.ambee/10260 for service Intent { cmp=com.ambee/.vson.LinkService }: process is bad
02-15 14:27:04.214  1395  1444 D Embryo_Uterus: rank:63, com.ambee, 35767806

答案 1

对于您的普通版本服务,请考虑以下事项:

1-卸载您的应用程序2-重新启动您的设备3-重新安装您的香草服务版本以仅记录。

它应该有效。

对于前台服务,请考虑使用 stopSelf 或 stopService 方法,而不是 stopForegroundService 方法。stopForegroundService 只需停止将服务作为前台。它不会阻止它成为后台服务。它会一遍又一遍地重新启动,如果你的服务在5秒内崩溃或没有完成他的工作,那么操作系统会一遍又一遍地杀死你的服务,最终你的服务将被列入操作系统的黑名单。


答案 2

推高KR_Android的评论:根据这个博客这个另一个问题:服务意图在崩溃至少两次后被宣布为“坏”。

请尝试

  • 将所有方法封装在安全带中try { method(..); } catch(..) { log(..) }
  • 卸载并重新安装应用

让我们知道,我们将在进一步挖掘后更新我们的答案


推荐