本文为稀土掘金技术社区首发签约文章,30天内禁止转载,30天后未获授权禁止转载,侵权必究!
一直以来,Android 系统仅支持 4KB 的内存分页大小,这在一定程度上限制了整体的性能。而随着设备制造商不断打造具有更大物理内存 (RAM) 的设备,这些设备中的许多可能会配置 16 KB(最终更大)的分页大小,作为 Android 系统设计者,是时候考虑是否需要支持 16KB 的设备了。
所以,Google 团队的 Kalesh Singh 和 Juan Yescas 于 2023 年针对 16KB 分页大小的 Android 性能表现进行了详细测试。并发现,在 Pixel 6 和 Pixel 6 Pro 上进行的 Benchmark 显示:
- 内存 page 引发的错误大幅减少
- 系统 boot 加快,缩短了 1.5%,约 0.8s
- App 启动加快,平均节省约 3.16% 的时间。其中部分 App 优化尤为显著,比如:Google Search 节省了 17% 的时间;Google News 更是节省了30% 的时间
- 手机电量消耗平均下降了 4.56%
- 等等
详细的信息见《Android - 16K Page Size Support pdf》论文,充分说明了各项 benchmark 的结果、影响等细节。
最终 Google 决定在 Android 15 上支持 16K 内存分页大小的设备。可是既存的 App 都是以 4KB 内存分页大小进行的编译、部署,想要支持运行在 16KB 上是不行的,所以 Android 官方提供了一些指南进行说明。
笔者以国民 app WeChat
为例,查看是否会受影响、是否真得受到了影响、以及如何处理。
1. 如何判断 App 是否会受到影响?
如果 App 使用了任何原生代码,则无关 App 的 target SDK version,必然会受影响。反之,如果仅使用以 Java 编程语言或 Kotlin 编写的代码(包括所有 LIB / SDK),那么该 App 已经支持 16 KB 设备,不用额外适配。如果不确定自己的 App 是否使用了原生代码、或者引用的 LIB / SDK 是否使用了原生代码,则可以使用 AS 自带的 APK Analyzer
进行识别。
话说回来,即便可以肯定自己的 App 没有使用到原生代码,为防止以外造成的回退,仍然推荐在时间富余的情况在 16KB 的环境中运行和测试一番。
是否使用了原生代码?
App 符合以下任一情况,则会使用原生代码:
- 使用任何 C/C++(原生)代码。如果 App 使用 Android NDK,那么该 App 将使用原生代码
- 会与使用它们的任何第三方原生库或依赖项相关联
- 由使用设备上的原生库的第三方 App 构建器构建
使用 APK 分析器识别原生库
我们从网上下载 Wechat 的 apk 包,直接拖入 AS,会自动使用 APK Analyzer 工具进行分析(当然也可以按照路径逐步打开:File -> Open -> xxx.apk)
打开识别到的 lib 目录,可以看到一堆 so 文件,毫无悬念肯定使用到了原生代码。
2. 直接测试 app 是否受到影响?
正如前面章节提到的,如果 App 使用到了原生代码,一定要在 Android 15 16KB 内存分页的设备上进行测试,以查看 App 是否出现任何回归问题。
对于仍然在开发中的 Android 15 来说,官方提供了多个方式以供验证:
- 使用基于 16-KB 的 Android 15 系统映像设置 Android 模拟器
- 使用页面大小为 16KB 的编译 Cuttlefish 镜像:氛围 ARM64 和 x86-64 版本:
我们采用比较简单、易用的模拟器方式进行验证,首先得部署该环境。
部署基于 16 KB 的 Android 15 模拟器
重要提示: 由于 Android 15 Beta 2 中的已知问题,使用 LLDB 进行调试目前尚不支持 16 KB 模拟器系统映像。
可以按以下步骤操作:
-
基于 16 KB 的 Android 15 模拟器系统映像与 Android Studio Jellyfish | 2023.3.1 或更高版本兼容。不过,为了在使用 Android 15 Beta 版时获得最佳体验,请下载