作者 | Anm718(酷友)
Android 系统长期存在应用后台管理机制。在多数人的认知中,应用分前台和后台。最简单的判别方式:显示界面的应用就是前台应用,在运行不显示界面的应用就是后台应用。
安卓十多年发展至今,应用数量庞大,实现的功能各不相同,那么简单的后台机制肯定无法满足需求。本篇图文详细解释一下 Android 的后台管理机制。具体分三节。
- Android 后台机制的根本
- 内存管理:应用状态分级、LMK 机制、与其他系统的区别。
- 为什么后台应用关不掉:应用保活、自唤醒、关联启动。
- 斩杀恶性应用的利剑:后台纯净、切断唤醒、持剑人 Google 的手段。
安卓内存管理方案:
Android 沿用了 Linux 的内存管理方案,为低内存回收机制。与开多少就占用多少的 Windows 不同,Android 是你不开应用,也会占用内存。在空载状态下,Android P 占用下限约为 500mb (大概,我测试可以正常运行),上限为设备物理内存的 1/2,即开机占用一半内存。而安卓应用不存在关闭一说,退出之后仍然会留在内存中。直至剩余内存过低,才会由系统机制将其杀掉,回收它占用的那部分内存。
了解应用状态的分级:
- foreground 前台。设备当前运行的应用,你打开什么软件,前台应用就是什么,很容易理解吧。
- visible 可见。与前台类似,同样可以显示在屏幕上,让用户看到,以及交互操作,如输入法、浮窗。
- secondary 次级。后台运行的服务,通常占用资源不大,但用户很需要其功能,比如各家系统的云服务。
- hidden 后台。后台运行的进程,在应用运行时直接按下 home 键,应用仍在运行。如果应用的优化没做好,那么将占用大量资源。
- content_provider 内容。与用户关系不大,通常感知不强。
- empty 空白。应用已经停止运行,没有进程与服务,只留下一个缓存,确保下一次打开时更迅速。
上述六种状态,越往下,重要性越低,越容易被杀掉。
Android 后台的杀手 - Low Memory Killer:
应用在后台运行,固然可以增加启动速度,或便于推送信息,但内存大小和电池容量都不是无限的。当后台一多,就会拖累性能,降低续航。系统自然不可能坐以待毙,等着内存爆满死机。Android 系统使用了的低内存杀后台机制 LowMemoryKiller,以下简称 lmk。
可以看到,lmk 对每个应用状态都有对应数值。当剩余内存大小达到数值时,lmk 就会杀掉对应状态的应用,以释放内存。若杀掉应用,剩余内存仍然不足,便会继续杀掉上一个状态级别的应用,以此类推。一直杀到前台应用,这便会造成正运行的应用或游戏闪退。当然,目前安卓机动辄 4g、8g 内存的时代,能让 lmk 杀到前台的应用应该不存在了吧,除非是出现 bug。
应用在后台占用的资源:
在固有印象中,安卓后台应用一多,就会十分卡顿。因为应用运行是要消耗硬件资源的,不论前台和后台。可能在 500mb 内存的时代没有那么明显的感知,因为内存太小,应用留不住后台。但从安卓机进入了 1g、2g 内存的时代,这个缺陷就一下子暴露出来了:后台杀不死,杀死后自启动,一个应用拖好几条进程,一条进程又有好几项服务,堪称群魔乱舞。此现象持续了至少六年。
那这些应用消耗的是哪些资源呢?看上文的后台分级,这些应用一般属于次级或后台,与前台应用一样运行,会占用 CPU 运算资源,数据操作会占用闪存的读写资源,这两项就足以死死卡住设备,使其无法正常运行。这些资源总量是一定的,在当时性能普遍不强时,资源用一点就少一点,后台占用大了,前台自然要卡。
空载:
后台开启百度地图:
此时已经卡到没法正常运行了,各种动画掉帧。
Android 与其他系统后台的区别:
对于各个系统的应用,一般可以用两种状态来表示:Android 分为 “运行” 和 “停止”,iOS 分为 “前台” 和 “冻结”,Windows 分为 “启动” 和 “关闭”。
解释一下:iOS 的特点是冻结式后台,即应用留后台但不运行,只有前台应用能运行。这样可以做到打开应用时秒开,但退入后台也不消耗资源,只占用内存;Windows 特点是打开哪个应用,哪个应用就运行,点击关闭就停止运行,并清出内存。
内存占用也是与后台有关,旧时 Android 日常会占用 50%;iOS 内存在开机不久会爆满,始终居于 95% 以上;而 Windows 则是应用多大,内存占用就多大,没有应用时占用很低。
还有一个 Windows Phone 系统,是 Microsoft 基于 win 为智能手机设计的系统,它的特点不是杀死,而是限制,对后台应用数量限制,对每个应用占用内存限制。这种单个体小,个体总数少的限制,是非常简单且有效的,逼开发者不得不优化。不愧是你,微软。
有些用户会刻意关闭后台,以释放内存或增加续航,但发现无法关闭后台运行的应用。这是什么原因呢?来详细分析一下后台管理手段与应用的关系。首先看一下后台界面。
在这个界面中,可以展示出你打开过的应用,并生成缩略图。前面说过,安卓应用不存在关闭,退出后应用会进入后台运行。这个界面,可以手动停止后台的应用进程,就是点击那个 × 号,或在高版本上是滑动。但此行为并不等同于强行停止!
这个界面并不是强制性停止应用,而是清理掉应用的界面,并通知应用,应该停止自己的后台进程了。至于停止哪些服务,就是应用自己说了算。旧时安卓这个机制问题真的很大,尤其 Android K-N,和恶意应用对线简直被爆锤。当时定制化系统对这些机制进行了修改,划掉卡片即强行停止,才能对恶意应用进行反击。
应用保活:
应用的开发者为了一些功能运行,或是一些利益原因,会对应用的后台进程进行保护,防止被杀掉,此行为称为应用保活。
常见的保活手段,就是留通知。在通知栏中留一条不可清除的通知,即可实现避免被杀。即便你在后台界面划掉了卡片,只要这条通知还在,那么这项服务就在,可以随时拉起主进程,继续运行。这样的应用有很多,比如在通知栏里放个资讯窗口、搜索框,就是这种思路。
最直接的保活手段,就是向用户请求权限。在定制系统上,通常会有 “允许应用在后台运行” 权限,应用可以找一个正当的借口,让用户主动把这个权限打开,就能在后台畅通无阻的运行了。
除此之外还有一些奇妙操作,比如建立透明悬浮窗,可以直接提高应用状态分级,就难以被 lmk 杀掉;进程守护,一个应用建立几个进程,有一个进程掉了,立马由另外一个进程拉起来;还有更强的,以毫秒级速度不停尝试拉起自己的进程,这种方法甚至可以无视强行停止(只要我启动的够快,强行停止就关不掉我),这已经是破坏型行为了。
应用唤醒:
应用会通过一些方式,在用户未手动打开的情况下自行启动,即应用唤醒,也称应用自启动。此时没有前台界面,启动的只是进程与服务。
Android 应用开发时,会给应用加上 BroadcastReceiver (广播接收器,以接收系统的广播),以对一些状态作出对应的响应,比方说此设备收到电话,系统就会发出广播 “来电话了”,应用 “拨号” 就会自启动,响铃提醒用户接听。存储空间低于一定量时,系统会发广播,文件管理类应用会提示用户清理文件以释放空间。合理使用可以使应用极大提升功能性,但不合理使用的话,就是给用户找麻烦。
借用知乎老哥的图。可以看出百度云会接收图中的广播,实现自启动。WiFi 更改、存储变动时自启动也就罢了,毕竟功能联网还要依赖存储,但收发短信、拨打电话还要启动干什么呢?安装卸载应用时也启动,充电断电也启动,你是多么怕自己的服务拉不起来啊?
即便杀掉了后台,没一会又自启了,跟没杀一样。
关联启动:
应用的广播接收器,不止可以接收系统的广播,也可以接收其它应用的广播,从而被其他应用拉起。
此现象称为关联启动,或链式启动。关联启动的常见场景:在 “手机淘宝” 中购买某件商品,选择付款方式支付宝付款,那么就可以直接拉起 “支付宝” 的应用界面,进行付款操作。
而不合理的使用场景,对于长期的安卓用户应该都深有感知了吧,拉起其他应用的后台服务,收集用户数据,推送广告。
可以看到,同一家的应用之间都会自动唤醒,保持后台活跃。这有什么用吗?我也不知道啊。
一开始的时候就是如此,后期此现象愈演愈烈,一些公司推出了关联 SDK,只要你接入了此 SDK,有接入相同 SDK 的应用启动,就会顺带拉起你的应用。链式启动成为了一种交♂易:“接入我的 SDK 吧,你的应用可以享受后台杀不掉的待遇,消息直达,数据收集无阻碍。” 于是,大量的应用开始接入这种 SDK,后台是不掉了。
开发者笑嘻嘻,可苦了用户,后台杀也杀不掉,停止了还能自启、链起。内存不大的机子,在那么多的应用下不停的触发 lmk 杀后台,刚杀掉就又起来了,陷入死循环,致使负载居高不下,续航也是血崩。
对于那些恶性应用,就只看着它们胡作非为、为所欲为吗?当然不行。反击之战早已打响,垃圾应用们,接招!
斩杀 - 应用后台进程:
后台纯净机制后台纯净并不是 Android 官方提出的说法,而是第三方定义的一种应用状态。即应用退出到后台,不留下任何无用服务 (无用指用户用不到),全部归进缓存 (即上文分级中的空白进程)。既不拖累系统性能,也能实现启动时秒开。
此说法来自于绿色公约,也就是说绿色公约中的应用可以做到这一点。但几年过去,自愿遵守的公约已成为来自 Google 强制的规定。如你当前运行的系统为 Android O 及以上,且应用目标 API 在 26 以上,那么该应用退出后便可以进入缓存,实现无损保后台。
你可以尝试打开应用,使用主页键退出应用界面,进入系统设置 - 开发者选项 - 正在运行的服务,观察是否有刚才应用的进程和服务。然后点击右上方的显示缓存,是否有刚才应用的缓存。如果没有进程服务,只留下了一个百来 mb 大小的缓存进程,那么这个应用就大概符合后台纯净了。
能看出,我常用的应用均支持后台纯净。当然万事无绝对,比如一个音乐播放器,在播放音乐,退出之后肯定要留一条进程的,毕竟后台还要运行的,不能说它不支持后台纯净。
啊。。这疼讯,永远的
还有一些奇怪的事情,就是内存显示错误,有时应用占的内存会直接算进系统占用里面,不知是逻辑 bug 还是应用的奇妙操作,如图:
斩杀 - 链式启动:
切断唤醒为了应对应用的自启动和链式启动,在早期的安卓定制系统中,提供了应用自启动的开关,由用户控制自启动。
关闭此开关,则系统会屏蔽应用的广播接收,使其无法通过广播自启。对于非深度定制系统,并没有这类限制。如果有 root 权限,可以使用工具 【My Android Tools】 ,手动管理应用的各种组件,不但可以关闭广播接收器,也能控制应用的后台服务。有用不到、但却在运行的服务,可以直接停掉。
如果有 xposed 框架,则可以使用 【应用管理 Xposed】 ,功能更多,效果更强,操作更简单。
斩杀 - 后台资源占用
后台应用,就应该有后台的样子。有些应用进入后台还不安分,不停交换数据,拖慢速度,吃掉大量资源。最过分的是唤醒锁,使设备无法休眠。那么目标已明确,就是降低它们对资源的占用。
自安卓 8 开始,系统对于后台应用进行了一次整治。如果系统是安卓 8,且应用的目标 API 是 26 及以上,那么这个应用会自动实现后台纯净。若应用 API 低于 26,则可以到 开发者选项 - 后台检查 中手动限制,若不需要这个应用的后台,则关闭即可。
到了安卓 9,限后台就更狠了。智能待机上线,可根据应用使用频率、使用时间进行自动化管理,分活跃、工作、常用、极少这几个等级,为后台分配不同的资源。这也是为什么用过一段时间的机子,续航比新机还长的原因,就是机器学习记录了你的使用习惯。
如果是不规范应用,迟迟不适配新特性呢?Google 还有更绝的招式。在 Android P 上还提供了后台限制功能,若应用的 API 较低,且在后台有大量进程,或长时间控制唤醒锁,系统将会在通知栏将应用列出,提示为:** 应用正在后台耗电 之类的,用户可以对其进行一键限制。这个限制可不是前文所说的限制分配资源,而是直接禁止应用的一切后台,禁止应用的一切响应,退出即停止。
此限制也可由用户手动打开,在设置 - 应用 - 查看全部应用,找到要限制的应用,高级 - 电池 - 后台限制,点击限制,世界都清净了。
另一种方法: 【App Ops】 中更改应用权限,“在后台运行” 这个权限在安卓 9 是这样的。
严格限制就是上面的限制应用。API 在 26 及以上的应用默认为基础限制,低于 26 的应用默认为不限制,用户都可以手动更改为严格限制。
能看出来,越是原生系统,干扰越少,不存在白名单,越能体现出开发者的优化水平。优化越垃圾,在原生 ROM 上越是挂不住后台,推不出消息。比如我的机子,就从来收不到酷安的消息通知 (whml
斩杀 - 恶性应用最后的倔强:Google 的手段
从这几次底层的大改动可以看出,Google 已经要大力整治这些恶性应用了,可以说是无差别打击,只要不规范,就要受波及。
后台限制,就是你能规范起来,那你可以在后台合理运行,不影响功能,用户的体验也不会受损,你好我也好。如果就是头铁,就想跟系统比划比划,那好,后台直接别运行了,你一个功能都实现不了。
Play 商店有着强制要求,目标 API 必须在 26 以上,且很快就要成为 28。这就意味着应用想不规范都不行,API 越高,应用受约束越多。不提升 API?也行,我不会给你下架,但我会禁止你发布更新。
如果你能做到永远不更新,那你可以这么做。如果不上架 play 商店呢?毕竟 Google 管不到第三方分发渠道。没关系,我不能禁止你分发,但我能干扰你运行。已知 API 低于 23,运行时会提示风险应用,谨慎使用。API 远低于当前系统,为了兼容运行,我会降低你的一些性能。
还不能抢占国际市场,完全得不偿失啊!
文末的闲聊
总有人抱怨安卓生态太差,跟竞争者 iOS 相比落后太多,这样比较就有失公允了。想想 iOS 的出身,苹果早在上个世纪就设计了 mac 操作系统,针对优化十几年,积累了大量经验,并有了一定的生态基础,设计 iOS 系统自然十分轻松,打好 iOS 生态也没啥压力。
反观 Android,一个 Linux 内核,从零开始制作系统,且最开始还不是为智能手机设计的。这样的一个存在,经历了几年发展,体量竟是完全压着 iOS 打,应用数量多于 iOS,市场占有量更是 iOS 的数倍。
如果这样还不能理解,再看看 Windows,发展数十年,生态依旧稀烂。
权限管理混乱、uwp 生态半残。这样是不是就感觉到 Android 的强大了?
- 问:如何正确查看剩余内存
- 答:设置 - 开发者选项 - 正在运行的服务,点击右上方的 “显示缓存进程”,即可查看真实剩余内存。剩余内存大小一般在 lmk 的最大值再多一点。通常是几百 mb
- 问:我就是不想让应用留后台,就想看到剩余内存大大的
- 答:设置 - 开发者选项 拉到底,后台进程限制,改为不允许后台进程。简单概括:剩余极大,体验极差。
- 问:现在手机内存到底几 g 合适?
- 答:要我说,3g 勉强,4g 足矣,6g 有余,8g 巅峰。12g 16g?方向错了。厂商不想着优化好,净想着比友商参数好看,成本压不下来,最后用户买旗舰机还要提高预算。
- 问:文章太长懒得看,给总结一下
- 答:杀后台只有 lmk 机制 和 用户手动停止。安装应用 API 越高越好,剩余内存越少越好。至于优化,自己爬回去看完。
有人说我写的图文看不懂,我尽力去修改了,可还是哪里不对劲。对于酷安几千粉的大佬,这些应该是基础了吧,没讲的必要。对于刚入安的小白,可能开头就看不懂了 (我太难了
图文写得有些混乱,这排版做的也挺拉跨,见谅。例行要评论。
强调版权:本图文禁止今日头条等营销媒体转载。如要引用文中语句或段落,请注明原作者 Anm718