16 KB 内存页面大小的支持,是Google Play 新提出的要求。要在2026年5月31日之前,满足这一条件:

https://play.google.com/console/u/0/developers/9060101706093336387/app/4974577679306649072/policy-center/issues/4988764664083295045/details

Android 15 的 16KB page 检测主要看三件事:

  1. PT_LOAD >= 16 KB
  2. RELRO 必须在 segment 末尾(suffix)
  3. 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 官方提供了检测工具:

https://cs.android.com/android/platform/superproject/main/+/main:system/extras/tools/check_elf_alignment.sh?hl=zh-cn

可以直接使用这个脚本进行检测。

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
2
3
4
5
6
7
({NDK Path}/ndk-build ^
NDK_PROJECT_PATH=. ^
APP_BUILD_SCRIPT=Android.mk ^
NDK_APPLICATION_MK=Application.mk ^
APP_ABI="armeabi-v7a x86 arm64-v8a x86_64" ^
APP_LDFLAGS="-Wl,-z,max-page-size=16384 -Wl,-z,common-page-size=16384" ^ // 新增
|| pause) && pause

对于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
2
LOCAL_LDFLAGS += -Wl,-z,max-page-size=16384
LOCAL_LDFLAGS += -Wl,-z,common-page-size=16384

最后,在旧的代码中,如果使用了PAGE_SIZE / PAGE_MASK 宏,这会报错,在新版本中,NDK 不再提供。
需要增加以下内容:

1
2
3
4
5
6
7
#ifndef PAGE_SIZE
#define PAGE_SIZE 4096
#endif

#ifndef PAGE_MASK
#define PAGE_MASK (~(PAGE_SIZE - 1))
#endif

3. il2cpp处理方式

升级到新版Unity之后,如果不修改代码,可能不会让C++代码重新导出。

也可以删除Library目录下的Bee目录和所有的il2cpp_*目录的缓存,强制生成。