Comprendre et réussir la transition Android 15 : du 4KB au 16KB, le changement qui bloque la publication de vos apps Flutter sur Google Play
Sommaire
- 1. Ce qui change avec Android 15
- 2. Les erreurs et symptômes que tu vas rencontrer
- 4. Les fondamentaux à mettre à jour
- 5. Configuration type compatible Android 15
- 6. Nettoyer et recompiler
- 7. Vérifications finales
- 8. En résumé : le nouveau paradigme Android 15
- En conclusion
- Ressources complémentaires
Depuis Android 15 (API 35), Google impose un changement silencieux mais massif : les tailles de pages mémoire passent de 4 Ko à 16 Ko sur certaines architectures. Un détail de bas niveau... qui à terme bloquera la publication de nombreuses applications sur Google Play.
1. Ce qui change avec Android 15
Historiquement, la majorité des appareils Android utilisaient une page mémoire de 4 KB. Android 15 introduit officiellement le support de pages de 16 KB sur les processeurs ARM v9 et certaines variantes x86_64.
Pourquoi ce changement ?
- Performances : moins de fautes de page, meilleure gestion de la mémoire sur les gros workloads.
- Sécurité : alignement mémoire plus strict pour certaines protections.
- Futur hardware : les nouveaux SoC ARM imposent cette granularité.
Conséquence pour tes apps
Les binaires natifs (fichiers .so dans tes APK/AAB) doivent être alignés sur 16 KB, et compilés avec un NDK récent (r27+).
Même si ton app Flutter n'a pas de code natif, elle embarque des bibliothèques natives via ses dépendances (notamment les plugins).
2. Les erreurs et symptômes que tu vas rencontrer
Voici les problèmes typiques rencontrés par les développeurs Flutter lors de la mise à jour :
Erreurs de build
checkReleaseAarMetadataavec des dépendances AndroidX qui exigentcompileSdk 34+NDK not configured properlyouunsupported page size- Build OK sur Android 14, mais rejeté par Google Play lors de la soumission
Erreurs runtime
- Crash au lancement sur un appareil Android 15 :
libflutter.so is not aligned for 16KB page size
Causes fréquentes
-
Des plugins Flutter figés sur
compileSdk 33Ex. :awesome_notifications_core,firebase_messaging, etc. → ils ne compilent pas contre Android 34+. -
Des versions d'outils obsolètes
- Gradle < 8.6
- Android Gradle Plugin < 8.4
- JDK < 17 Ces versions ne reconnaissent pas les nouvelles règles NDK/ABI.
-
Une mauvaise propagation des propriétés SDK Flutter n'impose pas automatiquement
compileSdkVersionaux plugins. Chaque sous-module Gradle peut définir le sien.
Résultat : ton app vise Android 35, mais un plugin continue de compiler en 33 → crash build.
4. Les fondamentaux à mettre à jour
Versions minimales recommandées
| Outil | Version minimale |
|---|---|
| Flutter SDK | 3.24.3 |
| Gradle wrapper | 8.7 |
| Android Gradle Plugin (AGP) | 8.6.1 |
| Kotlin | 1.9.24 |
| JDK | 17 |
| NDK | r27+ |
5. Configuration type compatible Android 15
android/gradle.properties
android.useAndroidX=true
android.enableJetifier=true
flutter.minSdkVersion=23
flutter.targetSdkVersion=35
flutter.compileSdkVersion=36
org.gradle.jvmargs=-Xmx4g -Dfile.encoding=UTF-8
android/app/build.gradle.kts
import java.util.Properties
import java.io.FileInputStream
plugins {
id("com.android.application")
kotlin("android")
id("com.google.gms.google-services")
id("com.google.firebase.crashlytics")
id("dev.flutter.flutter-gradle-plugin")
}
val keystoreProperties = Properties()
val keystorePropertiesFile = rootProject.file("key.properties")
if (keystorePropertiesFile.exists()) {
keystoreProperties.load(FileInputStream(keystorePropertiesFile))
}
val minSdk = providers.gradleProperty("flutter.minSdkVersion").orNull?.toInt() ?: 23
val targetSdk = providers.gradleProperty("flutter.targetSdkVersion").orNull?.toInt() ?: 35
val compileSdk = providers.gradleProperty("flutter.compileSdkVersion").orNull?.toInt() ?: 36
android {
namespace = "com.yourcompany.yourapp"
compileSdk = compileSdk
ndkVersion = "29.0.13846066"
compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
kotlinOptions { jvmTarget = "17" }
defaultConfig {
applicationId = "com.yourcompany.yourapp"
minSdk = minSdk
targetSdk = targetSdk
versionCode = flutter.versionCode
versionName = flutter.versionName
ndk {
abiFilters += listOf("arm64-v8a", "x86_64") // 64 bits only = compatible 16KB
}
}
packaging {
jniLibs.useLegacyPackaging = false
}
bundle {
language.enableSplit = false
density.enableSplit = false
abi.enableSplit = true
}
}
flutter {
source = "../.."
}
Et surtout : le bloc magique
Le problème : même si tu configures compileSdkVersion dans ton app, chaque plugin Flutter peut définir son propre compileSdkVersion dans son build.gradle. Un seul plugin resté en version 33 peut bloquer tout le build.
Solution : dans android/build.gradle.kts, ajoute ce bloc qui force tous les sous-projets (plugins) à utiliser les mêmes versions :
Dans android/build.gradle.kts :
subprojects {
afterEvaluate {
val ext = extensions.findByName("android") ?: return@afterEvaluate
val cs = providers.gradleProperty("flutter.compileSdkVersion").orNull?.toInt()
val ts = providers.gradleProperty("flutter.targetSdkVersion").orNull?.toInt()
@Suppress("UNCHECKED_CAST")
(ext as? com.android.build.gradle.BaseExtension)?.apply {
if (cs != null) setCompileSdkVersion(cs)
defaultConfig {
if (ts != null) targetSdkVersion(ts)
}
}
}
}
Pourquoi afterEvaluate ? Parce que les plugins configurent leur extension Android à différents moments. On attend que tous les plugins aient fini leur configuration avant de les modifier.
Ce bloc garantit que tous tes plugins utilisent le même compileSdk/targetSdk que ton app, évitant les conflits de versions.
6. Nettoyer et recompiler
flutter clean
rm -rf android/.gradle ~/.gradle/caches
flutter pub upgrade
flutter build apk -v
7. Vérifications finales
✅ Le build passe sans erreur
✅ L’APK/AAB contient bien les ABI arm64-v8a et x86_64
✅ Tu cibles targetSdkVersion 35+
✅ Les binaires natifs sont correctement alignés (16 KB compatible)
8. En résumé : le nouveau paradigme Android 15
| Domaine | Avant (Android 14) | Maintenant (Android 15) |
|---|---|---|
| Taille de page mémoire | 4 KB | 16 KB |
| ABIs minimales | armeabi-v7a, arm64-v8a | arm64-v8a, x86_64 |
| NDK | r25+ | r27+ |
| JDK | 11 | 17 |
| AGP | 8.1 | 8.6 |
| compileSdk | 33 | 35/36 |
En conclusion
Le passage à 16 KB de page mémoire marque une modernisation profonde de l’écosystème Android, que Flutter doit suivre de près.
Les symptômes visibles (erreurs de build, plugins cassés, refus Google Play) sont en réalité des signaux d’alignement : tout le pipeline (Gradle, AGP, NDK, plugins) doit monter en version de manière cohérente.
👉 Si ton projet Flutter est déjà à jour, ces étapes garantissent la compatibilité Android 15 et évitent les crashs futurs liés au matériel ARM v9.
Astuce de dernière minute : si tu n'as pas le temps de te mettre en conformité immédiatement, une extension de temps de mise à jour peut être demandée à Google Play, mais ce n'est pas garanti. Mieux vaut anticiper !