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

À l'origine, Android n'acceptait que les tailles de page de mémoire de 4 Ko, ce qui permet d'optimiser les performances de la mémoire système pour la quantité moyenne de mémoire totale dont disposent généralement les appareils Android. À partir d'Android 15, Android est compatible avec les appareils configurés pour utiliser une taille de page de 16 Ko (appareils de 16 Ko).

À mesure que les fabricants d'appareils continuent de créer des appareils avec de plus grandes quantités de mémoire physique (RAM), un grand nombre de ces appareils seront probablement configurés avec des tailles de page de 16 Ko (voire plus) afin d'optimiser leurs performances. L'ajout de la compatibilité avec les appareils de 16 Ko permet à votre application de s'exécuter sur ces appareils et de bénéficier des améliorations de performances associées. Pour vous aider, nous avons détaillé comment vérifier si votre application est concernée, recréer votre application (le cas échéant) et tester votre application dans un environnement de 16 Ko à l'aide d'émulateurs et d'appareils physiques.

Avantages et gains de performances

Les appareils configurés avec des tailles 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:

  • Diminution du temps de lancement des applications lorsque la mémoire système est forte: 3,16 % de moins en moyenne, avec des améliorations plus importantes (jusqu'à 30%) pour certaines applications que nous avons testées
  • Réduction de la consommation d'énergie lors du lancement de l'application: réduction de 4,56% en moyenne
  • Lancement plus rapide des caméras: 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: amélioration de 1,5% (environ 0,8 seconde) en moyenne

Ces améliorations sont basées sur nos tests initiaux et 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

Si votre application utilise du code natif, vous devez la recompiler pour qu'elle soit compatible avec les appareils de 16 Ko. Si vous ne savez pas si votre application utilise du code natif, vous pouvez utiliser l'analyseur d'APK pour déterminer la présence de code natif.

Si votre application n'utilise que du code écrit en langage de programmation Java ou Kotlin, y compris toutes les bibliothèques ou tous les SDK, elle est déjà compatible avec les appareils de 16 Ko. Néanmoins, nous vous recommandons de tester votre application dans un environnement de 16 Ko pour vérifier qu'il n'y a pas de régressions inattendues dans son comportement.

Votre application utilise-t-elle du code natif ?

Votre application utilise du code natif 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 à toutes les bibliothèques natives ou dépendances tierces qui les utilisent.
  • Votre application est créée 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 déterminer si votre application utilise du code natif ou des bibliothèques, procédez comme suit:

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

    Option de menu "Création Studio" permettant de lancer l'analyseur d'APK

  3. Sélectionnez l'APK à analyser.

  4. Examinez le dossier lib, qui héberge les fichiers d'objets partagés (.so), le cas échéant. Si des fichiers d'objets partagés sont présents, votre application utilise du code natif. Si aucun fichier d'objet partagé n'est présent ou s'il n'y a pas de dossier lib, votre application n'utilise pas de code natif.

    Vue de l'analyseur d'APK montrant la présence de fichiers d'objets partagés

Créer votre application pour les appareils de 16 Ko

Pour les appareils de 16 Ko, les applications qui utilisent du code natif doivent suivre la procédure décrite dans les sections suivantes.

Passez à la version 8.3 d'AGP ou à une version ultérieure

Les appareils de 16 Ko nécessitent que les applications fournies avec des bibliothèques partagées non compressées soient alignées sur une limite de 16 Ko alignée sur un zip de 16 Ko. Pour ce faire, vous devez passer à la version 8.3 ou ultérieure du plug-in Android Gradle (AGP). Reportez-vous à la section Assistant de mise à niveau du plug-in Android Gradle pour en savoir plus sur le processus de mise à niveau.

Nous vous recommandons d'utiliser des bibliothèques partagées non compressées. Toutefois, si vous ne pouvez pas mettre à niveau AGP vers la version 8.3 ou une version ultérieure, l'alternative consiste à passer à 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 afin d'éviter les problèmes d'installation 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
      }
  }
}

Compiler votre application en utilisant l'alignement ELF de 16 Ko

Pour que votre application puisse s'exécuter, les appareils de 16 Ko nécessitent que les segments ELF des bibliothèques partagées soient correctement alignés à l'aide d'un alignement ELF de 16 Ko.

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

Android NDK r26 et versions antérieures

Pour pouvoir compiler des 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 fichier Android.mk pour activer l'alignement ELF de 16 Ko:

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

CMake

Mettez à jour votre fichier 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 r27 ou version ultérieure

Pour pouvoir compiler des bibliothèques partagées alignées sur 16 Ko avec le NDK Android version r27 ou 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 d'association suivants:

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

Recherchez des instances de code qui font référence à des tailles de page spécifiques.

Même si votre application est alignée sur 16 Ko, elle peut rencontrer des erreurs si des emplacements de votre code supposent 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 les instances dans votre logique de code qui supposent que la taille de page d'un appareil est de 4 Ko (4096).

    Utilisez getpagesize() ou sysconf(_SC_PAGESIZE) à la place.

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

Tester votre application dans un environnement de 16 Ko

Une fois que vous avez créé votre application compatible avec les appareils de 16 Ko, vous pouvez la tester dans un environnement de 16 Ko pour voir si elle rencontre des régressions. Pour ce faire, configurez l'un des environnements de test suivants, puis testez soigneusement votre application, en vous concentrant sur les zones qui pourraient être affectées par la modification des instances de code qui font référence à des tailles de page spécifiques.

Configurer Android Emulator avec une image système Android 15 de 16 Ko

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

  1. Les images système de l'émulateur Android 15 de 16 Ko sont compatibles avec Android Studio Jellyfish | 2023.3.1 ou version ultérieure. Toutefois, pour une expérience optimale lorsque vous utilisez la version bêta d'Android 15, téléchargez la dernière version preview d'Android Studio.

    N'oubliez pas que vous pouvez conserver la version existante d'Android Studio, car vous pouvez installer plusieurs versions côte à côte.

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

  3. Dans l'onglet SDK Platforms (Plates-formes SDK), développez la section Android VanillaIceCream Preview (Preview Android VanillaIceCream), puis sélectionnez l'une des images système d'émulateur suivantes, ou les deux, en fonction des appareils virtuels que vous souhaitez créer:

    • Image système ARM 64 v8a pour la taille de page de 16 k des API Google expérimentales
    • Image système Intel x86_64 Atom, taille de page 16 Ko expérimentale, API Google

    Télécharger des images système de l'émulateur de 16 Ko à l'aide de SDK Manager dans Android Studio

  4. Cliquez sur Apply > OK (Appliquer > OK) pour télécharger les images système sélectionnées.

  5. Suivez la procédure 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".