Android应用保活?苟活罢了

起因

在我的桌面小部件APP里有保活的需求, 因为开关勿扰模式的锁屏通知需要监听屏幕熄灭/解锁广播并添加/删除通知, 但从Android8.0起应用只能在运行时监听广播, 也就是说如果应用被杀死, 那么锁屏通知就没法出现/一直不消失了

其实解决方案很简单, 把APP放在/system/app下变成系统应用就行了(bushi, 这样做是不行滴, 毕竟现在以华为为首的一大堆手机都不允许root了, 而且这么做也有风险

分析

在网上一通搜索, 我找到了一些和保活有关的文章:

总结起来不外乎就两种办法, 要么使用一些随时都可能失效的黑魔法, 要么就引导用户允许自启/允许后台运行/允许被拉起/忽略电池优化

另外关于杀后台的机制各个系统也不一样, 原生系统是最宽松的, 详见: 深度比较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

以此类推, 我发现动态壁纸也能达到相同的效果, 但是动态壁纸比较耗电, 属于是得不偿失了

标题: Android应用保活?苟活罢了
作者: QingChenW
链接: https://dawncraft.cc/2022/05/378/
本文遵循 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 许可
禁止商用, 非商业转载请注明作者及来源!
上一篇
下一篇
隐藏