粘性前台服务无法重新启动,出现“进程错误”的错误。

35

我有一个运行中的前台服务。 我已经确保从onStartCommand返回START_STICKY。 我观察到,前台服务不会无限期地运行,而是定期由Android内部模块“RestartProcessManager”终止。基本上,进程LRU被维护,如果配置为这样(粘性或非粘性),则新终止的服务将再次被安排。

我面临的问题是如何处理重启。Logcat显示服务意图已被传递,但因为“进程已损坏”而失败。

在浏览了其他来源后,我认为我的服务中存在内存泄漏。为了验证此说法,我创建了一个纯色的前台服务,在同一应用程序中的onStartCommand期间仅记录一个语句。这也观察到了相同的问题。

在新项目中尝试完全相同的操作(显然具有新的包名称)并且服务重新启动正常工作。此外,我通过单击studio->logcat下的红色十字按钮(实际上是杀死进程)来模拟重启。无论如何,服务意图成功传递,服务再次运行。

我假设这可能是我项目中的某些依赖关系以某种方式搞砸了。我在新项目中复制了该依赖项,它继续按预期工作。

现在情况变得荒谬了。我更改buggy项目的软件包名称后,就不再遇到此问题了。我本来会接受这个解决方案,因为我花了将近两天时间对其进行诊断,但是更改软件包名称对我来说不可行,因为我的应用程序已经发布。

Edit-1: 我必须提到,我目前在运行Oreo(one plus 5)的设备上观察到了这一点。

Edit-2: 服务在与应用程序相同的进程中运行。并且我也包括了logcat dump。

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
你的应用程序在这个问题之前短时间内崩溃了两次吗? - KR_Android
@brandall 更新了这篇文章。是的,https://dev59.com/YKjka4cB1Zd3GeqPFeLH 看起来可能是一个重复的问题。 - farthVader
1
你是否正在使用新的 startForegroundService(intent) 来最初启动服务? - brandall
2
我在 onTaskRemoved 中只是有一个简单的日志语句,在调用超级方法前。它阻止了我的前台服务在Redmi Note 4上重新启动。我无法解释它 - 我最终没有覆盖它。不建议硬重置设备 - 无论您现在遇到什么问题,都将由您的用户在生产中经历。当报告开始出现时,您会感到遗憾无法再次复制该问题... 我暂时没有更多建议,但我强烈建议坚持下去并解决它!完整一天使用的内存转储将是我的下一个建议。 - brandall
@brandall 注意到了。我也在考虑这个问题可能是由于我的设备订阅了不稳定的Android版本所致。 - farthVader
显示剩余19条评论
3个回答

2

针对您的原始服务版本,请考虑以下几点:

1- 卸载应用程序 2- 重启设备 3- 重新安装您的原始服务版本,仅进行日志记录。

这样应该可以解决问题。

对于前台服务,请考虑使用stopSelf或stopService方法,而不是stopForegroundService方法。stopForegroundService仅停止服务作为前台服务的状态。它并不能将其停止为后台服务。如果您的服务在5秒内崩溃或未能完成工作,则操作系统会一遍又一遍地重启您的服务,最终您的服务将进入操作系统的黑名单。


0

回复 KR_Android 的评论:根据 这篇博客这个问题 :服务 Intent 在崩溃至少两次后被声明为“坏的”。

请尝试

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

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


0

系统不重启我的服务直到我重新启动盒子,这让我很烦恼。后来我发现了这个技巧,可以更快地清除崩溃计数:

adb shell killall system_server

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接