时间已定,如开发者不能在2026年5月1日前解决16KB适配问题,将无法更新Google Play平台的应用。
此次16 KB 适配复杂度较高。除自有代码外,凡依赖的三方 SDK 亦需同步完成适配。请务必提前评估并推动相关方排期,确保App在截止日前完成本次适配工作。


为什么要做16KB内存适配
随着设备制造商不断制造出具有更大物理内存 (RAM) 的设备,许多此类设备将采用 16 KB(最终甚至更大)的页面大小来优化设备性能。从Android 15 起,系统可选择 16 KB 内存页;所以只要应用(含 NDK/SO)未按 16 KB 对齐重新编译,就无法在未来 16 KB 设备上启动。
但此举也有很多好处,配置为使用 16 KB 页面大小的设备平均会使用略多一些的内存,但系统和应用的性能也会得到各种提升,例如:
- 缩短了应用启动时间:平均降低了 3.16%;对于我们测试的某些应用而言,改进幅度更大(最高可达 30%)
- 应用启动期间的功耗降低:平均降低了 4.56%
- 相机启动更快:热启动速度平均提高了 4.48%,冷启动速度平均提高了 6.60%
- 缩短了系统启动时间:平均缩短了 8%(约 950 毫秒)

检查Apk是否受 16KB 影响
您有多种方法可以检测您的Apk是否有16KB问题。
(1) 通过Android Stdio自带的APK 分析器
我们直接拖到AS里即可,在 Alignment 一列会提示有无问题或问题的具体SO,如下图:

(2) 通过 check_elf_alignment.sh xxx.apk 脚本命令检查脚本下载地址:
https://developer.android.google.cn/guide/practices/page-sizes?hl=zh-cn#alignment-use-script
检查输出行,确保负载段的值不小于 2**14。如果任何加载段的值为 2**13、2**12 或更低,您需要更新这些库的封装以适配16KB,如下图(需要适配):


16KB内存适配解决方案
(1) 更新共享库的打包方式
Google会建议我们使用AGP 8.5.1 或更高版本,因为此版本默认与 16 KB 兼容。
如果您因为某些原因无法短时间升级到AGP 8.5.1 或更高版本,则对代码进行一些改动,如下:Groovy 需要在build.gradle文件按照下方进行修改
android {
...
packagingOptions {
jniLibs {
useLegacyPackaging true
}
}
}
Kotlin 需要在build.gradle.kts文件按照下方进行修改
android {
...
packagingOptions {
jniLibs {
useLegacyPackaging = true
}
}
}
(2) 使用 16 KB ELF 对齐方式编译应用16 KB 设备要求共享库的 ELF 段使用 16 KB ELF 对齐方式正确对齐,以便您的应用能够运行。- NDK版本为28 及更高版本NDK 版本 r28 及更高版本默认编译为 16 KB 对齐。- NDK r27ndk-build 需要在Application.mk文件中添加如下信息:
APP_SUPPORT_FLEXIBLE_PAGE_SIZES := true
Groovy 需要在build.gradle文件按照下方进行修改
android {
...
defaultConfig {
...
// This block is different from the one you use to link Gradle
// to your CMake or ndk-build script.
externalNativeBuild {
// For ndk-build, instead use the ndkBuild block.
cmake {
// Passes optional arguments to CMake.
arguments "-DANDROID_SUPPORT_FLEXIBLE_PAGE_SIZES=ON"
}
}
}
}
Kotlin 需要在build.gradle.kts文件按照下方进行修改
android {
...
defaultConfig {
...
// This block is different from the one you use to link Gradle
// to your CMake or ndk-build script.
externalNativeBuild {
// For ndk-build, instead use the ndkBuild block.
cmake {
// Passes optional arguments to CMake.
arguments += listOf("-DANDROID_SUPPORT_FLEXIBLE_PAGE_SIZES=ON")
}
}
}
}
- Android NDK r26 及更低版本ndk-build 需要在Application.mk文件中添加如下信息
LOCAL_LDFLAGS += "-Wl,-z,max-page-size=16384"
Cmake 更新 CMakeLists.txt 以启用 16 KB ELF 对齐
//cmake 版本 3.13 之前
target_link_libraries(${CMAKE_PROJECT_NAME} PRIVATE "-Wl,-z,max-page-size=16384")
//cmake 版本 3.13 之后
target_link_options(${CMAKE_PROJECT_NAME} PRIVATE "-Wl,-z,max-page-size=16384")
注意:在改动NDK代码时,一定还要全局搜一下4096,如果您在如果代码在 mmap / sysconf 写死了 4096(0x1000) ,要调整一下这部分代码,例如通过getpagesize()方法。
关于三方SDK现在很多大厂已经开始适配或已经适配完成了,大家可以关注下三方SDK的更新历史,确定下哪个版本开始适配16KB内存了。如果我们用的SDK还未适配,可以提前沟通其有无适配计划或提前准备一下备用方案,避免对自身业务产生影响。

测试
目前,我想我们大部分人都是没有支持 16KB 的设备的,所以大家可以用模拟器先来测试。

当设置好模拟器后,大家可以通过如下命令来验证启动的模拟器是不是 16KB 的环境,如输出 16384 则无问题。
adb shell getconf PAGE_SIZE

总体来说,16KB 内存适配对于技术来说还是相对简单的,难点在于以下两点:
1. 推动未适配三方SDK适配。
2. 要有源码,如使用了不提供源码的三方开源SDK,要及时找替代方案了!
683

被折叠的 条评论
为什么被折叠?



