安卓手机APP开发__支持16KB的页面大小
目录
概述
从历史上看,安卓仅支持4 KB大小的内存页面。它已经优化了系统的内存的性能。
从安卓15开始,安卓支持设备配置为使用16KB的页面大小。
随着设备制造商持续地制造大容量的物理内存的设备,这些设备中的许多设备
将要配置为16KB的页面大小,来优化设备的性能。加上对这个配置的支持,
能让你的APP运行在这些新设备上,并且从相关的设备的性能的提升上受益。
为了帮助你实现这一点,我们提供了如何检查你的APP是否被影响,如何重构
你的APP,并且如何测试你的APP在16KB的页面大小上的表现。
得到的利益和性能
设备配置为16KB的页面大小,在平均来看,使用的内存稍微变多了,而且在
系统和APP上都得到了性能的提升。
当系统处于低的内存压力之下时,更低的APP开启时间:平均低了3.16%
在APP启动时,能耗更少了,平均降低4.56%
更多的照相机启动
系统启动更快了
这些提升基于我们的测试,在实际的设备上有差异。我们会提供额外的分析。
检查你的APP是否被影响了
如果你的APP使用了任何的原生的代码,你应该重构代码,来支持16 KB的设备。
如果你不确定是否使用了原生的代码,你能使用APK分析器来检测。
构建你的APP支持16 KB的设备
为了支持16 KB的设备,你的APP使用原生的代码,应该完成如下的步骤:
升级到AGP版本到8.3或者更高
我们推荐使用非压缩的共享库,但如果你没有升级到AGP版本到8.3,那么备选的方案是
使用压缩的共享库。
更新Gradle的配置,来使用压缩的共享库。
Groovy
Kotlin
在你的build.gradle文件中,加上如下的内容:
android {
...
packagingOptions {
jniLibs {
useLegacyPackaging true
}
}
}
使用16 KB ELF对齐,来编译你的APP
16 KB的设备要求共享库的ELF段被合适的对齐,使用16 KB ELF对齐,来确保你的APP
正常地运行。
为了编译你的APP,完成如下的步骤,这依赖于你的安卓的NDK的版本。
重要的内容:如果你的APP使用了任何预构建的共享库,你都必须以相同的方式重编译它们。
然后重新导入16 KB ELF对齐的共享库进入你的APP.
安卓NDK r26及更低
为了支持编译16 KB ELF对齐的共享库,在安卓NDK r26及更低时,你需要更新
你的ndk-build 或者cmake的配置,如下:
ndk-build
CMake
更新你的Android.mk,启用16 KB ELF对齐:
LOCAL_LDFLAGS += "-Wl,-z,max-page-size=16384"
重要的内容:如果你的APP动态地链接到C++标准库(libc++_shared.so)
使用的NDK是r26以及更低的版本,那么推荐更新到r27以及更高的版本。
否则将安装失败。
如果你不能升级到安卓NDK的新的版本,那么你可能要静态地编译C++标准库,
再更新你的APP。
安卓NDK r27及更高
为了支持编译共享库,你需要更新链接标识:
ndk-build
Groovy
Kotlin
其它的构建系统在你的Application.mk文件中加上:
APP_SUPPORT_FLEXIBLE_PAGE_SIZES := true
检查引用了特定的页大小的代码实例
如果你的app是16 KB对齐的,你的app如果在代码中假定了一个设备使用一特定的页大小,
这将遇到程序错误。为了避免这一情况,完成如下的步骤:
移除任何对PAGE_SIZE的常数引用的硬编码依赖,或者是在你的代码逻辑中假定了一个
设备的页大小是4 KB的实例。
使用getpagesize() 或者是 sysconf(_SC_PAGESIZE)来代替。
查找对mmap() 和其它的 API的使用,这些方法需要页对齐的参数,如果需要的话,
用备选方法来替换它。
在一个16 KB环境中测试你的app
你构建了支持16 KB设备的app后,你将要在一个16 KB环境中测试你的app。为了做这一点,
使用如下的测试环境之一:
在ARM64上,使用有16 KB页大小的Cuttlefish
在x86-64上,使用有16 KB页大小的模拟Cuttlefish
使用有16 KB页大小的支持的Flash Pixel 6 和 Pixel 6 pro