Flutter and Google Play's 16 KB page size requirement
Short answer: the Flutter engine library libflutter.so is 16 KB-aligned from Flutter 3.16.0; we measured 3.13.9 and earlier as 4 KB-aligned. If Play still flags your app on a newer Flutter, the offending .so comes from somewhere else in the bundle: a plugin, an SDK, or your own native code. Plugins compiled during your build are aligned by NDK r28 or newer by default; plugins that ship a prebuilt .so need a newer plugin release.
Checked 2026-10-13 · by hermonLabs · Google Play deadlines
What we measured
The engine is not a Gradle dependency you pick: it comes with your Flutter SDK version, so flutter upgrade (or switching the pinned SDK in CI) is the fix for this file.
| Artifact | Last 4 KB-aligned (measured) | First 16 KB-aligned | Newest measured |
|---|---|---|---|
| Flutter engine libflutter.so | 3.13.9 | 3.16.0 | 3.47.5 aligned |
Measured 2026-10-01 by reading the ELF headers of the published artifacts; method on Methodology.
Plugins and your own native code
Google's guide: “NDK version r28 and higher compile 16 KB-aligned by default.” For anything compiled during your build (plugins with C/C++ sources, your own CMakeLists.txt), pin the NDK in android/app/build.gradle.kts:
android {
ndkVersion = "28.2.13676358" // any r28+ NDK you have installed
}A plugin that ships a prebuilt .so (inside its AAR or jniLibs folder) is not rebuilt by your NDK. The file name in the checker output usually points at the plugin; upgrade it, or ask its maintainer for a 16 KB-aligned release. Details for your own code: NDK r28, r27 and older.
Find the exact file Play is complaining about
Run a check on the exact .aab you upload, not a debug APK. The free in-browser checker lists every arm64-v8a/x86_64 .so and its alignment without uploading anything; the same rules as a script:
curl -LO https://android-16kb-fixmap.pages.dev/check16k.py
python3 check16k.py app-release.aabOn a device or emulator booted with 16 KB pages, adb shell getconf PAGE_SIZE prints 16384 (Google's guide lists the 16 KB emulator images and the Pixel developer option).
Still flagged after all that?
See why Play can disagree with a local check. The other Flutter deadline is separate: targetSdk 36 is set in android/app/build.gradle, not by the engine version.
Sources
Read 2026-10-13. Our own numbers are measured from published artifacts (how); anything else is quoted from the sources above.
The paid kit ($12, v2.1) contains the complete measured fix map for all 80+ libraries as JSON and a table, every raw per-version measurement, the spot-check evidence, and the CI checker. This page and the checker script stay free.
- fixmap.json 209 KB
- fixmap.md 41 KB
- tools/check16k.py 6 KB
- GUIDE.md 17 KB
Full refund within 14 days if the kit didn't help you find or fix your blocker, no questions — email us and we process it via Polar's Refunds API.