Assurer la compatibilité avec les tailles de page de 16 Ko

Exigence de compatibilité avec Google Play (16 ko)
À partir du 1er novembre 2025, toutes les nouvelles applications et les mises à jour d'applications existantes envoyées sur Google Play et ciblant les appareils Android 15 ou version ultérieure devront être compatibles avec les tailles de page de 16 ko sur les appareils 64 bits.

从历史上看,Android 仅支持 4 KB 内存页面大小,这优化了系统内存性能,以适应 Android 设备通常拥有的平均总内存量。从 Android 15 开始,AOSP 支持配置为使用 16 KB 页面大小的设备(16 KB 设备)。如果您的应用直接或通过 SDK 间接使用任何 NDK 库,则需要重新构建应用,才能在这些 16 KB 设备上运行。

随着设备制造商不断制造出具有更大物理内存 (RAM) 的设备,许多此类设备将采用 16 KB(最终甚至更大)的页面大小来优化设备性能。添加对 16 KB 页面大小设备的支持,可让您的应用在这些设备上运行,并帮助您的应用受益于相关的性能改进。如果不重新编译,应用将无法在未来 Android 版本的 16 KB 设备上运行。

为帮助您为应用添加支持,我们提供了相关指南,介绍了如何检查应用是否受到影响、如何重新构建应用(如果适用),以及如何使用模拟器(包括 Android 模拟器的 Android 15 系统映像)在 16 KB 环境中测试应用

Avantages et gains de performances

