unzip APK_NAME .apk -d /tmp/my_apk_out
Windows (PowerShell) Expand-Archive -Path .\APK_NAME .apk -DestinationPath ~\tmp\my_apk_out
在您提取 APK 文件的临时目录中,检查 lib 目录的内容,看看是否有共享对象 (.so) 文件。这些是您在使用 APK 分析器识别原生库 时看到的相同共享对象文件。对每个共享对象文件运行以下命令:
Linux 或 macOS SDK_ROOT_LOCATION /Android/sdk/ndk/NDK_VERSION /toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-objdump -p SHARED_OBJECT_FILE .so | grep LOAD
Windows (PowerShell) SDK_ROOT_LOCATION \Android\sdk\ndk\NDK_VERSION \toolchains\llvm\prebuilt\windows-x86_64\bin\llvm-objdump.exe -p SHARED_OBJECT_FILE .so | Select-String -Pattern "LOAD"
其中,SDK_ROOT_LOCATION 是您安装 Android SDK 的目录的路径,SHARED_OBJECT_FILE 是您要检查的共享对象文件的名称,NDK_VERSION 是您已安装的 Android NDK 的版本(例如 28.0.12433566)。对于您检查的每个文件,输出将类似于以下内容:
LOAD off 0x0000000000000000 vaddr 0x0000000000000000 paddr 0x0000000000000000 align 2**14
LOAD off 0x0000000000042a90 vaddr 0x0000000000043a90 paddr 0x0000000000043a90 align 2**14
LOAD off 0x0000000000046230 vaddr 0x0000000000048230 paddr 0x0000000000048230 align 2**14
检查输出行,确保负载段的值不小于 2**14。如果任何加载段的值为 2**13、2**12 或更低,您需要更新这些库的封装 ,然后按照本部分中的步骤重新编译应用 并重新测试。
接下来,对应用的 APK 文件运行 zipalign 命令行工具:
Linux 或 macOS SDK_ROOT_LOCATION /Android/sdk/build-tools/35.0.0/zipalign -v -c -P 16 4 APK_NAME .apk
Windows (PowerShell) SDK_ROOT_LOCATION \Android\sdk\build-tools\35.0.0\zipalign.exe -v -c -P 16 4 APK_NAME .apk
其中,SDK_ROOT_LOCATION 是您安装 Android SDK 的目录的路径,APK_NAME 是您应用的 APK 文件的名称。如果所有共享库都正确对齐,则输出的最后一行会显示“验证成功”。
如果验证失败,则需要重新对齐一些共享库,因此您需要更新这些库的封装 ,然后重新编译应用 ,并按照本部分中的步骤重新测试。
构建支持 16 KB 设备的 Android 应用
如果您的应用使用原生代码,请完成以下各部分中概述的步骤,以确保您的应用支持 16 KB 设备:
更新共享库的封装
使用 16 KB ELF 对齐方式编译应用
修复代码并解决运行时问题
检查 SDK 是否支持 16 KB
提示 : 如果您将工具更新到最新版本(AGP 版本 8.5.1 或更高版本,以及 NDK 版本 r28 或更高版本),并使用 16 KB 兼容的预构建依赖项,那么您的应用默认情况下是 16 KB 兼容的,您可以跳到修复代码和解决运行时问题 的步骤。
更新共享库的打包方式
建议您升级到 AGP 版本 8.5.1 或更高版本,并使用未压缩的共享库。
AGP 版本 8.5.1 或更高版本
对于随附未压缩共享库的应用,16 KB 设备要求这些共享库在 16 KB ZIP 对齐边界上对齐。为此,您需要升级到 Android Gradle 插件 (AGP) 版本 8.5.1 或更高版本。如需详细了解升级流程,请参阅 Android Gradle 插件升级助理 部分。
AGP 版本 8.5 或更低版本
注意 : 在 AGP 版本 8.3 至 8.5 中,应用默认按 16 KB 对齐。不过,bundletool 默认情况下不会对 APK 进行 zipalign。因此,该应用可能看起来可以正常运行,但从 Play 中的 bundle 构建时,它将无法安装。
如果您无法将 AGP 升级到 8.5.1 版或更高版本,则可以改用压缩共享库。更新 Gradle 配置,以便 Gradle 在打包应用时压缩共享库,从而避免因共享库未对齐而导致的应用安装问题。
Groovy 在 build.gradle 文件中,添加以下选项:
android {
packagingOptions {
jniLibs {
useLegacyPackaging true
Kotlin 在 build.gradle.kts 文件中,添加以下选项:
android {
packagingOptions {
jniLibs {
useLegacyPackaging = true
警告 : 使用压缩的共享库时,应用在安装后会占用更多空间,因为系统会从 APK 中提取库并将其复制到磁盘上。由于磁盘使用量增加意味着设备上的空间减少,因此您的应用可能更频繁地无法安装。为避免此问题,请升级到 AGP 版本 8.5.1 或更高版本。
使用 16 KB ELF 对齐方式编译应用
16 KB 设备要求共享库的 ELF 段使用 16 KB ELF 对齐方式正确对齐,以便您的应用能够运行。
对于游戏开发者,如果您的游戏基于 Unity 游戏引擎 运行,请参阅 Unity 指南 。如果您的游戏基于 Unreal 游戏引擎 运行,请参阅 Unreal 指南 。对于原生游戏引擎,请继续阅读本指南。
注意 : 如果您的应用未将原生库提取到文件系统(extractNativeLibs 设置为 false),那么在使用 16 KB ELF 对齐方式编译后,您可能会发现应用的二进制文件大小略有增加。Android 15 中对软件包管理器的优化抵消了这种增加带来的运行时开销。
如需使用 16 KB ELF 对齐方式编译应用,请根据您使用的 Android NDK 版本完成以下部分中的步骤。
重要提示 : 如果您的应用使用任何预构建的共享库 ,您还必须以相同的方式重新编译这些库,并将 16 KB 对齐的库重新导入到您的应用中。
Android NDK r28 及更高版本
NDK 版本 r28 及更高版本默认编译为 16 KB 对齐。
Android NDK r27
为了支持使用 Android NDK 版本 r27 及更高版本编译 16 KB 对齐的共享库,您需要按如下方式更新 ndk-build、build.gradle、build.gradle.kts 或链接器标志:
ndk-build 在 Application.mk 中:
APP_SUPPORT_FLEXIBLE_PAGE_SIZES := true
Groovy 在 build.gradle 文件中,设置实参 -DANDROID_SUPPORT_FLEXIBLE_PAGE_SIZES=ON:
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 文件中,设置实参 -DANDROID_SUPPORT_FLEXIBLE_PAGE_SIZES=ON:
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" )
其他构建系统 指定以下链接器标志:
-Wl,-z,max-page-size=16384
Android NDK r26 及更低版本
请务必更新 NDK。此方法仅应在万不得已时使用,且不保证提供支持。
如需支持使用 Android NDK 版本 r26 或更低版本编译 16 KB 对齐的共享库,您需要按如下方式更新 ndk-build 或 cmake 配置:
ndk-build 更新 Android.mk 以启用 16 KB ELF 对齐:
LOCAL_LDFLAGS += "-Wl,-z,max-page-size=16384"
CMake 更新 CMakeLists.txt 以启用 16 KB ELF 对齐:
target_link_options(${CMAKE_PROJECT_NAME} PRIVATE "-Wl,-z,max-page-size=16384" )
Android NDK r22 及更低版本
请务必更新 NDK。此方法仅应在万不得已时使用,且不保证提供支持。
除了 NDK r26 及更低版本中所述的步骤之外,如果您使用的是 NDK r22 或更低版本,还必须设置 common-page-size=16384。由于 GNU ld 和 LLVM lld 链接器的早期版本存在 bug,因此需要设置 common-page-size=16384。只有当 ELF 也具有 .relro_padding 部分(LLD 18 及更高版本)时,此常见页面大小变通方法才有效。
如需使用 Android NDK 版本 r22 或更低版本编译与 16 KB 兼容的共享库,请按如下方式更新 ndk-build 或 cmake 配置:
ndk-build 更新 Android.mk 以构建兼容 16 KB 的 ELF:
LOCAL_LDFLAGS += "-Wl,-z,max-page-size=16384"
LOCAL_LDFLAGS += "-Wl,-z,common-page-size=16384"
CMake 更新 CMakeLists.txt 以构建兼容 16 KB 的 ELF:
target_link_options(${CMAKE_PROJECT_NAME} PRIVATE "-Wl,-z,max-page-size=16384" )
target_link_options(${CMAKE_PROJECT_NAME} PRIVATE "-Wl,-z,common-page-size=16384" )
重要提示 : 即使您的应用动态链接到 NDK r26 及更低版本中的 C++ 标准库 (libc++_shared.so),其中一些库未按 16 KB 对齐,您仍应在此处更新所有其他库的对齐方式,并且应更新代码以避免依赖于 PAGE_SIZE。为了在 16 KB 设备上测试这些较低版本的 NDK,Android CI 上提供了 LTS NDK 版本 r23 和 r25 的 Canary 版,其中包含 16 KB 对齐的 libc++_shared.so 库。无论如何,建议迁移到 Android NDK r27 或更高版本,以更新到 C++ 标准库的 16 KB ELF 对齐版本。否则,您的应用将无法在 16 KB 设备上安装。 如果您无法迁移到较新的 Android NDK,或许可以将应用更新为将 C++ 标准库静态编译到共享库中。如需详细了解如何静态关联到 C++ 标准库,请参阅 C++ 库支持 部分,并务必阅读重要注意事项 部分。
修复代码并解决运行时问题
即使您的应用已对齐到 16 KB,如果代码中的某些位置假定设备使用了特定的页面大小,您的应用仍可能会遇到错误。为避免这种情况,请完成以下步骤:
移除代码逻辑中引用 PAGE_SIZE 常量或假设设备内存页大小为 4 KB (4096) 的任何硬编码依赖项。
请改用 getpagesize() 或 sysconf(_SC_PAGESIZE) 。
查找 mmap() 的用法以及需要页对齐实参的其他 API,并在必要时替换为替代方案。
在某些情况下,如果您的应用使用 PAGE_SIZE 作为与底层页面大小无关的便捷值,那么在 16 KB 模式下使用时,这不会导致应用崩溃。不过,如果使用 mmap 将此值传递给内核,而不使用 MAP_FIXED,内核仍会使用整个页面,从而浪费一些内存。出于这些原因,在 NDK r27 及更高版本上启用 16 KB 模式时,PAGE_SIZE 是未定义的。
如果您的应用以这种方式使用 PAGE_SIZE,并且从不直接将此值传递给内核,那么请创建一个具有新名称的新变量,以反映它用于其他目的,而不是反映真实的内存页,而不是使用 PAGE_SIZE。
检查 SDK 是否支持 16 KB
许多 SDK 都与 16 KB 页面大小兼容,尤其是当您自行构建这些 SDK 或获取最新的预构建版本时。不过,由于某些 SDK 预构建版本或 SDK 版本与 16 KB 不兼容,您应查看每个 SDK 提供商的网站,以确定哪个版本可与 16 KB 搭配使用。
在 16 KB 环境中测试应用
构建支持 16 KB 设备的 app 后,您需要在 16 KB 环境中测试 app,看看 app 是否出现任何回归问题。为此,请按以下步骤操作:
设置 Android 15 SDK 。
设置以下测试环境之一:
设置 Android 模拟器,使其使用基于 16 KB 的 Android 15 系统映像
在 ARM64 上使用页面大小为 16 KB 的 Cuttlefish
在 x86-64 上模拟页面大小为 16 KB 的 Cuttlefish
使用开发者选项在设备上启用 16 KB 模式
在 16 KB 支持的设备 上使用 Samsung Remote Test Lab
启动测试设备,然后运行以下命令,验证设备是否使用 16 KB 环境:
adb shell getconf PAGE_SIZE
该命令应返回 16384 值。
运行以下 zipalign 命令,验证您的应用是否按 16 KB 边界对齐,其中 APK_NAME 是应用 APK 文件的名称:
zipalign -c -P 16 -v 4 APK_NAME .apk
全面测试您的应用,重点关注可能受到更改引用特定内存页大小的代码实例 影响的任何方面。
使用基于 16 KB 的 Android 15 系统映像设置 Android 模拟器
重要提示 : 存在一个已知问题,会导致无法使用 LLDB 调试 16 KB 模拟器系统映像。NDK r27 RC 1 和 Android Studio Koala Feature Drop | 2024.1.2 Canary 5 中包含针对此问题的修复程序。
如需使用 Android 模拟器设置 16 KB 环境,请按以下步骤操作:
基于 16 KB 的 Android 15 模拟器系统映像与 Android Studio Jellyfish | 2023.3.1 或更高版本兼容。不过,为了在处理 16 KB 设备时获得最佳体验,请使用 Android Studio Ladybug | 2024.2.1 或更高版本。
我们一直在努力开发新功能,因此建议您在有新版本或 latest preview version 可供下载时,考虑下载这些版本。
请注意,您可以保留已安装的现有 Android Studio 版本,因为您可以并行安装多个版本 。
在 Android Studio 中,依次点击 Tools > SDK Manager 。
在 SDK Platforms 标签页中,勾选 Show Package Details ,然后展开 Android VanillaIceCream 或更高版本部分,并根据要创建的虚拟设备选择以下一个或两个模拟器系统映像:
Google APIs Experimental 16 KB Page Size ARM 64 v8a 系统映像
Google APIs 实验性 16 KB 页面大小 Intel x86_64 Atom 系统映像
点击应用 > 确定 ,下载所选的系统映像。
按照步骤设置 Android 15 的虚拟设备 ,并在系统提示选择系统映像时,选择您下载的 16 KB 系统映像。如果系统未自动推荐,您可以在其他映像 标签页中找到 16 KB 的系统映像。
针对某些模拟器版本和系统映像的额外步骤
对于 Android 模拟器版本 35.1.5 到 35.1.20,以及 SDK 管理器中提供的 Android 15.0 16 KB 页面大小系统映像的修订版 4 之前,若要在 x86_64 系统上模拟 16 KB 环境,您还需要完成以下步骤。在版本 35.1.21 之后,以及在 Android 15.0 16 KB 页面大小系统映像的修订版 4 或更高版本中,无需执行这些步骤。
在设备管理器中,点击 16 KB 映像旁边的 3 点状图标,然后点击在磁盘上显示 。
在此文件夹中,找到 config.ini 文件。
将以下行添加到 config.ini 文件中,然后保存更改:
kernel.parameters = androidboot.page_shift=14
如需验证更改,请运行以下命令,该命令应返回 16384:
adb shell getconf PAGE_SIZE
启动模拟器
完成 Android 模拟器和虚拟设备的设置后,从目标设备菜单 或从命令行 启动模拟器。
使用开发者选项在设备上启用 16 KB 模式
切换以 16KB 页面大小启动设备 开发者选项,以在 16 KB 模式下启动设备。
从 Android 15 QPR1 开始,您可以使用某些设备上提供的开发者选项 ,以 16 KB 模式启动设备并执行设备端测试。在使用开发者选项之前,请依次前往设置 > 系统 > 软件更新 ,并应用所有可用的更新。
此开发者选项适用于以下设备:
Pixel 8 和 8 Pro(搭载 Android 15 QPR1 或更高版本)
Pixel 8a(搭载 Android 15 QPR1 或更高版本)
Pixel 9、9 Pro 和 9 Pro XL(搭载 Android 15 QPR2 Beta 2 或更高版本)
16 KB 向后兼容模式
页面大小兼容模式下的警告
当设备运行 16 KB 内核时,16 KB 向后兼容选项可用。在满足以下条件时,软件包管理系统会以 16 KB 向后兼容模式运行应用:
如果应用具有 4 KB LOAD 分段对齐的 ELF 文件(扩展名为 .so)。
如果压缩后的 APK 包含 4 KB ZIP 对齐的未压缩 ELF 文件。
如果软件包管理系统为某应用启用了 16 KB 向后兼容模式,该应用在首次启动时会显示一条警告,表明它正以 16 KB 向后兼容模式运行。
16 KB 向后兼容模式可让部分应用正常运行,但为了实现最佳可靠性和稳定性,应用仍应以 16 KB 对齐。
在应用信息页面上的高级 下,调整以页面大小兼容模式运行应用 这项设置的切换开关,为特定应用启用或停用 16 KB 向后兼容模式。仅当设备以 16 KB 页面大小运行时,这项设置才会显示。
页面大小兼容模式设置
如需强制为设备上的每个应用启用 16 KB 向后兼容,请执行以下操作:
adb shell setprop bionic.linker.16kb.app_compat.enabled true
adb shell setprop pm.16kb.app_compat.disabled false
如需强制为设备上的每个应用停用 16 KB 向后兼容,请执行以下操作:
adb shell setprop bionic.linker.16kb.app_compat.enabled false
adb shell setprop pm.16kb.app_compat.disabled true
将 android:pageSizeCompat 属性设为启用或停用,以在特定应用的 AndroidManifest.xml 中开启或关闭向后兼容模式。设定此属性后,该应用在启动时不会显示向后兼容模式警告。
Google Play 兼容性要求
随着设备制造商为设备配备更多 RAM 以优化性能,许多制造商将采用更大的页面大小(例如 16 KB)。为了迎接这些即将推出的设备,Google Play 推出了一项新的兼容性要求:自 2025 年 11 月 1 日起,提交给 Google Play 且以搭载 Android 15(API 级别 35)及更高版本的设备为目标平台的所有新应用和现有应用更新都必须支持 16 KB 的页面大小。
如需详细了解此兼容性要求,请参阅这篇博文 。
[[["易于理解","easyToUnderstand","thumb-up"],["解决了我的问题","solvedMyProblem","thumb-up"],["其他","otherUp","thumb-up"]],[["没有我需要的信息","missingTheInformationINeed","thumb-down"],["太复杂/步骤太多","tooComplicatedTooManySteps","thumb-down"],["内容需要更新","outOfDate","thumb-down"],["翻译问题","translationIssue","thumb-down"],["示例/代码问题","samplesCodeIssue","thumb-down"],["其他","otherDown","thumb-down"]],["最后更新时间 (UTC):2025-09-17。"],[],[]]