16 KB 内存页面大小的支持,是Google Play 新提出的要求。要在2026年5月31日之前,满足这一条件:
Android 15 的 16KB page 检测主要看三件事:
- PT_LOAD >= 16 KB
- RELRO 必须在 segment 末尾(suffix)
- RELRO end 必须 16KB 对齐
对于aab 来说,上面的三个要求,一般只用关注PT_LOAD。因为aab 有压缩率,所以关于压缩的两项检验直接计算是不准确的。Google Play 在分发时会自动处理。
官方文档:
https://developer.android.com/guide/practices/page-sizes?utm_source=chatgpt.com&hl=zh-cn
检测方式
关于so 文件是否合规的检测,主要有以下几种方法:
方法一
可以解压出so文件,然后使用ndk 工具检测(一定使用PowerShell,cmd无法运行):
1 | llvm-objdump.exe -p E:\Test\so\arm64-v8a\libanogs.so | Select-String -Pattern "LOAD" |
运行结果可以看LOAD off 类型行尾是不是带有212、213。
低于2**14的so文件都不符合。
工具的路径在:
1 | {YourNDKPath}\toolchains\llvm\prebuilt\windows-x86_64\bin |
但是这里只检查了PT_LOAD。
方法二
Google 官方提供了检测工具:
可以直接使用这个脚本进行检测。
1 | check_elf_alignment.sh APK_NAME.apk |
方法三
最后,如果将Android Studio 更到最新版本,即可使用Apk Analyze 功能进行检测。
前者报错为:1
4 KB LOAD section alignment, but 16 KB is required
后者报错为:1
RELRO is not a suffix and its end is not 16 KB aligned
适配方法
Unity 相关so
Unity相关的so,需要通过提升Unity 编辑器版本号的方式进行解决。
第三方SDK
第三方SDK 相关的so,需要联系相关提供商进行SDK 升级。
如果无法完成合规,应该考虑取消对该插件的接入。
自己编译的so
如果是自己使用NDK 编译的so,需要升级NDK工具并在编译中指定相关参数。
1 | ({NDK Path}/ndk-build ^ |
对于Android.mk 文件和Application.mk 文件也有内容需要修改:
如果旧内容涉及cmd-strip,在打包时会报错。这是因为NDK r23+中,strip 工具路径变成 LLVM 版本。最简单的解决方式是删掉这一行,新版本不需要手动调用strip,会自动调用。
如果文件中存在:APP_STL := gnustl_static,也需要进行修改。
修改为:APP_STL := c++_static
为了兼容RELRO 必须在 segment 末尾(suffix)和 RELRO end 必须 16KB 对齐,需要在Android.mk 中增加:
1 | LOCAL_LDFLAGS += -Wl,-z,max-page-size=16384 |
最后,在旧的代码中,如果使用了PAGE_SIZE / PAGE_MASK 宏,这会报错,在新版本中,NDK 不再提供。
需要增加以下内容:
1 | #ifndef PAGE_SIZE |
3. il2cpp处理方式
升级到新版Unity之后,如果不修改代码,可能不会让C++代码重新导出。
也可以删除Library目录下的Bee目录和所有的il2cpp_*目录的缓存,强制生成。