Réponse rapide
Google Play impose aux applications ciblant Android 15 (niveau d’API 35) ou supérieur de prendre en charge les pages mémoire de 16 KB sur les appareils 64 bits, et à partir du 1er février 2027 vous ne pourrez plus publier de mises à jour qui ne le font pas. Une application écrite uniquement en Java ou Kotlin, bibliothèques et SDK compris, est déjà conforme. Une application qui embarque des bibliothèques natives .so échoue tant que chacune d’elles n’a pas été recompilée ou remplacée, de préférence avec Android Gradle Plugin 8.5.1+ et NDK r28+, et tant que le build ne passe pas deux contrôles distincts: chaque segment ELF LOAD aligné sur au moins 2**14, et l’app bundle qui rapporte PAGE_ALIGNMENT_16K. Mettre à jour votre framework ne prouve rien; c’est l’artefact qui prouve. Si la levée de cet avertissement bloque un test fermé déjà en cours, PrimeTestLab maintient le volet testeurs pendant que vous recompilez.
L’avertissement est court, il nomme un fichier au mieux, et il arrive alors que vous pensiez déjà le build terminé. C’est pour cela que les trois mêmes fausses pistes reviennent sans cesse: on fait confiance à une échéance qui a bougé, on met à jour un framework en supposant que le travail est fait, ou on vérifie un seul APK local sans jamais regarder le bundle à partir duquel Google construit réellement. Cet article est organisé comme le problème se résout vraiment, identifier, attribuer, réparer, prouver, et tout ce qui s’y trouve est à jour au 5 août 2026, vérifié dans le guide de Google sur les tailles de page le jour même de sa dernière mise à jour. Quand la preuve vient de l’issue tracker d’un mainteneur plutôt que d’une note de version officielle, la page le dit sur la carte au lieu d’arrondir cela en fait établi.
Le labo d’alignement
Douze instruments construits pour cette seule erreur. Rien ici ne demande de compte, d’import ni de requête réseau: chaque outil tourne dans votre navigateur, sur les valeurs que vous saisissez.
Sommaire
Corriger en trois étapes
Toute correction sérieuse de cette erreur suit les trois mêmes gestes dans le même ordre: identifier la bibliothèque native mal alignée, mettre à jour la dépendance qui la fournit, puis vérifier l’artefact que vous vous apprêtez à importer. Sauter directement à l’étape deux, c’est la raison pour laquelle tant de développeurs mettent à jour un framework, recompilent, et voient l’avertissement revenir inchangé.
L’exigence elle-même est étroite. Le guide de Google sur les tailles de page indique que les applications ciblant Android 15 (niveau d’API 35) ou supérieur doivent prendre en charge les pages mémoire de 16 KB sur les appareils 64 bits, et qu’à partir du 1er février 2027 vous ne pourrez plus publier de mises à jour qui ne le font pas. Cela ne concerne que le code natif. Si votre application et chaque bibliothèque ou SDK qu’elle contient sont en Java ou Kotlin pur, Google indique que votre application prend déjà en charge les appareils 16 KB. Le problème, c’est que la plupart des développeurs qui voient cet avertissement se croient dans cette catégorie sans y être.
Identifiez le .so fautif
Ouvrez votre APK de production dans Android Studio via Build > Analyze APK..., dépliez lib/arm64-v8a et lib/x86_64, et lisez la colonne Alignment. Notez chaque nom de fichier signalé. Ces noms sont les seules clés de recherche fiables dont vous disposez.
Mettez à jour ce qui le fournit
Un binaire que vous avez compilé se corrige par votre chaîne d’outils: AGP 8.5.1 ou plus récent avec NDK r28 ou plus récent. Un binaire arrivé dans un plugin, un SDK, un moteur ou un AAR ne peut être corrigé que par celui qui l’a compilé: l’action consiste donc à mettre à jour ce paquet, à le remplacer, ou à lui demander un artefact recompilé.
Trouver le chemin le plus court pour votre frameworkVérifiez l’artefact, pas la mise à jour
Deux contrôles indépendants doivent passer tous les deux. Chaque segment ELF LOAD doit être aligné sur 2**14 ou plus, et bundletool doit rapporter PAGE_ALIGNMENT_16K pour le bundle de production. Passer l’un ne prouve rien sur l’autre.
Toute la décision, sur un seul écran
Avant de changer la moindre version de dépendance, parcourez ceci. Cela prend environ deux minutes et c’est la différence entre corriger la bonne chose et mettre à jour onze paquets qui n’ont jamais été le problème.
L’APK de production contient-il un dossier lib avec des fichiers .so?
Déjà conforme
Aucun code natif dans l’APK. Google indique qu’une application uniquement Java ou Kotlin, bibliothèques et SDK compris, prend déjà en charge les appareils 16 KB. Un test reste utile, tout comme la confirmation que vous avez bien inspecté le build que vous avez importé.
APK Analyzer ou check_elf_alignment.sh nomme-t-il une bibliothèque mal alignée?
Attribuer, puis mettre à jour
Trouvez quel framework, plugin, SDK ou moteur fournit ce nom de fichier exact et mettez ce paquet à jour. Votre propre NDK ne peut pas réécrire le binaire précompilé de quelqu’un d’autre.
Que rapporte bundletool dump config pour le bundle de production?
PAGE_ALIGNMENT_4K
Les bibliothèques vont bien mais l’empaquetage non. Passez en AGP 8.5.1 ou plus récent et recompilez, ou appliquez le contournement d’empaquetage historique si vous ne pouvez pas mettre à jour.
PAGE_ALIGNMENT_16K
L’empaquetage est correct. Testez maintenant les APK générés par Play dans un vrai environnement 16 KB et auditez tout code d’exécution qui suppose une taille de page fixe.
Le piège en une ligne
Un APK local qui passe tous les contrôles d’alignement ne prouve pas que le bundle importé est correct. Google avertit spécifiquement qu’Android Gradle Plugin 8.3 à 8.5 peut produire un bundle dont les APK construits par Play ne sont pas correctement alignés en ZIP, même quand l’APK sur votre machine semble parfait. Cet écart est de loin la raison la plus fréquente pour laquelle l’avertissement survit à une correction "réussie".
Ce que signifie vraiment l’avertissement de la Play Console
La conséquence documentée par Google est précise: à partir du 1er février 2027, vous ne pourrez plus publier de mises à jour ciblant Android 15 (niveau d’API 35) ou supérieur sans prise en charge des 16 KB. C’est un blocage de publication des mises à jour, pas une déclaration selon laquelle une application déjà publiée serait retirée du store à cette date. D’ici là, la plupart des développeurs voient un avertissement de compatibilité, pas un refus d’import ferme.
La formulation compte, parce que la version paniquée de cette histoire voyage plus vite que la version exacte. Lisez les chaînes que Google affiche réellement et le périmètre devient étroit et gérable.
App must support 16 KB memory page sizes
Reconstruit à partir de la capture d’écran de la Play Console publiée par Google sur le guide des tailles de page. Les libellés sont reproduits en anglais tels qu’ils apparaissent sur cette capture: votre Console peut les afficher en français, et la mise en page comme les boutons disponibles peuvent varier selon le compte.
Deux lectures de cette carte sont couramment fausses. D’abord, "Action by Feb 1, 2027" n’est pas un compte à rebours vers une suppression: le texte de Google sur la même page décrit la conséquence comme l’impossibilité de publier ces mises à jour. Ensuite, la chaîne Extension granted apparaît bien sur la capture de Google, mais cela n’établit pas qu’un parcours de demande de prolongation vous soit actuellement ouvert. Ne considérez une prolongation comme réelle que si vous voyez l’option dans votre propre Play Console.
Quelle échéance avez-vous réellement lue?
Trois dates circulent et une seule est vivante. Choisissez celle que vous avez vue et l’outil résout son statut face à la page actuelle de Google, mise à jour pour la dernière fois le 5 août 2026.
Instrument 01
Résolveur d’échéance
Google a déplacé cette échéance plus d’une fois. Avant de bâtir un plan de version autour du 1er février 2027, ouvrez vous-même le guide des tailles de page et vérifiez la mention "Dernière mise à jour" en bas. Cette seule habitude vaut mieux que n’importe quelle date imprimée dans un article, celui-ci compris.
L’exigence des 16 KB concerne-t-elle mon application?
Ce n’est pas votre framework qui décide. C’est le contenu de l’APK généré. S’il y a des fichiers .so sous lib, vous êtes dans le périmètre même si vous n’avez jamais ouvert un fichier C++, et s’il n’y en a aucun, les recommandations de Google elles-mêmes indiquent que vous prenez déjà en charge les appareils 16 KB.
Applications en Java ou Kotlin pur
Google est sans ambiguïté ici: si votre application et l’ensemble de ses bibliothèques et SDK n’utilisent que Java ou Kotlin, votre application prend déjà en charge les appareils 16 KB. Google recommande tout de même de tester dans un environnement 16 KB pour détecter des régressions inattendues, ce qui vous coûte une exécution d’émulateur.
Le piège tient dans la formule "et l’ensemble de ses bibliothèques et SDK". Une seule dépendance de base de données, d’analytics, de rapport de plantage, de média, de cartographie, d’apprentissage automatique ou de sécurité peut ajouter des binaires natifs à un projet dont le code source ne contient que du Kotlin. "Je n’ai pas écrit de C++" n’est pas une preuve. Le dossier lib, si.
Flutter, React Native, Unity, Kivy et générateurs no-code
Ces stacks livrent par conception des runtimes natifs, des binaires de moteur et des bibliothèques de plugins: elles sont donc presque toujours dans le périmètre. Google cite explicitement les générateurs d’applications tiers qui utilisent des bibliothèques natives parmi les façons dont une application peut être concernée alors que son auteur n’a jamais écrit de C ni de C++. Ce qui varie, ce n’est pas si vous avez du code natif mais quel paquet a fourni la pièce fautive: c’est pour cela qu’attribuer le nom de fichier passe avant toute mise à jour.
Comment vérifier, exactement
Ouvrez l’APK de production, dépliez lib, et regardez les dossiers d’ABI qu’il contient, normalement arm64-v8a et x86_64. La présence du moindre fichier objet partagé signifie que votre application utilise du code natif. Aucun fichier .so et aucun dossier lib signifie que cet APK n’utilise pas de code natif du tout. La colonne Alignment de l’analyseur affiche des avertissements pour les fichiers qui ont un problème d’alignement: c’est le chemin le plus rapide pour passer de "quelque chose ne va pas" à un nom de fichier.
Instrument 02
Triage des cas concernés
01 Que cible actuellement votre application?
02 Ouvrez l’APK de production dans APK Analyzer. Y a-t-il un dossier lib?
03 Qu’est-ce qui décrit le mieux l’application?
04 Avez-vous lancé bundletool dump config sur le bundle de production?
Pourquoi un binaire 4 KB échoue sur un appareil 16 KB
Une page mémoire est le plus petit bloc que le noyau mappe d’un coup. Android a historiquement utilisé des pages de 4 KB; Android 15 a ajouté la prise en charge des appareils configurés avec des pages de 16 KB. Une bibliothèque native enregistre l’alignement pour lequel ses segments ont été liés, et si cette valeur est plus petite que la taille de page de l’appareil, le chargeur ne peut pas placer le segment sur une frontière de page.
C’est tout le mécanisme, et il explique le seul nombre que vous allez voir revenir. L’alignement s’exprime en puissance de deux: 2**12 vaut 4096 octets, 2**14 vaut 16384 octets. La règle de Google est que chaque segment LOAD d’une bibliothèque native doit être aligné sur 2**14 ou plus. Une bibliothèque compilée en 2**14 fonctionne à la fois sur les appareils 4 KB et 16 KB, parce que 16384 est un multiple exact de 4096. Une bibliothèque compilée en 2**12 ne fonctionne que sur la plus petite taille de page. C’est cette asymétrie qui fait que la correction consiste toujours à "monter l’alignement" et jamais à "détecter l’appareil".
Instrument 03
Visualiseur de pages
Choisissez l’alignement que rapporte votre bibliothèque et voyez où ses segments peuvent commencer sur un appareil qui utilise des pages de 16 KB.
Conforme
Il existe une seconde contrainte, entièrement distincte, qui vit en dehors de la bibliothèque. Les bibliothèques natives stockées non compressées dans un APK doivent elles aussi se placer sur une frontière de 16 KB à l’intérieur de l’archive ZIP. C’est une propriété d’empaquetage, contrôlée avec zipalign et configurée par votre plugin de build, et elle peut être fausse alors que chaque bibliothèque à l’intérieur est parfaitement alignée. Garder ces deux idées séparées est la chose la plus utile à retenir de cette section.
Lire les nombres
Quand vous voyez 2**14 dans la sortie de llvm-objdump, c’est conforme. 2**13 ou 2**12 échoue. Il n’y a ni demi-point ni "presque bon": un seul segment LOAD mal aligné, dans une seule bibliothèque, dans une seule ABI, suffit à maintenir l’avertissement sur votre compte.
Le correctif le plus court pour chaque framework
La préparation d’un framework et la conformité d’une application sont deux choses différentes. React Native 0.77 et les versions Unity prises en charge sont de vraies références documentées. Flutter n’a aucun minimum universel vérifiable. Dans tous les cas, la mise à jour corrige les binaires propres au framework et laisse chaque plugin tiers exactement aussi non conforme qu’avant.
Instrument 04
Finder de framework
Ce qui peut encore échouer après cela
Toutes les références dans un tableau
| Framework | Référence documentée | Action la plus courte | Confiance |
|---|---|---|---|
| Flutter | Aucun minimum universel vérifié; 3.38 est le jalon de préparation documenté (NDK r28 par défaut) | Flutter stable actuel, mise à jour des plugins natifs, nettoyage, recompilation, inspection de chaque bibliothèque | PARTIEL |
| React Native | 0.77 | Chemin de mise à jour pris en charge, puis mise à jour des modules natifs et des SDK d’éditeurs | VÉRIFIÉ |
| Unity ligne 6.1 | 6000.1 ou plus récent | Monter l’éditeur, mettre à jour paquets et plugins, recompiler | VÉRIFIÉ |
| Unity 6 LTS | 6000.0.38f1 ou plus récent | Identique à ci-dessus | VÉRIFIÉ |
| Unity 2022 LTS | 2022.3.56f1 ou plus récent | Identique à ci-dessus | VÉRIFIÉ |
| Unity 2021 | 2021.3.48f1 ou plus récent, éligibilité LTS étendu requise | Monter de version si vous y avez droit, sinon migrer vers un éditeur pris en charge | VÉRIFIÉ |
| Unity Burst | 1.8.21 ou plus récent | Monter Burst quand lib_burst_generated.so est nommé |
VÉRIFIÉ |
| Android natif | NDK r28+ avec AGP 8.5.1+ | Recompiler le code dont vous êtes propriétaire, mettre à jour chaque dépendance précompilée | VÉRIFIÉ |
| Bloqué sur un NDK ancien | r27 ou antérieur avec les deux options d’édition de liens | Ajouter max-page-size et common-page-size, recompiler toutes les bibliothèques |
FONCTIONNE, NON PRIVILÉGIÉ |
| Kivy ou générateur Python | Aucune version universelle vérifiée | Mettre à jour le générateur et les recettes, remonter le nom de fichier exact en amont | DÉPEND DE L’ÉDITEUR |
| Générateur no-code | Aucune version universelle vérifiée | Régénérer sur la chaîne de build conforme de l’éditeur, lui envoyer le nom de fichier | DÉPEND DE L’ÉDITEUR |
Les niveaux de confiance ont le même sens partout sur cette page. VÉRIFIÉ signifie qu’une source primaire actuelle l’affirme directement. PARTIEL signifie qu’une source fiable soutient l’affirmation centrale mais pas tous les détails d’implémentation. SIGNALÉ signifie que la preuve est l’issue tracker d’un mainteneur ou des rapports de développeurs plutôt qu’une note de version officielle.
Trouver la bibliothèque exacte à l’origine de l’erreur
Le nom de fichier, c’est toute l’enquête. Une fois que vous savez que libfoo.so est le binaire fautif, la question cesse d’être "comment corriger la prise en charge des 16 KB" pour devenir "quel paquet livre libfoo.so, et existe-t-il une version plus récente". Cette seconde question a une réponse; la première n’en a pas.
Commencez dans APK Analyzer
Ouvrez Build > Analyze APK..., chargez l’APK de production, et dépliez lib. À l’intérieur vous verrez un dossier par ABI, normalement arm64-v8a et x86_64. La colonne Alignment affiche des messages d’avertissement en face des fichiers qui ont un problème d’alignement. Les avertissements propres à Android Studio et Lint mettront eux aussi en évidence les bibliothèques natives non conformes: vous pouvez donc voir le même constat remonter à plusieurs endroits.
Notez chaque nom de fichier signalé avant de toucher au moindre numéro de version. Contrôlez les deux dossiers d’ABI séparément: il est tout à fait normal que arm64-v8a passe alors que x86_64 échoue, ou l’inverse, parce que ce sont des binaires différents compilés par des pipelines potentiellement différents.
Décoder la sortie en ligne de commande
Si vous préférez travailler dans un terminal, Google livre check_elf_alignment.sh, qui rapporte ALIGNED ou UNALIGNED pour un APK, et vous pouvez inspecter une bibliothèque isolée avec llvm-objdump. Les deux exigent Android SDK Build-Tools 35.0.0 ou plus récent. Collez ci-dessous ce qu’ils affichent et l’outil vous le relira.
Instrument 05
Décodeur ELF
Collez la sortie de llvm-objdump -p file.so | grep LOAD, de check_elf_alignment.sh ou de zipalign -c -P 16. Tout est analysé dans votre navigateur; rien n’est envoyé nulle part.
Déterminer quelle dépendance la fournit
La Play Console et APK Analyzer vous donnent tous les deux un nom de fichier et aucun propriétaire. Saisissez-le ci-dessous et l’outil vous dira ce que l’on sait de ce binaire, avec la qualité de la preuve attachée, et vous donnera les commandes de recherche avec votre nom de fichier déjà en place.
Instrument 06
Recherche de propriétaire de bibliothèque
./gradlew app:dependencies vous montre le graphe de dépendances résolu, ce qui est la façon de trouver le paquet transitif qui a tiré une bibliothèque que vous n’avez jamais ajoutée vous-même. Il ne vous dira pas directement quel artefact contient un .so donné: associez-le donc à la décompression de l’AAR suspect. Ce sont des techniques de diagnostic pratiques, pas des étapes imposées par Google.
Vérifier l’app bundle, pas seulement l’APK local
Votre APK local et les APK que Google Play génère à partir de votre bundle sont des artefacts différents. L’alignement ELF vit à l’intérieur de chaque bibliothèque; l’alignement ZIP est une propriété de la façon dont l’archive a été empaquetée; et le bundle porte une configuration qui indique à Play lequel utiliser. Les trois peuvent diverger, et seul le dernier décide de ce que les utilisateurs installent.
C’est le mécanisme derrière la version la plus frustrante du problème: le développeur met tout à jour, inspecte l’APK local, obtient une sortie propre, importe, et l’avertissement est toujours là. Rien de ce qu’il a vérifié n’était faux. Il n’a simplement jamais vérifié ce que Play évalue.
Ce que vous avez inspecté
app-release.apk sur votre machineCompilé directement par Gradle sur votre matériel, avec votre comportement d’empaquetage. Passer zipalign ici prouve que ce fichier est correctement empaqueté.
Ce que Play évalue
Les APK générés depuis app-release.aabCompilés par Google à partir de votre bundle, avec l’alignement que le bundle demande. Si le bundle dit 4 KB, ces APK sont faux quelle que soit la propreté de votre APK local.
Lancez donc ceci sur le bundle que vous vous apprêtez à importer, à chaque fois:
bundletool dump config --bundle=app-release.aab | grep alignment
PAGE_ALIGNMENT_16K est le résultat que vous voulez. PAGE_ALIGNMENT_4K signifie que le bundle demande à bundletool d’empaqueter les bibliothèques natives sur des frontières de 4 KB: chaque APK que Play en tire sera donc faux. Google avertit spécifiquement qu’Android Gradle Plugin 8.3 à 8.5 peut produire exactement cet écart: le build local paraît aligné, et l’application que Play construit à partir du bundle ne s’installera pas correctement sur un appareil 16 KB. La correction à privilégier est le passage à Android Gradle Plugin 8.5.1 ou plus récent.
Toutes les commandes, avec vos propres noms de fichiers
Saisissez vos noms de fichiers une seule fois. Chaque commande ci-dessous se réécrit, et chaque onglet affiche la sortie exacte qui compte comme une réussite: vous ne devinez jamais si un résultat était bon.
Instrument 07
Labo de commandes
Ne vous arrêtez pas à "APK Analyzer dit aligné"
Une inspection d’APK réussie est un contrôle sur quatre, pas la ligne d’arrivée. Confirmez l’alignement ELF des segments LOAD, l’alignement ZIP de l’APK, la configuration du bundle et le comportement à l’exécution de l’artefact que Play génère réellement. Un seul de ces quatre points en échec suffit à maintenir l’avertissement sur votre compte après un build que vous croyiez corrigé.
AGP, NDK et le piège de l’empaquetage
Deux versions portent l’essentiel du poids. Le NDK r28 ou supérieur compile le code natif aligné 16 KB par défaut, et Android Gradle Plugin 8.5.1 ou supérieur empaquette correctement les bibliothèques natives non compressées sur des frontières ZIP de 16 KB. Ni l’un ni l’autre ne peut réparer un binaire précompilé arrivé dans une dépendance.
Le terrain dangereux, c’est Android Gradle Plugin 8.3 à 8.5. Dans cette plage, un build local peut sembler parfaitement correct alors que bundletool n’aligne pas en ZIP les APK qu’il produit à partir de votre bundle pour Play, et la formulation de Google est sans détour sur le résultat: l’application construite à partir de ce bundle ne s’installera pas correctement. Si vous êtes en 8.5.0 et que votre APK local passe toutes les vérifications imaginables, c’est la première chose à écarter.
Instrument 08
Vérificateur de chaîne d’outils
Référence des réglages de build
| Situation | Réglage | Remarques |
|---|---|---|
| NDK à privilégier | r28 ou supérieur |
Produit une sortie native alignée 16 KB par défaut |
| AGP à privilégier | 8.5.1 ou supérieur |
Gère les bibliothèques natives non compressées sur des frontières ZIP de 16 KB |
| NDK r27 ou antérieur | -Wl,-z,max-page-size=16384 |
Option d’édition de liens obligatoire sur chaque cible native |
| NDK r27 ou antérieur | -Wl,-z,common-page-size=16384 |
À utiliser conjointement avec l’option de taille de page maximale |
ndk-build |
LOCAL_LDFLAGS += ... |
Appliquez les deux options à chaque cible native |
| CMake | target_link_options(...) |
Appliquez les deux options à chaque cible concernée |
| Impossible de mettre AGP à jour | jniLibs.useLegacyPackaging = true |
Compresse les bibliothèques natives; augmente l’espace disque installé |
| AGP 8.0 ou antérieur | android.bundle.enableUncompressedNativeLibs=false |
Propriété historique supplémentaire, en plus de l’option ci-dessus |
| Code d’exécution | getpagesize() ou sysconf(_SC_PAGESIZE) |
Remplacez les 4096 codés en dur et les hypothèses de PAGE_SIZE fixe |
Ce que l’empaquetage ne peut pas corriger
Si votre propre code C ou C++ suppose une taille de page, aucun réglage de build ne vous sauvera. Retirez les valeurs 4096 codées en dur et toute dépendance à une constante PAGE_SIZE fixe, interrogez la vraie valeur à l’exécution avec getpagesize() ou sysconf(_SC_PAGESIZE), et passez en revue chaque appel à mmap() ainsi que tout argument que vous alignez sur une page à la main. C’est la catégorie de panne où une application s’installe proprement sur un appareil 16 KB, passe les contrôles du bundle, puis plante la première fois qu’elle touche au mappage mémoire.
Ordre des opérations
Corrigez le volet compilateur avant le volet empaquetage. Si vous appliquez d’abord le contournement d’empaquetage historique, votre APK se mettra à passer zipalign alors que les bibliothèques qu’il contient sont encore compilées pour des pages de 4 KB, et vous aurez caché le vrai problème derrière un résultat vert.
Tester dans un vrai environnement 16 KB
Une seule commande décide si votre test veut dire quelque chose: adb shell getconf PAGE_SIZE doit renvoyer 16384. Lancez-la avant chaque session. Un émulateur qui a discrètement démarré en mode 4 KB laissera un build cassé passer tout ce que vous lui enverrez.
Vous avez trois voies pratiques et deux voies spécialisées. Prenez celle à laquelle vous pouvez réellement accéder aujourd’hui: pour détecter les défaillances de taille de page, il n’y a aucune différence de qualité entre elles.
Instrument 09
Choix d’environnement de test
Limite
Puis, systématiquement, avant tout test
adb shell getconf PAGE_SIZE
Ne continuez pas tant que la sortie n’est pas 16384.
Ce qu’il faut réellement solliciter
Une fois l’environnement confirmé, le passage de test utile n’est pas "est-ce que ça démarre". Les défaillances natives se concentrent dans les fonctionnalités qui touchent au code natif: sollicitez-les donc délibérément, démarrage à froid, navigation dans l’application, appareil photo, lectures et écritures en base de données, lecture et enregistrement de médias, authentification, tâches en arrière-plan, toute fonctionnalité d’apprentissage automatique ou de réalité augmentée, chaque surface de plugin natif, et tout ce qui, dans votre propre code, utilise le mappage mémoire. Si une fonctionnalité repose sur une des bibliothèques que vous venez de mettre à jour, cette fonctionnalité est le test.
Le mode de compatibilité n’est pas une réussite
Android peut faire tourner certaines applications alignées sur 4 KB sur un appareil 16 KB via un chemin de compatibilité, et vous pouvez voir un avertissement au premier lancement quand c’est le cas. Google recommande tout de même un alignement 16 KB correct pour une fiabilité et une stabilité optimales. Une application qui ne tourne que parce que le mode de compatibilité est intervenu n’est pas une application corrigée, et publier sur cette base signifie que la vraie panne est encore devant vous.
Pourquoi l’avertissement survit à une mise à jour
Presque tous les cas de "je l’ai pourtant déjà corrigé" relèvent de treize situations précises, et onze d’entre elles se prouvent à partir de l’artefact que vous avez sous les yeux. Choisissez le symptôme qui correspond et vous connaîtrez en général la cause avant d’avoir fini de le lire.
Instrument 10
Triage des blocages
Deux de ces cas méritent une réserve plutôt qu’une réponse assurée. Aucune source primaire n’établit le délai que met Google Play à réévaluer un bundle importé: si votre avertissement persiste juste après un import, la démarche honnête consiste à confirmer que le nouveau code de version apparaît bien dans vos dernières versions et app bundles, puis à revérifier plus tard, plutôt qu’à faire confiance à un chiffre lu quelque part sur les délais de traitement. Et une application qui ne tourne que parce que le mode de compatibilité est intervenu n’a pas été corrigée: elle a été accommodée.
Les bibliothèques tierces qui reviennent sans cesse
Ce sont des exemples signalés, pas un classement de leur fréquence, et pas une promesse qu’une version donnée corrigera votre build. Un paquet peut ajouter, retirer ou remplacer des artefacts natifs dans n’importe quelle version. L’autorité finale reste toujours le binaire présent dans votre propre bundle de production.
Servez-vous en comme point de départ quand un nom de fichier vous semble familier, puis vérifiez face aux versions actuelles et aux issues ouvertes du projet concerné. Quand la preuve vient de l’issue tracker d’un mainteneur plutôt que d’une note de version, la carte le dit.
Instrument 11
Index des bibliothèques signalées
libobjectbox-jni.so
D’anciennes bibliothèques natives Android échouaient dans un environnement 16 KB. Aucune version corrigée précise n’a pu être confirmée ici avec assez de solidité pour être publiée. Consultez les notes de version actuelles d’ObjectBox pour repérer la version qui a ajouté la prise en charge des 16 KB, puis vérifiez le binaire dans votre APK compilé plutôt que de vous fier au seul numéro de version.
bibliothèque Android embarquée
Le SDK Dart d’ObjectBox embarque sa propre bibliothèque Android. Aucune version corrigée précise n’a pu être confirmée ici avec assez de solidité pour être publiée. Consultez les notes de version actuelles d’ObjectBox, puis vérifiez l’artefact que votre build résout réellement.
libsqlite3.so
Une ancienne dépendance 3.43.0 est apparue dans des empaquetages Flutter et AWS Amplify concernés. Les preuves issues des issues identifient 3.46.1+1 comme la version qui a ajouté la prise en charge des 16 Kio. Vérifiez la version de dépendance résolue, pas seulement celle que vous avez déclarée, car un paquet de framework peut en épingler une plus ancienne.
sqlcipher-android
L’ancien paquet android-database-sqlcipher est déprécié en amont au profit du paquet maintenu sqlcipher-android. Aucune version précise n’a pu être confirmée ici avec assez de solidité pour être publiée comme minimum corrigé: migrez donc vers le paquet maintenu actuel et validez chaque ABI dans l’application compilée plutôt que de vous fier à un numéro de version.
binaires de traitement média
Le dépôt FFmpegKit d’origine a été retiré, et aucune version conforme universellement sûre n’a été établie. La qualité des forks varie. Identifiez précisément quel fork votre build résout, inspectez directement ses artefacts par ABI, et pesez la maintenance et la provenance avant d’en adopter un comme correctif.
binaires Realm et JNI
Les signalements se contredisent. La version 20.1.0 a été pointée, et un rapport ultérieur indiquait que la 20.2.0 avait réparé un binaire Realm alors qu’un autre binaire JNI restait problématique. Aucune version sûre unique ne peut être nommée de façon responsable: mettez à jour, puis contrôlez individuellement chaque bibliothèque apportée par Realm.
libmediapipe_tasks_vision_jni.so
Signalé avec un alignement 2**12. Aucune version corrigée n’a été établie dans l’issue consultée: traitez donc la compatibilité comme dépendante de la version, consultez les notes de version actuelles, mettez à jour, et vérifiez le binaire dans votre propre build.
artefact OpenCV Android
Un problème d’alignement a été signalé sur un artefact Android d’OpenCV 5.0.0. L’issue du dépôt fait référence à un correctif de CI, mais aucun artefact publié précis n’a pu être établi de façon sûre. Téléchargez l’AAR exact dont vous dépendez, décompressez-le, et inspectez vous-même les bibliothèques.
lib_burst_generated.so
La recommandation d’Unity elle-même est de mettre à jour le paquet Burst en 1.8.21 ou plus récent quand ce fichier est signalé. C’est la seule entrée de l’index appuyée sur une documentation officielle d’éditeur plutôt que sur des signalements d’issues.
libUnityARCore.so, libquack.so et d’autres
Des signalements de la communauté citent ces binaires parmi ceux qui survivent à une montée de version de l’éditeur. Il n’existe aucune version universelle à citer, car chacun appartient à un paquet différent. Servez-vous du nom de fichier exact pour décider quel paquet poursuivre.
Aucune entrée ne correspond à ce filtre. C’est normal: cet index couvre des exemples signalés, pas toutes les bibliothèques de l’écosystème. Utilisez la recherche de propriétaire de bibliothèque et tracez le fichier dans votre propre projet.
Pourquoi cet index est court: le nombre d’issues indique quels projets ont des utilisateurs bruyants, pas quelles bibliothèques sont les plus installées. Publier un classement des "coupables les plus fréquents" reviendrait à inventer une statistique. Ce qui se généralise, en revanche, c’est la méthode: prenez le nom de fichier, trouvez le paquet, vérifiez les versions actuelles de ce paquet, contrôlez le binaire dans votre build.
Le lien avec l’échéance API 36 du 31 août 2026
Ce sont deux exigences Google Play indépendantes qui se rejoignent en un seul point. Monter votre niveau d’API cible peut faire apparaître l’avertissement 16 KB, parce que l’exigence s’applique aux applications qui ciblent Android 15 (niveau d’API 35) ou supérieur. Ce changement ne crée pas le mauvais alignement et il ne peut pas le corriger.
Google Play impose aux nouvelles applications et aux mises à jour de cibler Android 16 (niveau d’API 36) à partir du 31 août 2026, avec une prolongation possible jusqu’au 1er novembre 2026. C’est un changement de manifeste et de comportement. La règle des 16 KB, elle, est un changement de compatibilité binaire. Le développeur qui monte targetSdk un lundi et voit un avertissement 16 KB le mardi n’a rien cassé: les bibliothèques natives étaient déjà compilées pour des pages de 4 KB, et le niveau cible plus élevé a simplement fait entrer l’application dans le périmètre d’un contrôle qui allait de toute façon s’appliquer.
Exigence A
Cibler l’API 36- Date 31 août 2026, prolongation jusqu’au 1er novembre 2026
- Périmètre Nouvelles applications et mises à jour
- Se joue dans Votre manifeste et votre configuration de build
- Se corrige par La montée du niveau cible et la prise en compte des changements de comportement d’Android 16
Exigence B
Prise en charge des pages de 16 KB- Date 1er février 2027
- Périmètre Applications ciblant l’API 35+ sur appareils 64 bits
- Se joue dans Les binaires natifs à l’intérieur de votre bundle
- Se corrige par La recompilation ou le remplacement de chaque bibliothèque mal alignée
En pratique, traitez-les comme une seule migration avec deux preuves. Vous allez monter le niveau cible de toute façon: planifiez l’audit des bibliothèques natives dans la même version plutôt que de le découvrir en pleine course à l’API 36. Pour l’ensemble des niveaux par format d’appareil, des exceptions et du mécanisme de prolongation, voyez notre article sur l’échéance API 36 de Google Play, et pour toute la séquence du compte à la production, notre article sur les exigences de publication 2026.
Le contrôle à passer avant l’import
Onze vérifications, chacune avec une preuve de réussite précise. Parcourez-les avant d’importer plutôt qu’après que Play vous ait signalé un problème: vous transformez ainsi une session de débogage sans limite en une liste finie.
Instrument 12
Contrôle avant import
0 sur 11 validés
Rien de prouvé pour l’instant. Commencez par le build que vous comptez réellement importer, pas par le dernier que vous aviez sous la main.
Votre progression est enregistrée dans ce navigateur uniquement. Rien n’est envoyé nulle part, et vider les données du navigateur l’efface.
Valider les onze points prouve l’alignement technique face aux vérifications citées sur cette page. Ce n’est pas une promesse d’approbation. Google Play peut toujours soulever sur le même import des problèmes de règles, de contenu ou de qualité sans rapport, et aucune checklist au monde ne peut parler à leur place.
Là où cela percute votre test fermé
Rien sur cette page ne modifie votre exigence de testeurs, et rien du côté de vos testeurs ne modifie votre build. Les deux problèmes ne se percutent que sur un seul axe: le temps. Un test fermé de 14 jours tourne sur une horloge que vous ne pouvez pas arrêter, et une enquête sur des bibliothèques natives tourne sur une horloge que personne ne sait prévoir.
Le scénario qui fait mal ressemble à ceci. Un compte de développeur personnel démarre un test fermé, la fenêtre de 14 jours d’inscription sans interruption commence, et quelque part au milieu une montée du niveau cible fait apparaître un avertissement 16 KB. Le développeur recompile alors ses dépendances natives pendant qu’un groupe de testeurs doit rester intact autour de lui. Importer une nouvelle version dans le canal de test ne pose aucun problème, et Google encourage même les développeurs à continuer de mettre à jour pendant un test. Ce qui casse la série, c’est que le côté testeurs devienne silencieux.
C’est exactement la partie que PrimeTestLab maintient stable. Nous fournissons 12 testeurs réels sur de vrais appareils couvrant Android 7 à 17, inscrits et maintenus pendant les 14 jours complets, pour que votre recompilation se déroule face à un test stable et non à un test qui s’effondre. Le test démarre en 4-6 heures, et nous avons mené cette opération sur 7 400+ applications dans 120+ pays avec un taux de réussite de 99.9%.
Recruter vos testeurs vous-même ou passer par un test géré
| L’exigence de Google | Recruter vous-même | Test géré |
|---|---|---|
| Au moins 12 testeurs inscrits | Trouver, briefer et relancer de vraies personnes, puis espérer qu’aucune ne se désinscrive | 12 fournis et maintenus pendant toute la fenêtre |
| 14 jours sans interruption | Un seul testeur qui part en cours de route casse la continuité | Le groupe est surveillé pour que la fenêtre reste intacte |
| De vrais appareils, de vraies personnes | Les émulateurs et les comptes inactifs sont le raccourci habituel, et la raison habituelle d’un échec | De vrais appareils, d’Android 7 à 17 |
| Délai avant la première inscription | Plusieurs jours, selon qui vous répond | Le test démarre en 4-6 heures |
| Coût | Votre temps, pendant la semaine où vous recompilez déjà vos bibliothèques | Dès $19.99 plus 5% de frais de service |
| Recompiler en cours de test | Chaque nouvel import oblige à redemander aux gens de mettre à jour | Publiez librement de nouvelles versions, le groupe reste inscrit |
Pour être direct sur la limite: nous ne recompilons pas vos bibliothèques natives et cet article n’est pas un argumentaire de vente pour le faire. Le travail sur les 16 KB est le vôtre, et tout ce qui précède cette section est écrit pour le rendre aussi court que possible. Ce que nous vous enlevons, c’est l’exigence de testeurs qui court en parallèle, pour que les deux problèmes cessent de se disputer la même quinzaine.
Conseil de séquencement
Si vous n’avez pas encore démarré le test fermé et que vous savez déjà que vous embarquez des bibliothèques natives, lancez d’abord la fenêtre de testeurs et faites le travail d’alignement à l’intérieur. La période qualifiante de Google se mesure sur la continuité de l’inscription des testeurs plutôt que sur un build figé, et Google encourage les développeurs à continuer de mettre à jour pendant un test: les deux calendriers peuvent donc se chevaucher au lieu de s’empiler. Gardez le même canal de test et le même groupe de testeurs pendant l’opération. C’est souvent une semaine complète de gagnée.
Questions fréquentes
Google Play refuse-t-il déjà les applications non compatibles 16 KB?
La documentation actuelle de Google indique qu’à partir du 1er février 2027 vous ne pourrez plus publier de mises à jour ciblant Android 15 (niveau d’API 35) ou supérieur sans prise en charge des 16 KB sur les appareils 64 bits. Avant cette date, la plupart des développeurs voient un avertissement de compatibilité dans la Play Console plutôt qu’un blocage ferme. La conséquence documentée sur la page Google citée est l’impossibilité de publier des mises à jour non conformes, pas le retrait automatique d’une application déjà publiée.
Pourquoi Google annonce-t-il le 1er février 2027 alors que d’autres articles disent le 1er novembre 2025?
Le 1er novembre 2025 était l’échéance annoncée à l’origine par Google et le 31 mai 2026 une date de prolongation historique ultérieure. Au 5 août 2026, la page Android Developers actuelle et la capture d’écran actuelle de l’avertissement dans la Play Console affichent toutes deux le 1er février 2027: c’est donc la source primaire la plus récente qui fait foi. Beaucoup d’articles de blog et de réponses d’IA citent encore les anciennes dates parce qu’ils ont été écrits avant le changement.
Je n’ai jamais écrit de C++. Pourquoi mon application est-elle concernée?
Un framework, un SDK, un plugin, un moteur de jeu, une base de données, un composant multimédia ou un générateur d’applications peut ajouter des fichiers natifs .so même si votre propre code source est en Dart, JavaScript, Python, Java ou Kotlin. Les recommandations de Google incluent explicitement les applications qui utilisent des bibliothèques NDK indirectement, via une dépendance. Ouvrez l’APK dans Android Studio avec Build puis Analyze APK: le moindre fichier .so sous lib signifie que l’application empaquetée utilise du code natif.
Une application en Kotlin pur nécessite-t-elle des changements?
Selon Google, une application qui n’utilise que Java ou Kotlin, bibliothèques et SDK compris, prend déjà en charge les appareils 16 KB. Google recommande tout de même de tester dans un environnement 16 KB pour détecter des régressions inattendues. Vérifiez que l’APK de production réel ne contient aucun répertoire lib avant de qualifier votre application de Kotlin pur, car une seule dépendance d’analytics ou de base de données suffit à en ajouter un.
Quelle version de Flutter corrige l’avertissement de taille de page 16 KB?
Aucune source officielle n’établit une version de Flutter qui garantirait la conformité de toutes les applications et de tous les plugins Flutter. Les notes de version de Flutter 3.27 sont plus étroites qu’elles n’en ont l’air: elles couvrent la prise en charge des 16 KB pour les modèles plugin_ffi en particulier, pas le moteur entier. Flutter 3.38 est le jalon documenté le plus solide: Flutter a explicitement présenté cette montée de version comme une préparation à l’exigence 16 KB de Play et est passé au NDK r28 par défaut. L’action la plus sûre consiste à passer à la version stable actuelle de Flutter, à mettre à jour chaque plugin natif, à recompiler le bundle de production et à inspecter chaque fichier .so qui en sort.
Quelle version de React Native prend en charge les pages de 16 KB?
React Native 0.77 est la version de référence officielle et sans ambiguïté. Son annonce de version indique que React Native est prêt à prendre pleinement en charge les tailles de page de 16 KB. Les modules natifs communautaires, le code C++ local et les SDK tiers peuvent toujours livrer des binaires incompatibles: passez par le chemin de migration React Native ou Expo pris en charge, puis inspectez l’APK généré.
De quelle version d’Unity ai-je besoin pour la prise en charge des pages de 16 KB?
Unity indique 6000.1 ou plus récent, 6000.0.38f1 ou plus récent, 2022.3.56f1 ou plus récent, et 2021.3.48f1 ou plus récent en LTS étendu pour les clients Enterprise ou Industry éligibles. Mettez également à jour vos plugins natifs, et passez Burst en 1.8.21 ou plus récent si la Play Console nomme lib_burst_generated.so. Une version d’éditeur prise en charge est nécessaire mais pas suffisante, car les plugins tiers livrent leurs propres binaires.
Comment trouver le fichier .so exact qui échoue?
Ouvrez l’APK via Build puis Analyze APK dans Android Studio, dépliez lib/arm64-v8a et lib/x86_64, et lisez la colonne Alignment, qui affiche des avertissements pour les fichiers ayant un problème d’alignement. Pour une confirmation en ligne de commande, lancez le script check_elf_alignment.sh de Google sur l’APK, ou inspectez une bibliothèque avec llvm-objdump -p file.so passé dans grep LOAD. Tout alignement LOAD inférieur à 2**14 demande une intervention.
Pourquoi mon APK passe-t-il alors que mon app bundle échoue toujours?
L’alignement ELF à l’intérieur d’une bibliothèque et l’alignement ZIP à l’intérieur de l’artefact empaqueté sont deux contrôles distincts. Lancez bundletool dump config --bundle=app.aab et cherchez alignment: PAGE_ALIGNMENT_16K passe, tandis que PAGE_ALIGNMENT_4K signifie que les APK générés sont toujours demandés en 4 KB. Google avertit spécifiquement qu’Android Gradle Plugin 8.3 à 8.5 peut sembler correct en local alors que les APK que Play construit à partir de votre bundle ne sont pas correctement alignés en ZIP: passez donc en 8.5.1 ou plus récent.
Passer au NDK r28 suffit-il à corriger le problème?
Non. Le NDK r28 et supérieur compile aligné 16 KB par défaut, mais cela ne concerne que le code natif compilé pendant votre build. Cela ne peut pas réécrire un fichier .so précompilé qui arrive dans un AAR, un plugin ou un paquet de moteur de jeu tiers. Chaque dépendance native précompilée doit elle-même être mise à jour, remplacée, ou recompilée puis réimportée.
Comment tester la prise en charge des 16 KB sans posséder de téléphone compatible?
Installez une des images système 16 KB de l’émulateur Android de Google via le SDK Manager, ou réservez un appareil compatible sur Samsung Remote Test Lab. Quoi que vous utilisiez, confirmez d’abord l’environnement avec adb shell getconf PAGE_SIZE: la sortie doit valoir 16384 pour que le test ait un sens. Un succès sur émulateur prouve le comportement à l’exécution, pas l’empaquetage: continuez donc aussi d’inspecter le bundle de production.
Corriger la prise en charge des 16 KB remet-il à zéro ou perturbe-t-il mon test fermé?
Google mesure la période qualifiante autour d’au moins 12 testeurs qui restent inscrits sans interruption pendant 14 jours, pas autour d’un build figé, et encourage les développeurs à continuer de mettre à jour le build pendant un test. Google ne publie pas de garantie explicite couvrant tous les cas de remplacement de build: l’approche la plus sûre consiste donc à garder votre groupe de testeurs stable pendant que vous publiez un bundle recompilé conforme 16 KB en cours de test. PrimeTestLab fournit 12 testeurs réels sur de vrais appareils dès $19.99 plus 5% de frais de service, et maintient le groupe pendant les 14 jours complets.
L’essentiel
Synthèse
Google Play impose aux applications ciblant Android 15 (niveau d’API 35) ou supérieur de prendre en charge les pages mémoire de 16 KB sur les appareils 64 bits, et à partir du 1er février 2027 les mises à jour non conformes ne pourront plus être publiées. Le 1er novembre 2025 et le 31 mai 2026 sont des dates mortes qui se classent encore dans les résultats. Les applications en Java ou Kotlin pur sont déjà conformes. Tous les autres suivent les trois mêmes étapes: nommer le .so fautif, mettre à jour le paquet qui le fournit, puis prouver l’artefact par deux contrôles indépendants, chaque segment ELF LOAD aligné sur 2**14 ou plus, et le bundle qui rapporte PAGE_ALIGNMENT_16K. AGP 8.5.1+ avec NDK r28+ est la chaîne d’outils par défaut la plus sûre, et ni l’un ni l’autre ne peut réparer un binaire compilé par quelqu’un d’autre. Si tout cela tombe en plein test fermé, le volet testeurs est la partie que vous pouvez déléguer. Voir les plans tarifaires →
Sources primaires
Ce qui se périmera en premier sur cette page
- La date du 1er février 2027. Google a déjà déplacé ce calendrier plus d’une fois. Vérifiez la mention "Dernière mise à jour" en bas du guide sur les tailles de page avant de planifier une version autour de cette date.
- Les libellés de la Play Console. Les textes et la navigation de la Console changent indépendamment des pages de règles: les intitulés exacts que vous voyez peuvent différer de ceux reproduits ici.
- Les versions de référence des frameworks. Flutter publie des versions stables très souvent, la politique de support de React Native évolue et l’éligibilité au LTS Unity change. Vérifiez dans les notes de version actuelles plutôt que sur un numéro imprimé dans un article.
- L’index des bibliothèques signalées. N’importe quel paquet peut ajouter, remplacer ou faire régresser un binaire natif dans n’importe quelle version. Vérifiez toujours l’artefact de votre propre bundle.
- Les noms des images d’émulateur. Les images étiquetées expérimentales peuvent être renommées ou promues: la chaîne exacte visible dans le SDK Manager peut ne plus correspondre.
Vérifié dans la documentation de Google le 9 août 2026. Révisé chaque mois jusqu’à au moins un mois après l’entrée en vigueur.