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

时间已定,如开发者不能在2026年5月1日前解决16KB适配问题,将无法更新Google Play平台的应用。

此次16 KB 适配复杂度较高。除自有代码外,凡依赖的三方 SDK 亦需同步完成适配。请务必提前评估并推动相关方排期,确保App在截止日前完成本次适配工作。

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

检查Apk是否受 16KB 影响

您有多种方法可以检测您的Apk是否有16KB问题。

(1) 通过Android Stdio自带的APK 分析器

我们直接拖到AS里即可,在 Alignment 一列会提示有无问题或问题的具体SO,如下图:

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

https://developer.android.google.cn/guide/practices/page-sizes?hl=zh-cn#alignment-use-script 

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

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 {
        useLegacyPackaging = true
      }
  }
}

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

测试

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

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

adb shell getconf PAGE_SIZE

总体来说,16KB 内存适配对于技术来说还是相对简单的,难点在于以下两点:

1. 推动未适配三方SDK适配。

2. 要有源码,如使用了不提供源码的三方开源SDK,要及时找替代方案了!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值