一、背景
随着Android设备硬件的不断升级,部分新设备已经开始采用16KB的内存页(Page Size),而不是传统的4KB。内存页大小的变化会影响到应用的兼容性,尤其是一些依赖底层C/C++库、JNI、或自定义内存管理的应用,Google之前有建议开发者关注并适配16KB Page Size,以保证应用在新设备上的稳定运行,最近更是宣布自2025年11月1日起,所有上架Google Play商店的应用都必须支持 16KB Page Size新特性,否则禁止上架(目前国内应用商店暂时还没有看到类似要求,但也无法保证后面不会跟进),如下截图所示:
二、哪些应用会受影响?
如果你的应用有上架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脚本就可以了,具体步骤如下:
- 将
check_elf_alignment.sh
脚本保存到文件中。 - 运行脚本,检查你的apk文件,该脚本会针对所有
arm64-v8a
或者x86_64
共享库输出ALIGNED
或UNALIGNED
检查结果。
check_elf_alignment.sh APK_NAME.apk
如果有任何
arm64-v8a
或x86_64
的共享库是UNALIGNED
,那么您需要更新这些库的打包,并且重新编译应用,直到全部都为ALIGNED
值 。如果你的应用的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 // 专业版和海外版产品