为什么 Android 手机越用越卡?从底层讲清楚
这个问题被问了十几年了。从 Android 2.3 到 Android 15,每一代都说"这版不卡了",但用半年之后——还是卡。
不是玄学,不是心理作用,是 Android 的底层设计决定了这件事。
先搞清楚"卡"到底是什么
技术上说的"卡顿",就是帧率不稳。你滑动屏幕,系统要在 16 毫秒内画出一帧画面(60fps = 1000ms ÷ 60 ≈ 16.7ms)。如果某帧花了 30ms 才画出来——你就感觉到"掉帧"了。连续掉帧就是"卡"。
那什么会导致一帧画不出来?往下拆。
原因一:Android 的内存管理机制
Android 的核心理念是"内存不用白不用"。
你打开一个 App,系统把它加载到内存里。你切换到另一个 App,前一个 App 不是立刻被清掉——被保留在后台缓存中。等你再切回来,它秒开。
这个设计的好处是切换快,坏处是后台 App 一直在吃内存。
当你开了微信、抖音、淘宝、支付宝、浏览器——每个都在后台占着几百 MB。可用内存越来越少。当你再打开一个新 App——系统开始杀后台进程(Low Memory Killer),这个过程本身就消耗 CPU 和 I/O 资源。
你体验到的就是:打开新 App 要等几秒,切换 App 动画卡住,键盘弹不出来。
原因二:GC(垃圾回收)的周期性卡顿
Android 上跑的大部分是 Java/Kotlin 代码,跑在 ART(Android Runtime)虚拟机上。虚拟机有垃圾回收机制——自动清理不再使用的内存对象。
这个 GC 过程在干什么:扫描整个堆内存 → 标记活着的对象 → 回收死掉的对象 → 压缩碎片化的内存空间。
整个过程里你的 App 是暂停的。这就是所谓的 “Stop-The-World” 暂停。
早期的 Android(Dalvik 虚拟机时代)GC 能卡几百毫秒——直接表现为界面冻结。现在的 ART 做了很多优化——并发 GC、分代回收——但完全消除是不可能的。尤其是你 App 的内存占用越大,GC 扫描的范围越大,暂停时间越长。
原因三:存储性能退化
这可能是影响最大的因素,但很多人没意识到。
手机用的 NAND 闪存有个特性:写入次数越多,性能越差。
你每天刷微信、看抖音、收消息——每一个操作都在往闪存里写数据。一年下来,闪存被写了几千次、上万次。闪存的写入放大效应(Write Amplification)会让实际写入量远大于你的数据量——因为闪存必须先擦除再写入,而擦除的单位(Block)比写入的单位(Page)大得多。
结果就是:用了两年的手机,闪存的随机读写速度可能只有新机的一半。
而 Android 大量依赖 SQLite 数据库——微信的聊天记录、通讯录、通话记录、设置——全是 SQLite。SQLite 的小文件随机读写恰好在退化后的闪存上表现最差。
这就是为什么同样恢复出厂设置,两年的手机就是比新机卡——硬件老化了,恢复出厂也救不回来。
原因四:后台任务的无限叠加
国内 Android 生态有个独特的问题:App 的后台保活竞争。
微信要常驻后台收消息,支付宝要保活为了支付 SDK,淘宝要保活为了推送,百度地图要保活为了定位服务。每个 App 都恨不得 24 小时跑在后台。
但 Android 系统会杀后台进程。于是 App 们各显神通:
- 双进程守护:两个进程互相监控,A 被杀了 B 把 A 拉起来,B 被杀了 A 把 B 拉起来
- 前台服务通知:注册一个前台服务(在通知栏显示"XX 正在运行"),降低被杀的概率
- 系统广播唤醒:监听开机广播、网络变化广播、电量变化广播——任何一个事件都能把 App 从死亡中唤醒
- 关联启动:你打开淘宝,支付宝和闲鱼也被拉起来了。你打开一个 App,后台多了三个
这些"保活"手段叠加起来的结果:你以为你只开了微信,实际上后台跑着十几个进程。CPU 被分片,内存被瓜分,闪存被持续读写。
原因五:热量的恶性循环
手机发热不只是烫手的问题。热量导致 CPU 降频。
当 SoC 温度超过阈值(通常在 45°C-50°C),系统会限制 CPU 的最高频率。本来能跑 2.8GHz 的大核被降到 1.5GHz。计算能力腰斩,帧率自然掉。
最讽刺的是:越卡就越用力(加大 CPU 负载),越用力就越热,越热就越降频,越降频就越卡。 这是一个经典的恶性循环。
夏天 + 充电 + 重度使用 = 三重叠加,这时候卡是物理定律决定的,不是系统优化能解决的。
原因六:应用自身的膨胀
微信从 2015 年的几十 MB 膨胀到现在的几十 GB。不是安装包大小——是你的聊天记录、朋友圈缓存、小程序缓存、视频缓存。
这个膨胀带来的问题是:打开微信的时候,它要加载的 SQLite 数据库比以前大了几十倍。GC 扫描的内存对象比以前多了几十倍。这些额外的计算量都转化成你的等待时间。
而且 App 开发商没有动力去优化这些——新功能是 KPI,性能优化不是。更何况微信这个体量,你不满意也得用。
iOS 为什么相对不卡
简单对比一下就清楚了:
| 问题 | Android | iOS |
|---|---|---|
| 后台管理 | App 互相竞争,各显神通保活 | 统一由系统管理,墓碑机制严格 |
| GC 暂停 | ART 虚拟机的 GC 不可避免 | Swift/ObjC 使用 ARC(自动引用计数),无全局暂停 |
| 碎片化 | 几千种设备,无法针对性优化 | 只有十几款设备,每款都有针对性优化 |
| 应用审核 | 应用商店审核松,后台服务随意注册 | 审核严格,后台权限受限 |
| 闪存质量 | 各厂商用料不一,中低端机闪存寿命短 | 统一使用高质量 NAND,写入寿命更长 |
不是 iOS 更"神",是它用封闭换来了可控。Android 用开放换来了自由,代价就是不可控。
你能做什么
坦白说,完全杜绝卡顿是不可能的。但能缓解:
- 买旗舰机。 UFS 4.0 闪存的性能和寿命比 eMMC 好得多。中低端机用一两年就卡的根源往往是闪存质量差。
- 定期清理微信。 微信设置 → 通用 → 存储空间 → 清理缓存。这条最管用。
- 少装"全家桶"。 一个公司旗下的 App 通常会互相唤醒。你不需要支付宝就别装,不用百度地图就别让它常驻。
- 恢复出厂设置有短期效果。 闪存被 Trim 之后能暂时恢复部分性能,但硬件写入磨损是不可逆的。
- 开发者选项 → 限制后台进程。 可以设置最多保留 4 个后台进程,减少资源争抢。
最后
Android 越用越卡不是某个版本的 Bug,也不是厂商负优化——是开放生态 + 虚拟机语言 + 闪存物理特性三个因素共同导致的结果。
你买 Android 的时候享受了自由——随便装 App、随便改系统、开放的文件管理。这些自由的代价就是系统层面没法做到 iOS 那样的严格控制。
理解了这件事,你应该能更坦然地面对手机两年后的卡顿——这不是手机坏了,是它承载了太多东西。