防止后台服务因“检测到派生进程的CPU使用率过高”而被杀死

11
我正在调试问题Syncthing Android包装器。安卓应用程序将Syncthing项目的本地二进制文件包装起来,并提供一些额外的功能,例如基于连接WiFi、电源等启动/停止。
不幸的是,有关服务在WiFi更改后不再自动启动的问题已经出现,特别是对于已经升级到Android 6的手机。由于我的个人手机最近已经升级到6.0.1,我终于能够调试这个问题了,今天我注意到以下内容:
07-06 20:52:26.562  1181  1363 I ActivityManager: [BgDetect]chkExcessCpu doKills: true uptime: 300309
07-06 20:52:26.960  1181  1363 I ActivityManager: [BgDetect]detect excessive cpu on forked process libsyncthing.so(pid : 2758) plan to stop it 371060 during 300309
07-06 20:52:26.960  1181  1363 I ActivityManager: [BgDetect]force stop com.nutomic.syncthingandroid.debug (uid 10132)
07-06 20:52:26.965  1181  1363 I ActivityManager: Force stopping com.nutomic.syncthingandroid.debug appid=10132 user=0: from pid 1181
07-06 20:52:26.966  1181  1363 I ActivityManager: Killing 1360:com.nutomic.syncthingandroid.debug/u0a132 (adj 15): stop com.nutomic.syncthingandroid.debug
07-06 20:52:26.968  1181  1363 W ActivityManager: Scheduling restart of crashed service com.nutomic.syncthingandroid.debug/com.nutomic.syncthingandroid.syncthing.SyncthingService in 1000ms
07-06 20:52:26.968  1181  1354 V ActivityManager: killProcessGroupAsync took 1 ms for PID 1360 on thread 14
07-06 20:52:26.971  1181  6410 I libprocessgroup: Killing pid 2758 in uid 10132 as part of process group 1360
07-06 20:52:26.973  1181  6410 I libprocessgroup: Killing pid 2758 in uid 10132 as part of process group 1360
07-06 20:52:26.974  1181  1363 I ActivityManager:   Force stopping service ServiceRecord{47304c8 u0 com.nutomic.syncthingandroid.debug/com.nutomic.syncthingandroid.syncthing.SyncthingService}

Syncthing协议在加密、哈希等方面对CPU的要求相当高。因此,似乎由于分叉的本地二进制文件对CPU的高要求而导致服务被强制停止。
应用程序已标记为“无电池优化”,但仍然被杀死。有没有办法防止ActivityManager由于分叉进程的CPU需求而杀死应用程序?

1
嗯,在AOSP 6.0分支上搜索BgDetect并没有返回任何结果,所以它可能是OxygenOS的一个新增功能。 - Martin C.
似乎使用startForeground()将服务提升到“前台”可以缓解问题。但我认为这不是最优解决方案。 - Martin C.
1
添加startForeground()不幸不能解决这个问题。 - phcaze
1
即使使用了startForeground(),仍被系统杀死。 - felangga
解决方案/解释在这里https://dev59.com/P7Dla4cB1Zd3GeqP5ED9#56195214#56195214。 - rmindzstar
2个回答

3
很遗憾,这是一加/OxygenOS的一个功能,基于不知名的规则杀死任何后台进程,以达到更好的电池寿命效果。目前为止,我在GitHub上找到了一个非代码解决方法,似乎有些帮助,但远非理想:在最近使用列表中将应用程序固定/锁定。请参考GitHub问题此处截图

0
测试前台服务时发现性能问题主要是CPU。因此,我使用分析器强制执行性能并将其添加到白名单中。
降低了CPU、RAM和电池的消耗,任务完成。 一加设备中前台通知服务无法工作

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