夜雨聆风学习资料网

ARTICLE · 1305012

16G 安卓旗舰,依然养不起后台的流氓

16G 安卓旗舰,依然养不起后台的流氓
只要聊到安卓手机杀后台,很多人的第一反应都是:内存不够。

那就加。从早年的 2GB、4GB,一路堆到 8GB、12GB,再到今天旗舰机常见的 16GB、24GB。

可手机用起来总有点不对劲。拿一台 16GB 内存的安卓旗舰,刚开机,系统页面上还显示着接近 6GB 可用内存。微信、美团、哔哩哔哩都挂在后台,打开一个大型手游玩十分钟,再切出来,微信重新加载了。

进设置看一眼,内存页面上还挂着“可用 5.8GB”。

既然还有几 GB 空闲内存,为什么后台还是被清了?

现代安卓杀后台,很多时候不是因为 DRAM 塞满了。系统更怕后台进程耗电、发热、把前台帧率拖下去。

技术文章常拿 DRAM,也就是物理内存,类比成仓库。16GB 的仓库装了 10GB,剩下 6GB 空着,理论上放着也没什么成本。

从存储数据这个角度看,没错。LPDDR5X 的自刷新功耗并不高,内存里留着数据,耗电远没有屏幕点亮、CPU 跑满、蜂窝网络上传下载那么夸张。问题不在于那些页面还占着多少字节,而在于一个没死的 App 并不会老实躺在内存里当标本。

它可能挂着定时任务,隔几十秒醒来检查一次状态;可能持续监听定位、蓝牙、计步器;可能被别的 App 通过广播或 Binder 顺手拉起来;也可能还有埋点、同步、广告、日志上传之类的后台线程没停。用户看见的是后台卡片,系统看见的是一群随时准备碰 CPU、网络和传感器的进程。

手机 SoC 的省电不是靠“少跑一点”完成的。屏幕熄灭、前台没有重负载时,处理器希望尽可能长时间停在低功耗状态,核心降频、关停,整机进入深睡眠。真正省电的是少唤醒,最好一觉睡到底。

后台 App 每弹出一个 Timer 任务,哪怕只跑几毫秒,系统都可能需要退出深度休眠、拉起合适的 CPU 核心和频率、处理任务,再回到低功耗状态。单次没什么,几十个 App 轮着来,睡眠窗口被切得稀碎。

屏幕关着,电量却每小时掉几格,机身还莫名发温。大多不是 DRAM 自刷新在作妖,是后台唤醒、网络活动和 CPU 调度没停。

所以厂商的策略很直接。内存里留着可以,别折腾。你在后台频繁拉 CPU、碰网络、链式启动别的进程,哪怕设备还空着 10GB 内存,策略进程也可能把你停掉。没有商量。

16GB 也不是完整交给 App 的 16GB。

从 Linux 的视角往下看,应用层摸到这块内存前,系统已经先切走了一部分。图形渲染要用,GPU 驱动要用,相机 ISP 和多帧合成也要用。尤其是相机,夜景、人像、HDR 连拍时,连续帧缓冲和计算摄影链路会吃掉不少内存。有些内存统计页写着“可用”,不代表此刻能拿来稳定养住一个任性后台进程。

安卓还大量依赖 ZRAM。

ZRAM 不是传统意义上把内存数据换到闪存里的 Swap,而是在 RAM 中拿出一部分空间,压缩那些暂时不用的匿名页。后台 App 占了 1GB,不代表它会原样躺在物理页里。系统可能把其中一批冷页面压缩进 ZRAM,原来 1GB 的数据压成数百 MB,给前台腾位置。

常规物理内存 (RAM)                 ZRAM 压缩区┌──────────────────────┐         ┌──────────────────────┐│ 前台应用 A (2 GB)      │         │ 后台 App B 数据       │├──────────────────────┤   压缩   │ (原本 1 GB 压缩为      ││ 前台应用 B (3 GB)      │ ──────► │ 300 MB 存放在此)      │├──────────────────────┤          └──────────────────────┘│ 系统预留/显存 (3GB)    │                     │└──────────────────────┘                     │ 重新打开时                                             ▼ 解压                                  CPU 算力飙升 / 瞬间卡顿  

