Flutter · Last updated May 13, 2026
Fix “Not compatible with 16 KB page size devices” in a Flutter app
If your Flutter release got the Play Console warning “Not compatible with 16 KB page size devices,” the cause is almost always one of two things: the Flutter engine you’re shipping was built with an old NDK, or one of your plugins ships a native .so file that hasn’t been rebuilt for 16 KB pages. The good news: in 90% of Flutter apps, the fix is two version bumps and a clean rebuild.
1. Upgrade Flutter
Flutter 3.27 shipped the first engine compiled with NDK r27, producing 16 KB-aligned libflutter.so, libapp.so, and friends. Flutter 3.32 (March 2026) tightened the defaults further and is the recommended baseline.
$ flutter upgrade $ flutter --version Flutter 3.32.0 • channel stable Engine • revision … (built with NDK r28)
If you’re stuck on an older Flutter for compatibility reasons, the minimum line that emits 16 KB-aligned engines is 3.27.0. Anything older needs to be upgraded, period.
2. Pin the NDK version
Flutter delegates the Android build to Gradle, so the NDK version that builds your plugins is controlled by android/app/build.gradle (or build.gradle.kts). Pin it explicitly so CI agents don’t silently pick up an older toolchain:
android {
namespace = "com.example.app"
compileSdk = 35
ndkVersion = "28.0.13004108"
defaultConfig {
minSdk = 23
targetSdk = 35
}
}3. Audit your plugins
This is where Flutter apps get tripped up. Many popular plugins ship prebuilt .so files compiled with an older NDK, and your flutter pub upgrade doesn’t automatically rebuild them. The common offenders we see:
sqflite< 2.4.0 — SQLite native bindings.flutter_image_compress< 2.4.0 — libjpeg-turbo bindings.just_audio< 0.9.42 — ExoPlayer / native audio.ml_kit_*packages — Google ML Kit prebuilt models.firebase_*< 11.0.0 — the v11 line rebuilt every native dependency for 16 KB.webview_flutter_android< 4.5 — Chromium glue.
Run a scan in 16kb Checker against your release AAB. The native library table will tell you which path inside the package is failing—Flutter plugin paths are usually lib/arm64-v8a/lib<plugin-name>_plugin.so, making the offending plugin obvious.
4. Force a clean build
Gradle caches aggressively, so once you’ve bumped Flutter, the NDK, and your plugins, clear the build artifacts before re-shipping:
$ flutter clean $ flutter pub get $ cd android && ./gradlew clean && cd .. $ flutter build appbundle --release
5. Verify before upload
Drop the freshly produced app/build/outputs/bundle/release/app-release.aab into 16kb Checker. Every 64-bit .so should show a green badge, and the zip layout indicator should read PASS. If a plugin still fails, no amount of Gradle tweaking will help—open an issue with that plugin’s maintainer and ask for a 16 KB-ready release, or pin to a known-good fork.