Flutter 16 KB Page Size: We Measured Three Flutter Versions
Have a Flutter or native Android project? Code2Native compiles it in the cloud from a ZIP or a Git repository, on Builder ($39/month) or Pro ($99/month).
Start a source buildFrom February 1, 2027, Google Play will not release updates of apps that target Android 15 or higher unless they support 16 KB memory pages on 64-bit devices. We created a fresh app with each of three Flutter versions and measured both the files it builds and the APKs made from its AAB. The Flutter engine and the compiled Dart code were aligned on all three, and every release APK Flutter built passed. The AABs of the two older versions did not: in the APKs built from them, the libraries started at 4 KB-aligned offsets rather than 16 KB, because those projects use an Android Gradle Plugin older than 8.5.1. A plugin that ships its own native library is the other risk.
What we measured
| Flutter | 64-bit libflutter.so and libapp.so | Native libraries in the APK | zipalign -c -P 16 | Release APK | Default targetSdk |
|---|---|---|---|---|---|
| 3.44.5 | Aligned to 64 KB | Uncompressed, at 16 KB offsets | Passes | 43.4 MB | 36 |
| 3.24.5 | Aligned to 64 KB | Compressed, extracted at install | Passes | 18.7 MB | 34 |
| 3.19.6 | Aligned to 64 KB | Compressed, extracted at install | Passes | 18.4 MB | 33 |
Method, October 3, 2026: in the Flutter builder images Code2Native runs, flutter create with default settings, then flutter build apk --release and flutter build appbundle --release. We read the program headers of every 64-bit library (arm64-v8a and x86_64) in the APK and the AAB, the same check our website builds run before they are marked ready for Google Play, and ran zipalign -c -P 16 -v 4 from Android build-tools 36.0.0 on each APK. Sizes are in decimal megabytes; Flutter 3.19.6's own build output prints them in binary units.
The AAB: the APKs Google Play builds from it
Google Play does not install your AAB. It builds APKs from it with bundletool, following the packaging settings inside the bundle, and those settings come from your project's Android Gradle Plugin.
| Flutter | Android Gradle Plugin in a new project | What the bundle asks for | Libraries in the APK built from it |
|---|---|---|---|
| 3.44.5 | 9.0.1 | Uncompressed, 16 KB alignment | At 16 KB offsets: passes |
| 3.24.5 | 8.1.0 | Uncompressed, no alignment set | 4 KB-aligned, not 16 KB: fails |
| 3.19.6 | 7.3.0 | Uncompressed, no alignment set | 4 KB-aligned, not 16 KB: fails |
Method: we read each bundle's settings with bundletool dump config, ran bundletool build-apks (version 1.18.3) for a 64-bit (arm64-v8a) Android 15 phone, and read where each library starts in the APK it built. Google's guide is explicit about why that matters: “16 KB devices require apps that ship with uncompressed shared libraries to align them on a 16 KB zip-aligned boundary.”
What the numbers mean
- Flutter's own libraries are fine. Both were aligned to 64 KB, four times what 16 KB pages need, on every version we built.
- A new project packs the APK differently. A fresh 3.44.5 project stores the libraries uncompressed at 16 KB boundaries, so Android can load them straight from the APK: its 42.8 MB of libraries fill almost the whole 43.4 MB APK. The two older projects compress about 39.5 MB of libraries to 18 MB, and Android unpacks them at install. Both ways pass.
- The AAB depends on your Android Gradle Plugin. The 3.24.5 and 3.19.6 bundles ask for uncompressed libraries without saying how to align them, so the APKs built from them fail even though the APKs Flutter built directly pass. Flutter does not raise the plugin for you: the version stays in your own Gradle files, usually
android/settings.gradleorsettings.gradle.kts(older projects set it inandroid/build.gradle). Flutter 3.35 to 3.41 refuse only plugins below 8.1.1, so a project raised just enough to build there still makes this kind of bundle; Flutter 3.44.5 requires 8.6.0 or later. - The Flutter version still matters for Google Play. By default, Flutter 3.24.5 and 3.19.6 target API 34 and 33, below what Play accepts for updates. See Flutter target API 36.
- Plugins are the other risk. A fresh app has no plugins. A plugin that ships a prebuilt
.sobrings its own alignment, and Google warns that some SDK prebuilts are not 16 KB compatible.
Check your own build
Run Google's check on the release APK:
zipalign -c -P 16 -v 4 app-release.apkThen open the APK in Android Studio (Build > Analyze APK), expand lib, and read the Alignment column for every 64-bit .so. A failing library's file name usually points to the plugin or SDK that ships it. The -P option needs build-tools 35.0.0 or later, and zipalign marks a compressed library “OK - compressed” without checking it, so for compressed libraries the Alignment column is the check that counts.
For an AAB, read the packaging it asks Google Play for:
bundletool dump config --bundle=app-release.aabIf uncompressNativeLibraries shows "enabled": true, it also needs "alignment": "PAGE_ALIGNMENT_16K". If it is missing, upgrade the Android Gradle Plugin to 8.5.1 or later (8.6.0 or later on Flutter 3.44.5), with the Gradle version it needs. If you can't, Google's alternative is to have Gradle compress the libraries, in android/app/build.gradle:
android {
packagingOptions {
jniLibs {
useLegacyPackaging true
}
}
}In build.gradle.kts, the line is useLegacyPackaging = true. With plugin 8.0 or older, also add android.bundle.enableUncompressedNativeLibs=false to android/gradle.properties. Compressed libraries take more space once the app is installed. Google's 16 KB page size guide adds the build-side rules: native code built with NDK r28 or later is aligned by default, older NDKs need linker flags, and Android Gradle Plugin 8.5.1 or later aligns uncompressed libraries.
Building it in the cloud
Code2Native's source builds use Flutter 3.44.5 by default and build the APK or AAB you choose. Every Android build from source checks the file you get, each 64-bit library and, for an AAB, the packaging it asks Google Play for. The build log names what fails (libraries by file name, the first five, then a count) and how to fix it. The check never stops a build. Source builds need Builder ($39/month) or Pro; check that your project is supported before you buy.
Compile your project in the cloud
Upload a ZIP or give a Git URL, choose APK or AAB, and read the real build log. Builder covers up to 20 Android source compiles a month, using its included credits. Check that your project is supported before you buy.
Frequently asked questions
Does the 16 KB rule apply to my Flutter app?
If it targets Android 15 (API level 35) or higher, yes: every Flutter app ships native libraries (the Flutter engine and your compiled Dart code), and from February 1, 2027 Google Play will not release updates that do not support 16 KB memory pages on 64-bit devices.
Is Flutter itself 16 KB compatible?
Its libraries are, on all three versions we tried: a fresh app from each version's flutter create on Flutter 3.19.6, 3.24.5 and 3.44.5 had its 64-bit libflutter.so and libapp.so aligned to 64 KB, and every APK Flutter built passed zipalign -c -P 16. The AAB depends on the Android Gradle Plugin in your project: the bundles from the plugin versions that Flutter 3.24.5 and 3.19.6 put in a new project (8.1.0 and 7.3.0) gave APKs with the libraries at 4 KB-aligned offsets, not 16 KB.
Then why would my app fail the check?
Three things can fail it: an Android Gradle Plugin older than 8.5.1 in a project you upload to Google Play as an AAB, a plugin that ships its own .so file, or C or C++ code built with an NDK older than r28 without the 16 KB linker flags. Flutter never raises your project's Android Gradle Plugin version for you, and Google warns that some SDK prebuilts are not 16 KB compatible.
How do I check my own app?
For an APK, run zipalign -c -P 16 -v 4 on the release APK and read the Alignment column for each .so in Android Studio's APK Analyzer (Build > Analyze APK). For an AAB, run bundletool dump config on it: if uncompressNativeLibraries is enabled, it also needs the alignment PAGE_ALIGNMENT_16K. Every 64-bit library needs LOAD segments aligned to at least 16 KB.
How do I fix the AAB?
Upgrade the Android Gradle Plugin to 8.5.1 or later, with the Gradle version it needs; Flutter 3.44.5 itself requires 8.6.0 or later. A new Flutter 3.44.5 project uses plugin 9.0.1 with Gradle 9.1.0, but plugin 9 needs Flutter 3.44 or later. If you can't upgrade, Google's alternative is to have Gradle compress the libraries: set useLegacyPackaging true in the packagingOptions jniLibs block of android/app/build.gradle (useLegacyPackaging = true in build.gradle.kts), and with plugin 8.0 or older also add android.bundle.enableUncompressedNativeLibs=false to android/gradle.properties. Compressed libraries take more space once the app is installed.
Code2Native Engineering
Engineering team
Written by the Code2Native engineering team — the people who build and operate the cloud build pipeline.