压缩省的是物理页,不是计算。切回一个大量页面已经进 ZRAM 的后台 App,CPU 得解压、恢复页表映射、重新调度线程,缓存也要重新热起来。几个大 App 来回切,系统一边回收页面,一边压缩,一边解压,前台动画和触控响应就会被拖慢。

很多机型宁愿让后台应用重新加载,也不愿让用户在切换动画上看到半秒卡顿。冷启动难看,但容易归咎于 App;桌面、通知栏和手势掉帧,锅会直接落在系统头上。

Android 底层的 LMK,或者说后来的 lmkd,本身没有传说中那么凶。

它会参考进程优先级,为进程设置 oom_score_adj。前台、可见进程、前台服务、桌面、后台进程、缓存进程,分数不一样。内存压力逼近低水位线时,系统优先处理分数更高、可牺牲性更强的进程。

原生 AOSP 的这套路子,16GB 设备没必要频繁杀得满地都是尸体。

把后台搞成大逃杀的,常常是厂商在 AOSP 和 Linux 内核之外额外加的电量、温控和行为管控层。小米的 PowerKeeper、ColorOS 的后台冻结机制、OriginOS 的原子内存,名字不同,思路接近:内存水位只是一个参考,后台进程干了什么更重要。

App A 启动后试图经 Binder 拉起 App B,策略引擎可以直接拦截。B 不在前台,又不在允许范围内,那就不让它起来。微信、QQ、抖音这类高频应用往往能拿到更宽松的后台待遇;一个不知名的小工具,即便只占几十 MB,后台放几分钟也可能被标记成无效驻留,进程被清掉。后台 fork 子进程、消耗 CPU、频繁唤醒,也会让系统更快下手。

Android 12 之后,AOSP 还加入了对 phantom process 的限制。某些后台子进程如果数量过多,或者资源行为超出限制,会被系统杀掉。它主要是为了防止应用借子进程绕开后台限制,但对一些依赖辅助进程、脚本环境或旧式守护逻辑的软件来说,体验并不总是友好。

在这类策略面前,16GB 的意义会被削弱。App 被赶出去时,原因可能和“空间不够”关系不大。它被判断成了高耗电后台、异常拉活来源,或者只是没有进白名单。

也不能把账全算到国内 App 和厂商魔改头上。

安卓的麻烦来自几条路线撞在一起。Linux 进程模型允许应用保留活动能力;Android 的 Java/Kotlin 运行时带来垃圾回收、堆内存和进程生命周期管理的额外复杂度;移动设备又被一块几千毫安时的电池卡着脖子。后台多留一个活进程,就多一份唤醒、网络、计时器和资源竞争的可能。

iOS 走的是另一条更强硬的路。

应用离开前台后,绝大多数情况下会被挂起,后台执行能力被严格限定;推送通知更多依赖 APNs。Objective-C 和 Swift 的 ARC 也让对象生命周期管理的路径更明确,但 iOS 后台体验好,主要不是因为 ARC 有魔法,而是苹果从平台规则上就没给普通应用多少长期后台运行的空间。

Android 早期把更开放的后台能力当作优势。

应用可以跑服务、接广播、做同步、维持连接,开发者有更大的自由度。自由一多,保活手段也跟着膨胀。App 想常驻,系统要续航,厂商还得保住动画和游戏帧率,三边谁都不想退。

于是形成了一个很别扭的循环。

开发者为了不掉线、不漏消息、提高日活,会想办法留住后台进程;系统厂商看到后台被滥用,只能把限制再收紧;用户发现重要 App 被杀,又去买 16GB、24GB 的大内存机型,或者手动给应用加白名单。内存变大了,后台规则没变宽松,应用也没有变老实。

16GB 当然没有白加。

它能让前台游戏留下更多纹理、渲染和缓存空间,也能给相机的多帧计算留出余地。多开十几个应用时,系统不会立刻陷入回收、压缩和重启的混乱。它改善的是前台体验和短时间多任务的缓冲,不是一张“所有后台永久存活”的通行证。

只要手机还靠电池供电,只要 App 还想在后台拉 CPU、做网络请求、保活和互相唤醒,系统深处那个进程杀手就不会收刀。

往日推荐:

为什么 Linux 敢“超卖”内存,Windows 却不敢?

回首页,搜索你想要的文档

在首页搜索框输入关键词,快速定位资料

文库首页搜索指引 立即搜索

相关学习资料