#爱否精选#
希望靠谱、省电的统一推送系统能成为改观的第一步,也希望 @OasisFeng 口中那个甚至可以跨越设备重启恢复「后台状态」的理想化生态早日到来。
————————
本内容经授权转载自「少数派」;由爱否科技精选推送。
作者 / Clyde
来源 | 少数派(ID:sspai)
不知不觉间 Android 陷入了一个关于「后台」的怪圈:一边各大厂商陆续推出了 12G RAM 的手机,另一边你刚刚放到后台的下载任务没有如预期那样后台挂机下载,打开微信发现还得陪启动画面的孤独小人共赏蓝色星球,按照教程辛辛苦苦做了半个小时的 Tasker 规则、却没有按照计划自动执行……
于是一个耳熟能详的句子开始在我们脑海中成型——我的后台又被「*」了。
❶
应用开发者的「控诉」
如果你第二天早上醒来发现睡眠追踪应用里的记录数据「一马平川」,并不是因为你「睡得死」,而是睡眠追踪应用根本就没有正常工作。
遇到上述问题的人不止你一个,很多人选择向这些应用的开发者反馈问题,殊不知问题其实不在应用本身。
Android 平台著名睡眠追踪应用 Sleep as Android 的开发团队 Urbandroid Team 不堪其扰,索性上线了一个名为「别『*』我应用」的网站,矛头直指手机厂商糟糕的后台管理机制。
Don't kill my app! 网站对 OEM 系统的评分
以三星为例,Urbandroid Team 称,三星的部分机型在升级到基于 Android 9 的 One UI 后「*后台」现象变得尤为严重,自适应电池(Adaptive Battery)机制相比原生 Android 变得尤为激进,3 天内没有启动过的应用甚至无法从后台再次启动。最为糟糕的情况是,如果你安装了一个可以自动跳过周末的第三方闹钟,那这个闹钟应用很有可能不会像系统闹钟那样在下周一早上准时响起……
正如「别『*』我应用」网站上控诉的那样,拥有类似机制的还包括华为、一加、小米、华硕等等手机厂商的定制版 Android 系统,它们管理后台的方式大同小异,但都秉承着 iOS 上那一套「划掉就*掉」的原则——当我们把某款应用的任务卡片从多任务界面划去,它们也就彻底从手机后台中抹除掉了。
这里你可能会问很多问题:
Android 运行内存越来越充裕,为什么会有如此严重的「*后台」现象?
原生 Android 也采用了一套类似的卡片多任务交互方式,有什么区别?
Android 究竟需不需要借助「一键清理」这样的方式来释放运行内存?
我们得从一些基础的原理说起。
❷
Android 的内存回收机制
在官方文档中,Google 将「不受应用自身直接控制的应用进程生命周期」描述为 Android 最为基础也最为独特的核心特性,这里我们不妨将「应用进程生命周期」暂时理解为文章开头和第一部分所说的「后台」或「后台进程(process)」。
所以 Android 应用的后台进程去留本应是由 Android 系统来决定的。
当可用运行内存空间不足时,Android 系统会自行决定对特定应用后台进程占用的空间进行回收释放,这个过程中 Android 挥舞着的那把大刀,叫做 LMK(Low Memory Killer)。那 LMK 又是如何判断哪些应用可以被「*」掉、哪些应用又该暂时放过的呢?
每个应用都有各种各样的组成部分,其中特定组件的运行状态共同组成了一套供 LMK 进行内存回收的「优先级」参考,包括:前台进程、可见进程、服务进程和缓存进程。
一款应用通常会包含的进程类型
前台进程、可见进程和服务进程往往与我们正在手机上执行的操作直接或间接相关,比如正在前台供我们交互和操作的活动窗口(Activity)、正在通过广播接收器(BroadcastReceiver)等待触发的 Tasker 规则、正在后台通过 Wi-Fi 网络自动上传备份照片的 Google Photos 以及前面提到的有待触发的闹钟等等。这些进程优先级从高到低依次递减,LMK 一般不会触及。
缓存进程则是那些暂时放在运行内存中的部分,也是和本文探讨话题主要相关的重点。
在一个正常运行的(Android)操作系统中,缓存进程应是内存管理机制唯一需要交互的部分:一个运行良好的 Android 系统通常会在运行内存中暂存多个缓存进程以随时调用,提高应用间的切换效率,同时对那些较为老旧的不活跃进程进行有计划的回收。
只有在极端情况下,比如 Android 系统在回收掉所有缓存进程后发现空闲内存依然不够用(比如在低内存的「老爷机」上运行《崩坏 3》),这时 LMK 才会根据优先级继续对服务进程、可见进程和前台进程采取回收策略。而当这些我们在正常使用中能够直观感受到的进程都不得不被被回收时,文章开头提到的微信重载、音乐中断、下载消失等等现象也就出现了。
❸
谁动了你的后台
在可用内存充裕的情况下遭遇「*后台」现象,一方面可能是 LMK 这把「大刀」出了问题(常见于 Android 9 时期的 Pixel 3 用户),另一方面则有可能是其它规则额外干预了 Android 系统正常的内存回收机制。
这里提到的「其它规则」主要有两种形式,一种类似部分华为设备上预装的「省电精灵」,它会将所有没有加入后台白名单中的应用后台统统清除,另一种则依托于 Google 推出的后台检查、后台限制和自适应电池等功能进行「魔改」,让这些功能的实际效果远超预期,甚至达到意料之外的负面效果。
根据 Don't kill my app! 的统计,第二种后台干预机制在三星、一加和早期的诺基亚机型中常见,这里厂商们通常会用到一种类似「白名单」的方法来进行过滤。
以三星手机基于 Android 9 的 One UI 为例,除了微信、QQ 等国内常见应用,One UI 默认会为所有第三方应用关闭「允许后台活动」这一选项,同时开启「优化电池使用量」这一功能。
One UI 的后台管理
部分搭载氢 OS 的一加机型则将上面提到的应用进程进行拆分,除了基于原生 Android 的后台限制、电池优化,还有一套名为「自启动管理」的设置来对应用的自启动进行管理以及一套名为「深度优化」的电池优化机制,后者会造成很多智能手表、手环设备在一段时间后丢失与手机的蓝牙连接,最终导致睡眠追踪、运动记录等等功能的失效。