Skip to main content

一、背景

随着Android设备硬件的不断升级,部分新设备已经开始采用16KB的内存页(Page Size),而不是传统的4KB。内存页大小的变化会影响到应用的兼容性,尤其是一些依赖底层C/C++库、JNI、或自定义内存管理的应用,Google之前有建议开发者关注并适配16KB Page Size,以保证应用在新设备上的稳定运行,最近更是宣布自2025年11月1日起,所有上架Google Play商店的应用都必须支持 16KB Page Size新特性,否则禁止上架(目前国内应用商店暂时还没有看到类似要求,但也无法保证后面不会跟进),如下截图所示:

image.png

二、哪些应用会受影响?

如果你的应用有上架Google Play应用商店的需求,并且直接或者间接依赖非系统Native库文件,都应该针对16KB Page Size的特性做一下适配,以免在开启了16KB Page Size特性的手机上面导致崩溃等问题:

  • 使用了Native库(C/C++):如so库未正确对齐或假设页内存大小为4KB的,可能导致崩溃或异常。
  • 依赖第三方Native库:如FFmpeg、OpenSSL等,若未适配16KB页,可能存在兼容性问题。
  • 自定义内存分配或管理:如直接操作mmap、munmap、mprotect等系统调用,并且假设PageSize为4KB的,可能导致功能不正常或者崩溃。

16KB Page Size特性的适配主要分为两部分,第一是要保证你的so文件的segment都是16KB对齐的,第二部分是检查你的Native代码,是否有获取当前页内存大小或者硬编码页内存大小为4096字节的相关逻辑,如果有,那么都建议修改成通过 getpagesize() 或者 sysconf(_SC_PAGESIZE)来获取页内存大小。

检查一个so文件的segment是否是16kb对齐,Google的这个文章有提供好几种方法,这里推荐 check_elf_alignment.sh 脚本的方式,操作比较简单,运行shell脚本就可以了,具体步骤如下:

  1. check_elf_alignment.sh 脚本保存到文件中。
  2. 运行脚本,检查你的apk文件,该脚本会针对所有 arm64-v8a 或者 x86_64 共享库输出 ALIGNEDUNALIGNED检查结果。
check_elf_alignment.sh APK_NAME.apk
  1. 如果有任何 arm64-v8ax86_64 的共享库是 UNALIGNED,那么您需要更新这些库的打包,并且重新编译应用,直到全部都为ALIGNED值 。

  2. 如果你的应用的so文件是动态下发的,也得要保证这部分so的segment也是16kb对齐的。

关于如何重新编译so库,可以针对你们项目目前的AGP版本和NDK版本来做不同的适配,具体可参考 Google文档

三、选择正确的Bugly版本

Bugly在4.4.6.2之后的版本已经适配16KB这个新特性,为了不影响您应用上架Google Paly应用商店,请及时更新Bugly对应的版本,另外因为有些业务暂时不需要适配16KB的特性,所以在4.4.6.2之后,Bugly会同时提供两个版本,一个支持16KB Page Size,一个不支持,以接入4.4.6.2版本为例:

不需要适配16KB PageSize的业务,例如国内应用商店上架的,接入方式与之前一样,没有变化,根据自己的需要选择对应的版本:

implementation "com.tencent.bugly:bugly-pro:4.4.6.2  // 专业版和海外版产品

而需要适配16KB PageSize的业务,例如有上架Google Play应用商店的需求的,需要接入groupid为com.tencent.bugly_16kb 的版本:

implementation "com.tencent.bugly_16kb:bugly-pro:4.4.6.2 // 专业版和海外版产品