237天后您将彻底无法在Google Play 更新 App!快速适配Android 16KB PageSize 教程指南来啦。

499 阅读5分钟

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

Image

Image

为什么要做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 毫秒)

Image

检查Apk是否受 16KB 影响

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

Image

(2) 通过 check_elf_alignment.sh  xxx.apk 脚本命令检查脚本下载地址:

developer.android.google.cn/guide/pract…

检查输出行,确保负载段的值不小于 2 ** 14。如果任何加载段的值为 2 ** 13、2 ** 12 或更低,您需要更新这些库的封装以适配16KB,如下图(需要适配):

Image

Image

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 
            {        
                useLegacyPackagingtrue      
            }  
         }
}

(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还未适配,可以提前沟通其有无适配计划或提前准备一下备用方案,避免对自身业务产生影响。

Image

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

Image

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

adb shell getconf PAGE_SIZE

Image

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

App出海交流

经常分享Google Play,App Store市场政策解决方案,大家共同深入了解应用市场App上架、下架背后的原因,如政策违规、安全漏洞、版权问题、市场策略调整等,确保海外App合规、安全并提升我们的用户体验。也不限于分享其他App出海快讯,一起见证行业的蓬勃发展。

欢迎讨论出海的任何问题!想进群的可以点击这里,或者关注公众号趣浪出海