本文基于笔者使用安卓设备的经验而来,如有理论错误请指正。

# 为什么要优化

大学的时候,刷完 AOSP 会装一堆 Magisk 模块、XPosed 插件。现在养老了,懒得折腾了,只要不影响到我的体验。不过最近的体验确实不太好,表现在 12 GB 内存都不够用、杀后台、卡顿;另外手机发热、耗电很严重,几乎一天 24 小时都在发热,晚上不接电源睡一觉也能掉 80% 的电,平时的续航也只有三到六个小时。由于现在用的系统是 Unofficial 的,维护者似乎也没有更新,就别想等 OTA 修复了。

虽然有句话是换手机解决 100% 问题,但是现在的这些毛病属于是优化不好也能凑合着用(罗永浩举牌:又不是不能用.jpg),不值得专门买一个新手机。也尝试过逐渐迁移到 iOS,但是侧滑返回不是系统级、也没有震动反馈这点,让我连夜回到了 AOSP。还是尝试优化一下吧。

下面大部分的性能(CPU、内存)监控和调校都是基于 Scene (opens new window) 6 的,这款软件确实是可以说是安卓上的神器了。不想使用 Scene 的话,top 等工具也能用,不过没有那么直观就是了。

# 优化内存使用

Android 上现在有两种扩大内存的方法:一种是 zRAM (opens new window)、另一种是 Swap(国内厂商说的扩展内存、Windows 上的虚拟内存)。ZRAM 是将内存中的数据压缩后存储,这样可以减少内存的使用,提高内存的利用率。Swap 是将内存中的数据存储到磁盘上,这样可以扩大内存的容量,但是速度会慢很多。

由于两种方法的原理不同,它们的性能和效果有一些差异。zRAM 是把一部分内存压缩后再放到内存,它的速度是 CPU 进行压缩和解压的速度,节省的内存大小和压缩比有关。我的手机上的 zRAM 默认使用 lz4,压缩比在 33% 左右,如果我设置 zRAM 大小为 6 GB,这 6GB 内容压缩后约为 2GB,所以我可以多出 4GB 的内存。Swap 的速度是磁盘的读写速度,它多出来的空间和分配的磁盘大小有关(理论上可以无限大,但是硬盘读写一般比内存慢一到两个数量级,所以 Swap 太大能减少杀后台,但是系统会很卡),一般设置为内存的 1/4~1/2(12 GB 的话可以设置为 3-6 GB)。


在安卓上测 lz4 的压缩速度,可以在 termux (opens new window) 终端里安装 lz4,然后跑 lz4 自带的 benchmark:

~ $ pkg i lz4
~ $ lz4 -b1
-Synthetic 50%     :  10000000 ->   5859357 (1.707), 811.9 MB/s ,4280.8 MB/s
~ $ lz4 -b2
-Synthetic 50%     :  10000000 ->   5859357 (1.707), 886.7 MB/s ,4118.5 MB/s
~ $ lz4 -b3
-Synthetic 50%     :  10000000 ->   4560720 (2.193),  72.8 MB/s ,2539.0 MB/s

这个速度是骁龙 865 单核的性能,比我想想得要好。ZRAM 使用的 lz4 似乎没有指定压缩级别,我猜测用的是 1 或者 2 吧,3 的性能太烂了。


Swap 测速实际上是测 I/O 性能。可以使用 Cross Platform Disk Test (GitHub (opens new window))。

测下来我的小米 10 顺序读写 192/26 MB/s。这个速度太低了,和 app 给的小米 10 参考(顺序读写 962/444 MB/s)差了一个量级多。不知道是因为手机用太久退化了,还是我现在用的类原生(还是 Unofficial 的)优化太差的问题。总之我这部手机用 zRAM 比 Swap 好多了。


经过上面简单的性能测试,确认了使用 zRAM 的方法。zRAM 大小推荐设置为物理内存的 30%-50%,我设置为了 12GB 的 50%,也就是 6GB。Swap 设置为 0。

使用了两周(4.7)以后,没有再出现过杀后台,很流畅,体验还不错,内存最高占用 75%/12GB,此时 zRAM 占用 81%/6GB。看来米 10 还能钉两年。

# 省电、降频

# 各种配置和模块:系统省电模式、Scene 省电模式、深度 Doze 模块

手机发热、耗电,我第一反应是内核温控比较激进,应该尝试降频。

第一个方案是系统内置的降频,也就是省电模式。一天 24 小时开着省电模式,手机确实从烫变成温了。第二个方案是 Scene 里的温控,可以选择省电/平衡/性能/极速模式,选择省电模式也许可以降降频率。第三个方案是深度 Doze 模块(作者似乎删库了,现在只有酷安能下载),需要 Magisk,可以在手机需要休眠的时候(比如睡觉的时候)进入深度休眠,晚上确实省电多了。

# Debug:解决 Google Play Service CPU 占用

由于 Scene 里有监控各个 app 使用 CPU 的情况(top 命令行应该也可以看,就是没那么直观),这两天观察到我手机上 Google Play Service 一直占用了 1 个核的 100%。

Scene 上也能进一步查看各个线程的 CPU 使用率,发现是 .INSTALL_UPDATE 这个线程占用了 100% 的 CPU。基于这个信息谷歌了一下,搜到 XDA 上有人同样的现象 (opens new window),用一条命令解决了。有作业抄就是好:

pm disable com.google.android.gms/.chimera.GmsIntentOperationService