决定跟安卓系统对着干
平时看着挺佛系的,但在技术这块,总喜欢较真。这阵子我盯上了一件事,就是安卓系统那个见鬼的后台管理。我的一个很重要的小工具,就是那种监控网络状态、记录点儿小数据的App,总是被系统无情地杀掉。明明我已经把所有能设置的权限都给它了,但只要我锁屏丢那儿半小时,它准没命了。
我当时就火了。这不是扯淡吗?我自己的手机,自己的程序,凭什么你系统说杀就杀?我决定要跟这个系统好好较量较量。我就想看看,能不能写出一段代码,让它无论如何都得给我活下去。这就是《宿命论安卓》这个实践的开始。
第一次交手:治标不治本的挣扎
我最初的思路很简单,用上最标准的“保活”套路。我第一步就是搞了个前台服务(Foreground Service),并且挂了一个持久的通知栏。这招以前在老版本安卓上是灵丹妙药,系统看你有个通知在那里,一般不好意思动你。
我跑了一次,初期效果不错。屏幕亮着的时候,它精神得很。但好戏不长,等我锁屏,扔在桌子上喝了杯咖啡的时间,再次打开,通知栏还在,但后台的数据记录已经停止了。App进程被系统冻结了,进入了深度休眠状态,虽然没被彻底杀掉,但已经是个植物人了。
这不行,植物人不算活着。我赶紧查资料,发现系统里有个叫“Doze”(休眠模式)的东西,这玩意儿就是个流氓。它管你是不是前台服务,只要它觉得手机闲下来了,就会限制你的CPU和网络活动。我尝试申请了WAKE_LOCK(唤醒锁),希望能抓住CPU不放。结果是,手机烫手,电池电量跟瀑布一样往下掉,可该死的植物人状态还是会出现。这完全是治标不治本,甚至可以说是饮鸩止渴。
深挖定制系统的一团麻
意识到标准做法搞不定后,我转头去研究那些手机厂商的定制系统。要知道,谷歌定下的规矩是一回事,国内这些厂商魔改后的系统又是另一回事。他们为了让自己的手机续航牛逼,把后台进程杀得比谁都狠。
我买了一台小米,一台华为,又借了一台OV系的手机。我的实践记录瞬间变成了一堆兼容性测试报告,真是头皮发麻。
-
在小米上,我找到了“神隐模式”和“电池优化”的白名单,我手动把我的App加了进去。这招在小米上暂时奏效了,它能活得久一点。
-
在华为上,有个更隐蔽的“应用启动管理”,必须手动关闭自动管理,并打开“允许后台活动”。这设置藏得深,一般用户根本找不到。
-
最绝的是OV系的手机。他们有自己的一套后台“守护机制”。我尝试了各种方法,包括利用JobScheduler来触发高频任务,企图让系统误以为App很忙。结果是,OV系统直接识别了我的“小伎俩”,把我列入了重点监控名单,杀得更快了。
我耗费了两个多星期,每天晚上都观察日志,分析被杀掉的时间点,企图找到那个杀手进程的规律。我写了几十个版本的代码,专门针对不同的厂商做判断和应对,但最终的结果都是相似的:我赢不了。
这就是宿命论安卓
我为什么说它是“宿命论安卓”?因为无论我用多复杂的代码,无论我绕过多少系统检查,我的App终究会被系统以某种方式制裁。这就好像是被命运注定了一样。
我锁定了一个问题:我的服务总是在凌晨两点到四点之间被彻底清理。我以为这是某个定时任务,但检查了所有能找到的系统设置和App活动日志,都没发现原因。
后来我偶然看到一个论坛里的老哥提到,某些厂商会在这个时间段启动一个非常深度的系统维护和垃圾回收,这个维护优先级极高,会无视绝大部分用户设置的白名单。它不是在“杀”你的进程,它是在“清场”。
那一刻我明白了,我的程序再牛逼,也牛逼不过谷歌和手机厂商合伙定下的规矩。当你试图打破系统的底层能源管理逻辑时,你就在对抗整个生态的设计哲学。你可能会暂时赢下一局,但长远来看,你注定会输。
我最终放弃了那种“永生不灭”的执念。我调整了我的思路,接受了被杀掉的事实。我的解决方案变成了:不强求永活,而是确保它被杀掉后,能在几分钟内优雅地重启,并且恢复到被杀前的状态。这虽然不是我最初的目标,但这却是安卓系统下,一个后台程序能获得的最好的结局。接受系统的限制,也是一种实用的成熟。