我有一个已启动的前台服务。
我已经注意从onStartCommand
返回START_STICKY。
我发现前台服务无法无限期运行,但会被名为RestartProcessManager
的Android内部模块定期终止。基本上维护一个进程LRU,并且如果它被配置为这样做(粘性或非粘性),则再次安排新终止的服务。
我面临的问题是如何处理重启。 Logcat表示正在传递服务意图,但由于"进程不正确而失败"
通过其他来源搜索后,我被引导相信我的服务中存在内存泄漏。为了验证这个声明,我创建了一个vanilla前台服务,除了在同一个应用程序中的onStartCommand
期间记录语句外什么也没做。这也发现了同样的问题。
在一个新项目中尝试了完全相同的东西(显然有一个新的包名),服务重启完全正常。此外,我通过单击 studio-> logcat 下的红色十字按钮来模拟重启(这实际上会杀死该过程)。无论如何,这次服务意图成功交付,服务再次启动并运行。 我认为它可能是我项目中的一些依赖项,可能会以某种方式搞乱。我在新项目中复制了依赖项,并继续按预期工作。
现在这是荒谬的地方。我在错误项目中更改了包名称,我不再遇到问题了。我已经解决了这个问题,因为我花了将近2天的时间来诊断这个问题,但是因为我的应用程序已经发布,所以更改软件包名称对我来说是不可行的。
编辑-1:我必须提到我目前在运行Oreo(一加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
答案 0 :(得分:2)
对于服务的原始版本,请考虑以下事项:
1-卸载您的应用 2-重新启动设备 3-重新安装您的香草服务版本以仅进行日志记录。
应该可以。
对于前台服务,请考虑使用stopSelf或stopService方法,而不要使用stopForegroundService方法。 stopForegroundService只是将服务停止为前台。它不会阻止它成为后台服务。它会一遍又一遍地重新启动,并且如果您的服务在5秒钟内崩溃或无法正常工作,那么OS将一遍又一遍地终止您的服务,最终您的服务将被列入OS的黑名单。
答案 1 :(得分:0)
按this blog和this other question推送KR_Android的注释:至少崩溃两次后,服务意图被声明为“坏”。
请尝试
SubHeader.propTypes = {
left: PropTypes.array,
center: PropTypes.array,
right: PropTypes.array,
}
安全带中让我们知道,我们将在进一步挖掘之后更新我们的答案
答案 2 :(得分:0)
令我烦恼的是,直到我重新启动机器后系统才重新启动我的服务。然后我发现了这个技巧,可以更快地清除崩溃计数:
adb shell killall system_server