这是【Flutter 问题系列第 86 篇】,如果觉得有用的话,欢迎关注专栏。
博文当前所用 Flutter SDK:3.24.5、Dart SDK:3.5.4
文章目录
-
-
- [一:Google Play 新规](#一:Google Play 新规)
- 二:问题描述
- [三:验证当前应用是否支持 16 KB 内存页面的方式](#三:验证当前应用是否支持 16 KB 内存页面的方式)
-
- [3-1:Android Studio 的 Analyze APK](#3-1:Android Studio 的 Analyze APK)
- [3-2:Google Play Console 政策状态通知](#3-2:Google Play Console 政策状态通知)
- [3-3:Google Play Console 的 App Bundle Explorer](#3-3:Google Play Console 的 App Bundle Explorer)
- [四:本人项目不支持的 so 库的特殊说明](#四:本人项目不支持的 so 库的特殊说明)
- 五:如何修改
- 六:如何验证
- [七:如何确认设备是运行在 16 KB 环境下](#七:如何确认设备是运行在 16 KB 环境下)
-
一:Google Play 新规
谷歌计划自 2025年11月1日起,在应用商店实施新规,要求基于 Android 15 或更高版本的新应用需要更新支持 16 KB 页面大小。此项措施可提升应用启动速度、电池续航等多方面性能。不含原生代码的应用通常无需调整,含原生库或代码的应用需升级或重新编译以确保兼容性。16 KB 页面大小能减少系统工作量并优化资源分配,改善设备整体性能。
● 特别注意:
只有内核为 16 KB 的 arm64 目标才支持 16 KB 页面。
● 什么是页面大小
页面大小是 OS 管理内存的精细程度。如今,大多数 CPU 都支持 4 KB 页面大小,因此 Android OS 和应用一直以来都是针对 4 KB 页面大小进行构建和优化的。ARM CPU 支持更大的 16 KB 页面大小,从 Android 15 开始,AOSP 也支持构建具有 16 KB 页面大小的 Android。此选项会使用额外的内存,但可以提高系统性能。
Google Play Console 上也收到了通知,如下截图所示

重点内容已经用红色部分框选。
二:问题描述
简单来说就是 2025年11月1 日之前,如果你的应用不支持 16 KB 的内存页面,就不能在 Google Play 上继续更新应用了。
当然,也给出了解决方法,请点击 支持 16 KB 设备 跳转到官方文档。
不过,如果因种种情况无法及时使应用支持 16 KB 内存页面,谷歌也给出了延期解决的时间到 2026年5月31日。首次通知可能是 2025年5月8日 发出的,算上延期的时间,差不多给了一年的时间来适配。
为了适配,我们不得不考虑以下问题:
- 如何知道自己的应用是否支持 16 KB 的内存页面?
- 如果自己的应用不支持,如何修改成支持的?
- 如何验证修改后是否成功支持?
下面就围绕着这三个问题,逐一说明。
三:验证当前应用是否支持 16 KB 内存页面的方式
提供三种方式验证
3-1:Android Studio 的 Analyze APK
在 Android Studio 依次点击 Build > Analyze APK,然后选择你要验证的 apk 文件(你也可以直接拖动 apk 文件到 Android Studio),分析后的部分截图如下所示

可以看到结论是当前 apk 文件不支持,也给出了哪些 so 不支持。
3-2:Google Play Console 政策状态通知
在政策状态的问题详情中,谷歌给出了当前应用是否支持的提示,如下图所示

3-3:Google Play Console 的 App Bundle Explorer
在 Google Play Console 上,点击当前 App Bundle 包查看详情,如下图所示

滑动到详情页下面的「内存页面大小」处,可以看到当前应用不支持 16 KB,也指出了哪些库不支持。根据名称可以在项目中全局搜索看是哪里引用了这些 so 库,不过你可能也搜索不到结果,就只能一个一个的找了。
四:本人项目不支持的 so 库的特殊说明
以当前我的应用不支持 16 KB 的 so 库 libbbhelper.so 和 libpl_droidsonroids_gif 为例,这里我做个 特殊说明:
说明一:
libbbhelper.so 库是我全局搜索出来的,查出是 Flutter 中的插件 pdf_render_plus 引用了此库。
说明二:
libpl_droidsonroids_gif.so 库通过全局搜索没有查到有引用的地方,我把自己 pubspec.yaml 文件中的依赖的插件有哪些,告诉 Ai 这些插件中可能是哪个引入了此库,根据 Ai 推荐的结果,依次注释掉 pubspec.yaml 文件中的依赖,并解决依赖丢失后的相关报错,重新打包 apk 文件,然后执行 3-1 的方式查看是否还会提示应用不支持 16 KB。
依次排除了 lottie: 3.2.0、cached_network_image: 3.4.1、extended_image: 9.1.0,最终在注释掉第 4 个插件 crisp_chat: 2.2.5 的时候,提示不支持的情况消失。去 crisp_chat 插件中查看更新日志,发现插件在 51天前发布的 2.4.1 版本已经修复了此问题,如下截图所示

更新 crisp_chat 到最新版本后,运行项目时,又提示
BUILD FAILED in 47s
Running Gradle task 'assembleRelease'... 47.2s
Your project requires a newer version of the Kotlin Gradle plugin. Find the latest version on https://kotlinlang.org/docs/releases.html#release-details, then update the version number of the plugin with id "org.jetbrains.kotlin.android" in the plugins block of /Users/app/Documents/Company/flutter_projects/xxx_app/android/settings.gradle.
Alternatively (if your project was created before Flutter 3.19), update /Users/app/Documents/Company/flutter_projects/xxx_app/android/build.gradle ext.kotlin_version = 'latest-version'
根据提示,是我本地的 Kotlin 版本太低了,然后我又把 android/settings.gradle/plugins 中的 Kotlin 版本升级了一下
- 修改前:id "org.jetbrains.kotlin.android" version "1.8.22" apply false
- 修改后:id "org.jetbrains.kotlin.android" version "2.2.20" apply false
第四条这里做了解释说明的原因是,自己并不太懂 Android 原生,我只是提供了一下解决问题的思路和过程,能帮到你了最好,原生大佬有更好的方式也可以在评论区不吝赐教。
五:如何修改
整理 官方文档 可得出,如需构建支持 16 KB 设备的 Android 应用,则至少需要具备两个要素:
- AGP(Android Gradle Plugin)版本 8.5.1 或更高版本
- Android NDK r28 及更高版本
当然,谷歌也给出了项目不满足升级条件时如何短暂过度的解决方案,官方文档中有详细说明,这里不再赘述。
● 如何查看项目的 AGP 版本
在 Android Studio 中,单独运行 android 项目,依次点击 File > Project Structure > Project,如下图所示

可以看到,我本地目前使用的 AGP 版本是 8.12.2。
● 如何查看项目的 NDK 版本
依次点击 android > app > build.gradle > android

可以看到,旧 NDK 版本是 27.0.12077973,新 NDK 版本是 29.0.14206865。
● 如何升级 NDK 版本
打开设置页面,按下图所示找到 SDK Tools,

如果你的 NDK 版本也不高,左侧红色箭头所指之处此时应该显示的是一个横杠,右侧红色方框应该提示要升级的 NDK 版本号(如我的 29.0.14206865),因为我已经安装过了,所以这里显示了 Installed,自己点击安装即可。
这两项解决了,并不意味着你的应用就支持 16 KB 内存页面了,还需要通过 3-1 的方式查出是否仍然存在不支持 16 KB 的 so 库,如果没有则目前可以先认为你的应用支持了,如果有则对应的库也需要编译并设置为支持 16 KB 的内存页面才行。
因为我的 libbbhelper.so 库是插件 pdf_render_plus 引用的,但 pdf_render_plus 插件无法满足 Ui 的自定义需求所以我把它下载到本地放在 plugins 文件夹中使用,解决方案是在插件的 android/CMakeLists.txt 中追加了下面的代码
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wl,-z,max-page-size=16384")
重新打包成 apk 文件用 3-1 方式验证后,libbbhelper.so 不支持 16 KB 的提示消失。另外一个 libpl_droidsonroids_gif.so 库在 crisp_chat 升级到 2.4.1 后问题也消失。至此,两个不支持 16 KB 的 so 库都已经支持了。
六:如何验证
问题解决完后,通过第三条 3-3 的方式,打一个新的 aab 包上传到 Google Play Console 并查看详情,如下图所示

可以看到,「内存页面大小」处提示已经「支持 16 KB」,不过谷歌在其下方也提示了
如果您的应用使用了我们无法检测到的库,或者您的代码假定设备使用了特定的页面大小,那么您可能仍会遇到错误,了解详情
所以最好有一种方式可以模拟 16 KB 内存页面大小的环境来验证应用是否支持。谷歌 官方文档 中也给出了思路,这里我使用基于 16 KB 的 Android 16 系统映像设置 Android 模拟器来验证,如下图所示

模拟器建好后,运行项目,如果你的应用不支持 16 KB 内存页面,应用启动时会出现下图所示情况

如果你的应用支持 16 KB 内存页面,则不会出现此情况。
七:如何确认设备是运行在 16 KB 环境下
在终端通过如下命令来确认
csharp
adb shell getconf PAGE_SIZE
如果输出 16384,则说明当前运行在 16 KB 环境下。如输出 4096,则说明是在 4 KB 环境。
如果当前你有多个设备在线,则可以先通过 adb devices 命令列出当前在线的设备名称,然后使用下面命令查看
csharp
adb -s xxx shell getconf PAGE_SIZE
如下图所示

其中 xxx 是你自己的设备名称,如我的是 emulator-5554。
至此,关于解决 Google Play 提示应用必须支持 16 KB 内存页面大小问题的方案便说到这里。
你的问题得到解决了吗?欢迎在评论区留言。
赠人玫瑰,手有余香,如果觉得文章不错,希望可以给个一键三连,感谢。
结束语
Google 的 Flutter 越来越火,截止 2025年10月23日 GitHub 标星已达 173K,Flutter 毅然是一种趋势,所以作为前端开发者,没有理由不趁早去学习。
无论你是 Flutter 新手还是已经入门了,不妨先点个关注,后续我会将 Flutter 中的常用组件(含有源码分析、组件的用法及注意事项)以及可能遇到的问题写到 CSDN 博客中,希望自己学习的同时,也可以帮助更多的人。