- APP神圣官网 > 官方版本 > 正文
后台不死不了解开机机制内存(后台内存运行不死机制)
作者 | Anm718(酷友)Android 系统长期存在应用后台管理机制。在多数人的认知中,应用分前台和后台。最简单的判别方式:显示界面的应用就是前台应用,在运行不显示界面的应用就是后台应用。安卓十多年发展至今,应用数量庞大,实现的功能各不相同,那么简单的后台机制肯定无法满足需求。本篇图文详细解释一下 Android 的后台管理机制。具体分三节。目录:- Android 后台机制的根本 - 内存管理:应用状态分级、LMK 机制、与其他系统的区别。- 为什么后台应用关不掉:应用保活、自唤醒、关联启动。- 斩杀恶性应用的利剑:后台纯净、切断唤醒、持剑人 Google 的手段。一、Android 后台管理的根本安卓内存管理方案:Android 沿用了 Linux 的内存管理方案,为低内存回收机制。与开多少就占用多少的 Windows 不同,Android 是你不开应用,也会占用内存。在空载状态下,Android P 占用下限约为 500mb (大概,我测试可以正常运行),上限为设备物理内存的 1/2,即开机占用一半内存。而安卓应用不存在关闭一说,退出之后仍然会留在内存中。直至剩余内存过低,才会由系统机制将其杀掉,回收它占用的那部分内存。了解应用状态的分级:- foreground 前台。设备当前运行的应用,你打开什么软件,前台应用就是什么,很容易理解吧。- visible 可见。与前台类似,同样可以显示在屏幕上,让用户看到,以及交互操作,如输入法、浮窗。- secondary 次级。后台运行的服务,通常占用资源不大,但用户很需要其功能,比如各家系统的云服务。- hidden 后台。后台运行的进程,在应用运行时直接按下 home 键,应用仍在运行。如果应用的优化没做好,那么将占用大量资源。- content_provider 内容。与用户关系不大,通常感知不强。- empty 空白。应用已经停止运行,没有进程与服务,只留下一个缓存,确保下一次打开时更迅速。上述六种状态,越往下,重要性越低,越容易被杀掉。Android 后台的杀手 - Low Memory Killer:应用在后台运行,固然可以增加启动速度,或便于推送信息,但内存大小和电池容量都不是无限的。当后台一多,就会拖累性能,降低续航。系统自然不可能坐以待毙,等着内存爆满死机。Android 系统使用了的低内存杀后台机制 LowMemoryKiller,以下简称 lmk。kernel lmk 界面可以看到,lmk 对每个应用状态都有对应数值。当剩余内存大小达到数值时,lmk 就会杀掉对应状态的应用,以释放内存。若杀掉应用,剩余内存仍然不足,便会继续杀掉上一个状态级别的应用,以此类推。一直杀到前台应用,这便会造成正运行的应用或游戏闪退。当然,目前安卓机动辄 4g、8g 内存的时代,能让 lmk 杀到前台的应用应该不存在了吧,除非是出现 bug。应用在后台占用的资源:在固有印象中,安卓后台应用一多,就会十分卡顿。因为应用运行是要消耗硬件资源的,不论前台和后台。可能在 500mb 内存的时代没有那么明显的感知,因为内存太小,应用留不住后台。但从安卓机进入了 1g、2g 内存的时代,这个缺陷就一下子暴露出来了:后台杀不死,杀死后自启动,一个应用拖好几条进程,一条进程又有好几项服务,堪称群魔乱舞。此现象持续了至少六年。那这些应用消耗的是哪些资源呢?看上文的后台分级,这些应用一般属于次级或后台,与前台应用一样运行,会占用 CPU 运算资源,数据操作会占用闪存的读写资源,这两项就足以死死卡住设备,使其无法正常运行。这些资源总量是一定的,在当时性能普遍不强时,资源用一点就少一点,后台占用大了,前台自然要卡。空载:空负载后台开启百度地图:后台挂百度地图此时已经卡到没法正常运行了,各种动画掉帧。Android 与其他系统后台的区别:对于各个系统的应用,一般可以用两种状态来表示:Android 分为 “运行” 和 “停止”,iOS 分为 “前台” 和 “冻结”,Windows 分为 “启动” 和 “关闭”。解释一下:iOS 的特点是冻结式后台,即应用留后台但不运行,只有前台应用能运行。这样可以做到打开应用时秒开,但退入后台也不消耗资源,只占用内存;Windows 特点是打开哪个应用,哪个应用就运行,点击关闭就停止运行,并清出内存。内存占用也是与后台有关,旧时 Android 日常会占用 50%;iOS 内存在开机不久会爆满,始终居于 95% 以上;而 Windows 则是应用多大,内存占用就多大,没有应用时占用很低。win 空载占用还有一个 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】 ,手动管理应用的各种组件,不但可以关闭广播接收器,也能控制应用的后台服务。有用不到、但却在运行的服务,可以直接停掉。mat如果有 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 文章为作者本人观点,不代表酷安立场
联系我们
在线咨询:
0 评论