近日,部分 Android 开发者反馈在向 Google Play 上传应用时,遇到了“16 KB page size alignment”警告或错误提示。奇怪的是,这一问题似乎只出现在使用 Android Studio 构建生成的 Android App Bundle(.aab)文件中,而通过 Flutter 的 flutter build appbundle 命令生成的包却完全不受影响。这一现象引发了广泛讨论,也让许多团队重新审视自己的构建流程。
背景:Android 的 16 KB 页面大小对齐要求
自 Android 15 起,Google 开始鼓励开发者将应用中的原生库(.so 文件)与 16 KB 页面大小对齐。这一调整是为了配合未来设备可能采用的更大内存页面(4KB → 16KB),以提升内存访问效率和系统性能。根据 Google 的官方文档,如果 AAB 中的原生库未能正确对齐,Google Play 会在后台检测并发出警告,甚至可能影响应用的审核或分发。
具体来说,对齐要求每个 ELF 格式的共享库的 LOAD 段起始地址必须为 16 KB 的整数倍。这通常需要构建工具在打包时进行额外处理。
问题重现:Android Studio 生成的 AAB 频频“中招”
多位开发者反映,当他们使用 Android Studio 自带的“Build” → “Build Bundle(s) / APK(s)”生成 AAB 并上传到 Google Play Console 时,系统提示“16 KB page size alignment issue”。检查日志发现,警告指向的是项目中的原生库(例如通过 NDK 编译的 .so 文件或第三方 SDK 提供的库)。
令人费解的是,同样的 Flutter 项目(包含相同原生依赖),如果改用 flutter build appbundle 构建,上传后却完全通过检查。这一对比让不少团队困惑:同一个代码库,为何构建结果不同?
深层原因:构建工具链的差异
经过技术社区的分析和部分工程师的测试,根本原因锁定在 构建工具链对页面对齐的处理方式 上。
-
Android Studio 默认使用的 AAPT2 与 Gradle 插件:在生成 AAB 时,Android Gradle 插件(AGP)会调用 AAPT2 进行资源打包,并依赖
zipalign进行对齐。但传统上zipalign仅针对 4 KB 页面大小进行优化,对于 16 KB 对齐没有强制要求。除非开发者在build.gradle中主动配置android.packagingOptions.jniLibs { alignment = 16 }或使用最新 AGP 版本(如 8.5+)并开启相应标志,否则生成的 AAB 可能默认仍按 4 KB 对齐。 -
Flutter 的构建流程:Flutter 在
flutter build appbundle内部调用的是自己的打包脚本,该脚本基于 Dart 的工具链,并且在打包原生库时已经默认采用了 16 KB 对齐。这是因为 Flutter 团队在早期就预见到了这一趋势,并在flutter tools中集成了相应的对齐逻辑。此外,Flutter 的引擎库本身也要求对齐,因此默认行为就是安全的。 -
第三方依赖的影响:部分通过 JitPack 或 maven 引入的 SDK,其预制 .so 文件可能仍然按 4 KB 对齐。Android Studio 在打包时不会自动修正这些库,而 Flutter 的打包器则会强制重新对齐,从而避免了问题。
此外,有开发者指出,如果使用 cmake 或 ndk-build 手动编译原生代码,Android Studio 的默认构建配置可能不会将 -DANDROID_PAGE_SIZE=16 传递给编译器,导致产出的 .so 文件段对齐错误。而 Flutter 的 Android 原生壳工程中,相关编译参数已经预设正确。
影响与应对策略
对于正在使用 Android Studio 构建 AAB 并计划上传的团队,建议立即检查自己的构建配置:
- 升级 AGP 到最新版本(至少 8.5 以上),并在
build.gradle中添加:groovy android { packagingOptions { jniLibs { alignment = 16 } } } - 对于手动编译的原生库,在 CMakeLists.txt 或 Android.mk 中设置:
cmake set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-z,max-page-size=0x4000") - 临时替代方案:使用 Flutter 的打包命令作为主力构建方式,除非有特殊需求必须用 Android Studio。
值得注意的是,Google Play 目前对已有应用可能只是警告而非强制阻断,但未来随着 Android 版本迭代,16 KB 对齐可能成为硬性要求。
总结
这次“Android Studio 与 Flutter 构建行为不一致”事件,揭示了不同工具链对新兴系统要求的适应性差异。Flutter 凭借其独立的打包机制提前规避了风险,而传统 Android 构建流程仍需开发者手动调整。对于跨平台项目和纯原生项目,建议尽快统一对齐策略,以免在应用上线时遭遇意外拦阻。技术选型之外的构建细节,往往才是决定上线顺利与否的关键。