我有一个运行中的前台服务。
我已经确保从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
startForegroundService(intent)
来最初启动服务? - brandallonTaskRemoved
中只是有一个简单的日志语句,在调用超级方法前。它阻止了我的前台服务在Redmi Note 4上重新启动。我无法解释它 - 我最终没有覆盖它。不建议硬重置设备 - 无论您现在遇到什么问题,都将由您的用户在生产中经历。当报告开始出现时,您会感到遗憾无法再次复制该问题... 我暂时没有更多建议,但我强烈建议坚持下去并解决它!完整一天使用的内存转储将是我的下一个建议。 - brandall