起因
在我的桌面小部件APP里有保活的需求, 因为开关勿扰模式的锁屏通知需要监听屏幕熄灭/解锁广播并添加/删除通知, 但从Android8.0起应用只能在运行时监听广播, 也就是说如果应用被杀死, 那么锁屏通知就没法出现/一直不消失了
其实解决方案很简单, 把APP放在/system/app下变成系统应用就行了(bushi, 这样做是不行滴, 毕竟现在以华为为首的一大堆手机都不允许root了, 而且这么做也有风险
分析
在网上一通搜索, 我找到了一些和保活有关的文章:
- Android实现进程保活方案解析
- 2020年了,Android后台保活还有戏吗?看我如何优雅的实现!
- Android进程永生技术终极揭秘:进程被杀底层原理、APP应对被杀技巧
- Android保活从入门到放弃:乖乖引导用户加白名单吧(附7大机型加白示例)
总结起来不外乎就两种办法, 要么使用一些随时都可能失效的黑魔法, 要么就引导用户允许自启/允许后台运行/允许被拉起/忽略电池优化
另外关于杀后台的机制各个系统也不一样, 原生系统是最宽松的, 详见: 深度比较EMUI和MIUI后台处理
再根据网上其他文章所说和自己亲自实验发现, 默认情况下(不加白名单且不加锁)大多数国产ROM从最近列表中划掉应用时都会结束进程(EMUI就连小窗关掉都会杀进程), 有些系统还会在熄屏后立即杀死应用, 十分过分
而QQ和微信这种应用划掉卡片也不会结束, 大概率是因为它们在系统的白名单中(过去可能也是使用黑魔法保活的, 我反编译了一下QQ发现有一个CoreService, 这个服务在新版Android没有任何作用, 只有在旧版Android上才能实现保活, 但我每次划掉卡片这个服务都不会被杀死)
最终我屈服了, 决定还是应该引导用户添加白名单, 这倒是没问题, 但作为一个无需界面就能运行的应用, 要求用户在最近任务里加锁或者是开前台服务(需要显示通知)保活就非常不合理了
但是允许后台运行真的有用吗?
后来我在谷歌上搜索, 发现了这个网站: Don’t kill my app!
原来”天下苦秦久矣“, 早就有开发者抱怨这些严格的后台限制了, 这个网站叙述了大多数ROM的后台管理策略, 还给出了评价, 可惜大多数信息都比较旧了, 不过还是具有一定的参考价值
我下载了他提供的应用, 在我的手机上(荣耀30/HarmonyOS2.0.0)进行了一系列测试, 这个程序会开前台服务保活, 测试结果如下:
- 默认设置: 很快被杀
- 白名单但不加锁: 一段时间后被杀
- 白名单加锁: 正常
- 任何情况下划掉卡片: 直接被杀
但这是开启了前台服务的情况下, 就桌面小部件应用来说, 我已经把新冠疫情小部件的更新迁移到了WorkManager, 这样方便用户更改刷新间隔, 但在近一个月的测试中, 即使是加了白名单, 按时更新的情况也屈指可数, 猜测这是Android原生行为导致的, 此应用没有界面也没有前台服务, 它的优先级会逐渐降低直至被杀, 但是最大的问题在于WorkManager无法正常运行, Android原生时间长了也会杀死应用, 但是WorkManager能正常运行
不过这里有一些是我的猜测, 等放暑假有时间再做具体实验验证一下
真正的解决方案
后来我又在网上发现了其他桌面小部件APP, 下载下来发现他们也一样被杀, 我平衡了hhhhhhhhhh
所以要么白名单+在最近任务里加锁+开前台服务还要提醒用户不要划掉(华为还不能关闭小窗), 要么就摆烂吧
至于我, 我选择在7.0以下开启前台Service, 再开启另一个Service将通知栏移除, 至于7.0以上么, 给用户加个启动前台服务的选项, 然后我tm直接摆烂…
关于华为
由于我的手机是荣耀的, 所以就对EMUI/MagicUI/HarmonyOS多说几句吧
华为有3个应用负责管理后台:
iaware: 性能调度
haware: 省电精灵
hwaps: 分辨率
另外华为激进的后台管理策略确实对开发者不利, 就连VLC都成了受害者: VLC is blacklisting recent Huawei devices to combat negative app reviews
不过在研究这些APP的服务的时候我发现了”鸿蒙保活绝学“: 那就是桌面服务卡片, 我之前写了个鸿蒙的demo, 研究了一下它的桌面服务卡片, 然后放在桌面上一直懒得删, 结果发现这东西也是个服务, 而且杀不掉, 所以如果你开发鸿蒙应用, 那最好的方法就是引导用户在桌面上添加服务卡片啦hhhhhh
以此类推, 我发现动态壁纸也能达到相同的效果, 但是动态壁纸比较耗电, 属于是得不偿失了