Les appareils configurés avec une taille de page de 16 Ko utilisent un peu plus de mémoire en moyenne, mais bénéficient également de diverses améliorations des performances pour le système et les applications:

  • Temps de lancement des applications plus courts lorsque le système est soumis à une pression de mémoire: 3,16 % de moins en moyenne, avec des améliorations plus importantes (jusqu'à 30%) pour certaines applications que nous avons testées
  • Consommation d'énergie réduite au démarrage de l'application: réduction de 4,56% en moyenne
  • Lancement plus rapide de l'appareil photo: démarrage à chaud 4,48% plus rapide en moyenne et démarrage à froid 6,60% plus rapide en moyenne
  • Amélioration du temps de démarrage du système: 8% (environ 950 millisecondes) en moyenne

Ces améliorations sont basées sur nos premiers tests. Les résultats sur les appareils réels seront probablement différents. Nous fournirons une analyse supplémentaire des gains potentiels pour les applications à mesure que nous poursuivrons nos tests.

Vérifier si votre application est concernée

如果您的应用使用了任何原生代码,则应重新构建应用,使其支持 16 KB 设备。如果您不确定自己的应用是否使用了原生代码,可以使用 APK 分析器来确定是否存在任何原生代码,然后检查您找到的任何共享库的 ELF 段对齐情况。Android Studio 还提供了一些功能,可帮助您自动检测对齐问题

如果您的应用仅使用以 Java 或 Kotlin 编程语言编写的代码(包括所有库或 SDK),则该应用已支持 16 KB 设备。不过,我们建议您在 16 KB 环境中测试应用,以验证应用行为是否出现意外的回归。

Votre application utilise-t-elle du code natif ?

C'est le cas si l'une des conditions suivantes s'applique :

  • Votre application utilise du code C/C++ (natif). Si votre application utilise le NDK Android, elle utilise du code natif.
  • Votre application est associée à des bibliothèques ou dépendances natives tierces (telles que des SDK) qui les utilisent.
  • Votre application est conçue par un outil de création d'applications tiers qui utilise des bibliothèques natives sur l'appareil.

Identifier les bibliothèques natives à l'aide de l'analyseur d'APK

L'analyseur d'APK est un outil qui vous permet d'évaluer divers aspects d'un APK créé. Pour vérifier si votre application utilise du code natif (qu'elle soit ou non compatible avec les pages de 16 ko) :

  1. Ouvrez Android Studio, puis cliquez sur File > Open (Fichier > Ouvrir) et choisissez un projet.
  2. Dans la barre de menu, cliquez sur Build > Analyze APK… (Compiler > Analyser l'APK…).

    Option du menu "Build" (Compilation) de Studio permettant de lancer l'analyseur d'APK
  3. Sélectionnez l'APK que vous souhaitez analyser.

  4. Regardez si le dossier lib contient des fichiers d'objet partagé (.so). Si des fichiers d'objets partagés sont présents, votre application utilise du code natif. La colonne Alignement affiche des messages d'avertissement pour les fichiers qui présentent des problèmes d'alignement. Si aucun fichier d'objet partagé n'est présent ou si le dossier lib n'existe pas, votre application n'utilise pas de code natif.

    Vue de l'analyseur d'APK montrant que des fichiers d'objets partagés sont présents

Détecter les problèmes d'alignement grâce aux vérifications automatisées

Android Studio vous avertit de manière proactive si vos bibliothèques ou APK prédéfinis ne respectent pas la limite de 16 Ko. Utilisez l'outil d'analyse APK pour identifier les bibliothèques à mettre à jour ou les modifications de code à apporter.

Notifications d'avertissement Studio concernant les problèmes d'alignement dans un projet

Lint dans Android Studio met également en évidence les bibliothèques natives qui ne sont pas alignées sur 16 Ko.

Avertissement du linter Studio concernant une bibliothèque native non alignée

Vérifier l'alignement des segments ELF pour les bibliothèques partagées

Pour toutes les bibliothèques partagées, vérifiez que les segments ELF des bibliothèques partagées sont correctement alignés à l'aide de l'alignement ELF de 16 Ko. Si vous développez sur Linux ou macOS, vous pouvez utiliser le script check_elf_alignment.sh comme décrit dans la section suivante. Vous pouvez également utiliser directement les outils de ligne de commande.

Utiliser le script check_elf_alignment.sh (Linux ou macOS)

Pour vérifier l'alignement des segments ELF à l'aide du script check_elf_alignment.sh, procédez comme suit :

  1. Enregistrez le script check_elf_alignment.sh dans un fichier.

  2. Exécutez le script sur le fichier APK de votre application :

    check_elf_alignment.sh APK_NAME.apk
    

    Le script génère ALIGNED ou UNALIGNED pour toutes les bibliothèques partagées arm64-v8a.

  3. Si des bibliothèques partagées arm64-v8a ou x86_64 sont UNALIGNED, vous devrez mettre à jour l'empaquetage de ces bibliothèques, puis recompiler votre application et la tester à nouveau en suivant les étapes de cette section.

Utiliser directement les outils de ligne de commande

Pour vérifier l'alignement des segments ELF à l'aide des outils en ligne de commande, procédez comme suit :

  1. Assurez-vous que les outils de compilation du SDK Android version 35.0.0 ou ultérieure et le NDK Android sont installés à l'aide du SDK Manager dans Android Studio ou de l'outil de ligne de commande sdkmanager.
  2. Extrayez le fichier APK de votre application :

    Linux ou macOS

    unzip APK_NAME.apk -d /tmp/my_apk_out
    

    Windows (PowerShell)

    Expand-Archive -Path .\APK_NAME.apk -DestinationPath ~\tmp\my_apk_out
    
  3. Dans le répertoire temporaire dans lequel vous avez extrait votre fichier APK, vérifiez le contenu du répertoire lib pour les fichiers d'objet partagé (.so). Il s'agit des mêmes fichiers d'objets partagés que ceux que vous avez vus lors de l'identification des bibliothèques natives à l'aide de l'analyseur d'APK. Exécutez la commande suivante sur chaque fichier d'objet partagé :

    Linux ou macOS

    SDK_ROOT_LOCATION/Android/sdk/ndk/NDK_VERSION/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-objdump -p SHARED_OBJECT_FILE.so | grep LOAD
    

    Windows (PowerShell)

    SDK_ROOT_LOCATION\Android\sdk\ndk\NDK_VERSION\toolchains\llvm\prebuilt\windows-x86_64\bin\llvm-objdump.exe -p SHARED_OBJECT_FILE.so | Select-String -Pattern "LOAD"
    

    SDK_ROOT_LOCATION correspond au chemin d'accès au répertoire dans lequel vous avez installé le SDK Android, SHARED_OBJECT_FILE correspond au nom du fichier d'objet partagé que vous vérifiez et NDK_VERSION correspond à la version du NDK Android que vous avez installée (par exemple, 28.0.12433566). La sortie ressemblera à ce qui suit pour chaque fichier que vous vérifiez :

    LOAD off    0x0000000000000000 vaddr 0x0000000000000000 paddr 0x0000000000000000 align 2**14
    LOAD off    0x0000000000042a90 vaddr 0x0000000000043a90 paddr 0x0000000000043a90 align 2**14
    LOAD off    0x0000000000046230 vaddr 0x0000000000048230 paddr 0x0000000000048230 align 2**14
    
  4. Vérifiez les lignes de sortie pour vous assurer que les segments de chargement n'ont pas de valeurs inférieures à 2**14. Si des segments de chargement ont des valeurs 2**13, 2**12 ou inférieures, vous devrez mettre à jour le packaging de ces bibliothèques, puis recompiler votre application et la tester à nouveau en suivant les étapes de cette section.

  5. Exécutez ensuite l'outil de ligne de commande zipalign sur le fichier APK de votre application :

    Linux ou macOS

    SDK_ROOT_LOCATION/Android/sdk/build-tools/35.0.0/zipalign -v -c -P 16 4 APK_NAME.apk
    

    Windows (PowerShell)

    SDK_ROOT_LOCATION\Android\sdk\build-tools\35.0.0\zipalign.exe -v -c -P 16 4 APK_NAME.apk
    

    SDK_ROOT_LOCATION est le chemin d'accès au répertoire dans lequel vous avez installé le SDK Android, et APK_NAME est le nom du fichier APK de votre application. La dernière ligne du résultat indiquera "Validation réussie" si toutes les bibliothèques partagées sont correctement alignées.

    Si la validation a échoué, certaines bibliothèques partagées doivent être réalignées. Vous devrez donc mettre à jour le packaging de ces bibliothèques, puis recompiler votre application et la tester à nouveau en suivant les étapes de cette section.

Compiler votre application avec la prise en charge des appareils 16 Ko

Si votre application utilise du code natif, suivez les étapes décrites dans les sections suivantes pour vous assurer qu'elle est compatible avec les appareils de 16 Ko :

  1. Mettre à jour le packaging de vos bibliothèques partagées
  2. Compilez votre application en utilisant l'alignement ELF de 16 Ko.
  3. Corriger le code et résoudre les problèmes d'exécution
  4. Vérifier la compatibilité des SDK avec les pages de 16 Ko

Mettre à jour le packaging de vos bibliothèques partagées

Nous vous recommandons de passer à la version 8.5.1 ou ultérieure d'AGP et d'utiliser des bibliothèques partagées non compressées.

AGP version 8.5.1 ou ultérieure

Les appareils de 16 Ko nécessitent que les applications fournies avec des bibliothèques partagées non compressées les alignent sur une limite de 16 Ko alignée sur le format ZIP. Pour ce faire, vous devez passer au plug-in Android Gradle (AGP) version 8.5.1 ou ultérieure. Pour en savoir plus sur la procédure de mise à niveau, consultez la section Assistant de mise à niveau du plug-in Android Gradle.

AGP version 8.5 ou antérieure

Si vous ne pouvez pas mettre à niveau AGP vers la version 8.5.1 ou ultérieure, vous pouvez utiliser des bibliothèques partagées compressées. Mettez à jour votre configuration Gradle pour que Gradle compresse vos bibliothèques partagées lors de l'empaquetage de votre application. Vous éviterez ainsi les problèmes d'installation d'applications avec des bibliothèques partagées non alignées.

Groovy

Dans votre fichier build.gradle, ajoutez l'option suivante :

android {
  ...
  packagingOptions {
      jniLibs {
        useLegacyPackaging true
      }
  }
}

Kotlin

Dans votre fichier build.gradle.kts, ajoutez l'option suivante :

android {
  ...
  packagingOptions {
      jniLibs {
        useLegacyPackaging = true
      }
  }
}

Compilez votre application en utilisant l'alignement ELF de 16 ko

Pour que votre application s'exécute sur les appareils de 16 ko, les segments ELF des bibliothèques partagées doivent être correctement alignés à l'aide de l'alignement ELF de 16 ko.

Si vous êtes développeur de jeux et que votre jeu s'exécute sur le moteur de jeu Unity, consultez le guide Unity. Si votre jeu s'exécute sur le moteur de jeu Unreal, consultez le guide Unreal. Pour les moteurs de jeu natifs, poursuivez avec ce guide.

Pour compiler votre application à l'aide de l'alignement ELF de 16 Ko, suivez les étapes décrites dans l'une des sections suivantes, en fonction de la version du NDK Android que vous utilisez.

Android NDK r28 ou version ultérieure

Les versions r28 et ultérieures du NDK compilent par défaut les fichiers alignés sur 16 Ko.

Android NDK r27

Pour prendre en charge la compilation de bibliothèques partagées alignées sur 16 Ko avec Android NDK version r27 et ultérieure, vous devez mettre à jour vos indicateurs ndk-build, build.gradle, build.gradle.kts ou de l'éditeur de liens comme suit :

ndk-build

Dans votre Application.mk :

APP_SUPPORT_FLEXIBLE_PAGE_SIZES := true

Groovy

Dans votre fichier build.gradle, définissez l'argument -DANDROID_SUPPORT_FLEXIBLE_PAGE_SIZES=ON :

android {
  ...
  defaultConfig {
    ...
    // This block is different from the one you use to link Gradle
    // to your CMake or ndk-build script.
    externalNativeBuild {
      // For ndk-build, instead use the ndkBuild block.
      cmake {
        // Passes optional arguments to CMake.
        arguments "-DANDROID_SUPPORT_FLEXIBLE_PAGE_SIZES=ON"
      }
    }
  }
}

Kotlin

Dans votre fichier build.gradle.kts, définissez l'argument -DANDROID_SUPPORT_FLEXIBLE_PAGE_SIZES=ON :

android {
  ...
  defaultConfig {
    ...
    // This block is different from the one you use to link Gradle
    // to your CMake or ndk-build script.
    externalNativeBuild {
      // For ndk-build, instead use the ndkBuild block.
      cmake {
        // Passes optional arguments to CMake.
        arguments += listOf("-DANDROID_SUPPORT_FLEXIBLE_PAGE_SIZES=ON")
      }
    }
  }
}

Autres systèmes de compilation

Spécifiez les indicateurs de l'éditeur de liens suivants :

-Wl,-z,max-page-size=16384

Android NDK r26 et versions antérieures

Pour prendre en charge la compilation de bibliothèques partagées alignées sur 16 ko avec le NDK Android version r26 ou antérieure, vous devez mettre à jour votre configuration ndk-build ou cmake comme suit :

ndk-build

Mettez à jour votre Android.mk pour activer l'alignement ELF de 16 Ko :

LOCAL_LDFLAGS += "-Wl,-z,max-page-size=16384"

CMake

Mettez à jour votre CMakeLists.txt pour activer l'alignement ELF de 16 Ko :

target_link_options(${CMAKE_PROJECT_NAME} PRIVATE "-Wl,-z,max-page-size=16384")

Android NDK r22 et versions antérieures

En plus de l'étape décrite pour NDK r26 et les versions antérieures, vous devez définir common-page-size=16384 si vous utilisez NDK r22 ou une version antérieure. Le paramètre common-page-size=16384 est requis en raison de bugs dans les versions antérieures des éditeurs de liens GNU ld et LLVM lld. Toutefois, nous vous recommandons vivement de mettre à jour vos outils vers une version plus récente pour éviter complètement ces bugs.

Pour compiler des bibliothèques partagées compatibles avec 16 ko avec Android NDK version r22 ou antérieure, mettez à jour votre configuration ndk-build ou cmake comme suit :

ndk-build

Mettez à jour votre Android.mk pour créer un fichier ELF compatible avec les pages de 16 Ko :

LOCAL_LDFLAGS += "-Wl,-z,max-page-size=16384"
LOCAL_LDFLAGS += "-Wl,-z,common-page-size=16384"

CMake

Mettez à jour votre CMakeLists.txt pour créer un fichier ELF compatible avec les pages de 16 Ko :

target_link_options(${CMAKE_PROJECT_NAME} PRIVATE "-Wl,-z,max-page-size=16384")
target_link_options(${CMAKE_PROJECT_NAME} PRIVATE "-Wl,-z,common-page-size=16384")

Corriger le code et résoudre les problèmes d'exécution

Même si votre application est alignée sur 16 ko, elle peut rencontrer des erreurs si des emplacements de votre code partent du principe qu'un appareil utilise une taille de page spécifique. Pour éviter cela, procédez comme suit :

  1. Supprimez toutes les dépendances codées en dur qui font référence à la constante PAGE_SIZE ou aux instances de votre logique de code qui supposent que la taille de page d'un appareil est de 4 Ko (4096).

    Utilisez plutôt getpagesize() ou sysconf(_SC_PAGESIZE).

  2. Recherchez les utilisations de mmap() et d'autres API qui nécessitent des arguments alignés sur la page, et remplacez-les par des alternatives si nécessaire.

Dans certains cas, si votre application utilise PAGE_SIZE comme valeur pratique qui n'est pas liée à la taille de page sous-jacente, cela n'entraînera pas de dysfonctionnement de votre application lorsqu'elle est utilisée en mode 16 ko. Toutefois, si cette valeur est transmise au noyau avec mmap sans MAP_FIXED, le noyau utilise toujours une page entière, ce qui gaspille de la mémoire. Pour ces raisons, PAGE_SIZE n'est pas défini lorsque le mode 16 Ko est activé sur NDK r27 et versions ultérieures.

Si votre application utilise PAGE_SIZE de cette manière et ne transmet jamais directement cette valeur au noyau, créez une variable avec un nouveau nom au lieu d'utiliser PAGE_SIZE. Cela reflétera le fait qu'elle est utilisée à d'autres fins et ne reflète pas une page mémoire réelle.

Vérifier la compatibilité des SDK avec les pages de 16 Ko

De nombreux SDK sont compatibles avec les tailles de page de 16 Ko, en particulier si vous les créez vous-même ou si vous obtenez des précompilés récents. Toutefois, comme certains SDK précompilés ou certaines versions de SDK ne sont pas compatibles avec 16 Ko, vous devez consulter le site Web de chaque fournisseur de SDK pour déterminer quelle version utiliser avec 16 Ko.

Tester votre application dans un environnement de 16 ko

Une fois que vous avez créé votre application avec la prise en charge des appareils 16 ko, vous devez la tester dans un environnement 16 ko pour voir si elle présente des régressions. Pour ce faire, procédez comme suit :

  1. Configurez le SDK Android 15.

  2. Configurez l'un des environnements de test suivants :

  3. Démarrez votre appareil de test, puis exécutez la commande suivante pour vérifier qu'il utilise un environnement de 16 Ko :

    adb shell getconf PAGE_SIZE
    

    La commande doit renvoyer la valeur 16384.

  4. Exécutez la commande zipalign suivante pour vérifier que votre application est alignée sur 16 Ko, où APK_NAME est le nom du fichier APK de votre application :

    zipalign -c -P 16 -v 4 APK_NAME.apk
    
  5. Testez minutieusement votre application, en vous concentrant sur les zones qui pourraient être affectées par la modification des instances de code faisant référence à des tailles de page spécifiques.

Configurer Android Emulator avec une image système Android 15 basée sur 16 Ko

Pour configurer un environnement de 16 Ko à l'aide de l'émulateur Android, procédez comme suit :

  1. Les images système de l'émulateur Android 15 basées sur 16 Ko sont compatibles avec Android Studio Jellyfish | 2023.3.1 ou version ultérieure. Toutefois, pour une expérience optimale lorsque vous travaillez avec des appareils de 16 Ko, utilisez Android Studio Ladybug | 2024.2.1 ou version ultérieure.

    Nous travaillons constamment sur de nouvelles fonctionnalités. Pensez donc à télécharger les nouvelles versions ou la dernière version preview d'Android Studio dès qu'elles sont disponibles.

    N'oubliez pas que vous pouvez conserver la version existante d'Android Studio, puisque vous pouvez installer plusieurs versions simultanément.

  2. Dans Android Studio, cliquez sur Tools > SDK Manager (Outils > Gestionnaire de SDK).

  3. Dans l'onglet SDK Platforms (Plates-formes SDK), cochez Show Package Details (Afficher les détails du package), puis développez la section Android VanillaIceCream (Android VanillaIceCream) ou version ultérieure et sélectionnez une ou les deux images système de l'émulateur suivantes, en fonction des appareils virtuels que vous souhaitez créer :

    • Image système Google APIs Experimental 16 KB Page Size ARM 64 v8a
    • Image système Google APIs Experimental 16 KB Page Size Intel x86_64 Atom
    Téléchargez des images système d'émulateur de 16 Ko à l'aide de SDK Manager dans Android Studio.
  4. Cliquez sur Appliquer > OK pour télécharger les images système que vous avez sélectionnées.

  5. Suivez les étapes pour configurer un appareil virtuel pour Android 15. Lorsque vous êtes invité à sélectionner une image système, sélectionnez l'image système de 16 ko que vous avez téléchargée. Si elle n'est pas recommandée automatiquement, vous trouverez l'image système de 16 Ko dans l'onglet Autres images.

    Recherchez l'image de l'émulateur de 16 ko dans l'onglet "Autres images".

Étapes supplémentaires pour certaines versions de l'émulateur et images système

Pour les versions 35.1.5 à 35.1.20 de l'émulateur Android, et avant la révision 4 des images système Android 15.0 16 Ko proposées dans le SDK Manager, vous devez également effectuer les étapes suivantes pour simuler un environnement 16 Ko sur les systèmes x86_64. Ces étapes ne sont pas nécessaires après la version 35.1.21 et avec la révision 4 des images système Android 15.0 16 ko ou ultérieures.

  1. Dans le gestionnaire d'appareils, cliquez sur les trois points à côté de l'image de 16 Ko, puis sur Afficher sur le disque.
  2. Dans ce dossier, recherchez le fichier config.ini.
  3. Ajoutez la ligne suivante au fichier config.ini et enregistrez vos modifications :

    kernel.parameters = androidboot.page_shift=14
    
  4. Pour vérifier vos modifications, exécutez la commande suivante, qui devrait renvoyer 16384 :

    adb shell getconf PAGE_SIZE
    

Lancer l'émulateur

Une fois que vous avez terminé de configurer l'émulateur Android et les appareils virtuels, lancez l'émulateur à partir du menu de l'appareil cible ou à partir de la ligne de commande.

Activer le mode 16 ko sur un appareil à l'aide des options pour les développeurs

Activez l'option développeur Démarrer avec une page de 16 ko pour démarrer un appareil en mode 16 ko.

À partir d'Android 15 QPR1, vous pouvez utiliser l'option pour les développeurs disponible sur certains appareils pour démarrer l'appareil en mode 16 ko et effectuer des tests sur l'appareil. Avant d'utiliser l'option pour les développeurs, accédez à Paramètres > Système > Mises à jour logicielles et appliquez les mises à jour disponibles.

Cette option pour les développeurs est disponible sur les appareils suivants :

  • Pixel 8 et 8 Pro (avec Android 15 QPR1 ou version ultérieure)

  • Pixel 8a (avec Android 15 QPR1 ou version ultérieure)

  • Pixel 9, 9 Pro et 9 Pro XL (avec Android 15 QPR2 bêta 2 ou version ultérieure)

Exigence de compatibilité avec Google Play

Les fabricants d'appareils équipent les appareils de plus de RAM pour optimiser les performances. Par conséquent, beaucoup adopteront des tailles de page plus grandes, comme 16 Ko. Pour préparer le lancement de ces futurs appareils, Google Play introduit une nouvelle exigence de compatibilité : à partir du 1er novembre 2025, toutes les nouvelles applications et les mises à jour des applications existantes envoyées sur Google Play et ciblant les appareils exécutant Android 15 (niveau d'API 35) et versions ultérieures devront prendre en charge les tailles de page de 16 Ko.

Pour en savoir plus sur cette exigence de compatibilité, consultez cet article de blog.