Auparavant, Android n'acceptait que des pages de 4 Ko de mémoire, ce qui optimisée des performances de la mémoire système pour la quantité moyenne de mémoire totale les appareils Android ont généralement eu. À partir d'Android 15, AOSP prend en charge appareils configurés pour utiliser une taille de page de 16 Ko appareils). Si votre application utilise des bibliothèques du NDK, directement ou indirectement via un SDK, vous devez recompiler votre application pour qu'elle fonctionnent sur ces appareils de 16 Ko.
Alors que les fabricants d’appareils continuent à construire des appareils avec de plus grandes quantités mémoire physique (RAM), un grand nombre de ces appareils adopteront un débit de 16 Ko (et et éventuellement plus) pour optimiser les performances de l'appareil. Ajout... la compatibilité avec les appareils dont la taille de page est de 16 Ko permet à votre application de s'exécuter sur ces appareils et aide votre application à bénéficier des performances associées et d'améliorations. Sans recompilation, les applications risquent de ne pas fonctionner sur les appareils de 16 Ko. lorsqu'ils seront mis en production dans les prochaines versions d'Android.
Pour vous aider à proposer la prise en charge de votre application, nous vous fournissons des conseils sur la façon de vérifier si votre application est concernée, comment recompilez votre application (le cas échéant) et comment la tester dans un environnement de 16 Ko utilisant des émulateurs (y compris Android 15) ; images système pour Android Emulator).
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 dans les cas suivants:
- Votre application utilise du code C/C++ (natif). Si votre application utilise l'Android NDK, votre application utilise du code natif.
- Votre application est associée à toutes les bibliothèques natives ou dépendances tierces qui les utiliser.
- Votre application est conçue par un outil de création d'applications tiers qui utilise des bibliothèques natives sur 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'une version APK. Pour déterminer si votre application utilise du code natif ou des bibliothèques, suivez ces étapes:
- Ouvrez Android Studio, puis cliquez sur File > (Fichier >) Ouvrez et sélectionnez un projet.
Dans la barre de menu, cliquez sur Build > Analyser l'APK...
Sélectionnez l'APK que vous souhaitez analyser.
Regardez dans le dossier
lib
, qui héberge des fichiers d'objets partagés (.so
) le cas échéant sont présentes. Si des fichiers d'objets partagés sont présents, votre application utilise des du code source. En l'absence de fichiers d'objets partagés ou de dossierlib
, votre application n'utilise pas de code natif.
Créer votre application compatible avec les appareils de 16 Ko
Pour accepter des appareils de 16 Ko, les applications qui utilisent du code natif doivent suivre présentées dans les sections suivantes.
Mettre à jour le packaging de vos bibliothèques partagées
Nous vous recommandons de passer à la version 8.3 ou ultérieure d'AGP et d'utiliser des fichiers bibliothèques partagées.
AGP 8.3 ou version ultérieure
Les appareils de 16 Ko nécessitent des applications fournies avec des bibliothèques partagées non compressées pour : alignez-les sur une limite de 16 Ko alignée sur un fichier ZIP. Pour ce faire, vous devez au plug-in Android Gradle (AGP) version 8.3 ou ultérieure. Reportez-vous à la section Android Assistant de mise à niveau du plug-in Gradle pour en savoir plus sur le processus de mise à niveau.
AGP 8.2 ou version antérieure
Si vous ne pouvez pas mettre à niveau AGP vers la version 8.3 ou une version ultérieure, l'alternative consiste à utiliser des bibliothèques partagées compressées. Mettez à jour votre configuration Gradle pour demander à Gradle de compresser vos bibliothèques partagées lors du packaging de votre application afin d'éviter que l'application 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
Les appareils de 16 Ko nécessitent l'accès aux bibliothèques partagées. Segments ELF à aligner à l'aide de l'alignement ELF de 16 Ko pour que votre application s'exécute.
Pour compiler votre application à l'aide d'un alignement ELF de 16 Ko, suivez la procédure décrite dans l'une des les sections suivantes en fonction de la version du NDK Android que vous utilisent.
Android NDK r26 ou version antérieure
Pour permettre 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 ndk-build
ou votre cmake
configuration 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 r27 ou version ultérieure
Pour permettre la compilation de bibliothèques partagées alignées sur 16 Ko avec le NDK Android
version r27 ou ultérieure, vous devez mettre à jour votre ndk-build
, votre build.gradle
,
build.gradle.kts
, ou les options 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
Rechercher des instances de code qui font référence à des tailles de page spécifiques
Même si votre application est alignée en 16 Ko, elle peut rencontrer des erreurs si des dans votre code supposent qu'un appareil utilise une taille de page spécifique. Pour éviter cela, procédez comme suit:
Supprimez toutes les dépendances codées en dur qui font référence au
PAGE_SIZE
. constante ou des instances de votre logique de code qui supposent que la page d'un appareil est de 4 Ko (4096
).Utilisez
getpagesize()
ousysconf(_SC_PAGESIZE)
à la place.Recherchez les utilisations de
mmap()
et d'autres API qui nécessitent des alignements sur la page arguments 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
à la taille de page sous-jacente, votre application ne risque pas
en mode 16 Ko. Toutefois, si cette valeur est transmise au noyau
avec mmap
sans MAP_FIXED
, le noyau utilise quand même une page entière, ce qui
gaspille de la mémoire. C'est pourquoi PAGE_SIZE
n'est pas défini lorsque sa taille est de 16 Ko.
est activé sur NDK r27 ou version ultérieure.
Si votre application utilise PAGE_SIZE
de cette manière et ne transmet jamais directement cette valeur à
le noyau, puis au lieu d'utiliser PAGE_SIZE
, créez une variable avec un nouveau
pour indiquer qu'il est utilisé à d'autres fins et qu'il ne reflète pas
mémoire.
Tester votre application dans un environnement de 16 Ko
Après avoir créé votre application compatible avec les appareils de 16 Ko, vous devez tout d'abord tester votre application dans un environnement de 16 Ko pour voir si elle fonctionne aucune régression. Pour ce faire, procédez comme suit :
Configurez l'un des environnements de test suivants:
Démarrez votre appareil de test, puis exécutez la commande suivante pour vérifier que Elle utilise un environnement de 16 Ko:
adb shell getconf PAGE_SIZE
La commande doit renvoyer la valeur
16384
.Pour toutes les bibliothèques partagées, vérifiez que les paramètres Les segments ELF sont à l'aide de l'alignement ELF de 16 Ko. Vous pouvez utiliser ce script pour ce processus:
#!/bin/bash # usage: alignment.sh path to search for *.so files dir="$1" RED="\e[31m" GREEN="\e[32m" ENDCOLOR="\e[0m" matches="$(find $dir -name "*.so" -type f)" IFS=$'\n' for match in $matches; do res="$(objdump -p ${match} | grep LOAD | awk '{ print $NF }' | head -1)" if [[ $res =~ "2**14" ]] || [[ $res =~ "2**16" ]]; then echo -e "${match}: ${GREEN}ALIGNED${ENDCOLOR} ($res)" else echo -e "${match}: ${RED}UNALIGNED${ENDCOLOR} ($res)" fi done
Enregistrez le script dans un fichier tel que
alignment.sh
.Extrayez le fichier APK de votre application:
unzip APK_NAME.apk -d /tmp/my_apk_out
Exécutez le script sur les fichiers extraits dans
/tmp/my_apk_out
. répertoire:alignment.sh /tmp/my_apk_out | grep "arm64-v8a"
Le script génère la valeur
ALIGNED
ouUNALIGNED
pour toutes lesarm64-v8a
bibliothèques partagées.Si des bibliothèques partagées
arm64-v8a
sont enUNALIGNED
, vous devez mettez à jour le packaging de ces bibliothèques, puis recompilez votre et testez de nouveau votre application en suivant la procédure décrite dans cette section.
Exécutez la commande
zipalign
suivante pour vérifier que votre application est Aligné à 16 Ko, où APK_NAME correspond au nom le fichier APK de votre application:zipalign -c -P 16 -v 4 APK_NAME.apk
Testez minutieusement votre application, en vous concentrant sur les domaines susceptibles d'être affectés par la modification d'instances de code qui font 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 d'Android Emulator, procédez comme suit : étapes:
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 meilleure expérience, avec la version bêta d'Android 15, téléchargez la dernière version version preview d'Android Studio.
N'oubliez pas que vous pouvez conserver votre version existante d'Android Studio car vous pouvez installer plusieurs versions côte à côte.
Dans Android Studio, cliquez sur Tools > SDK Manager (Outils > Gestionnaire de SDK).
Dans l'onglet SDK Platforms (Plates-formes SDK), cochez Show Package Details (Afficher les détails du package), puis développez dans la section Android VanillaIceCream Preview (Preview d'Android VanillaIceCream), puis sélectionnez l'une des les images système de l'émulateur suivantes, en fonction des appareils virtuels que vous souhaitez créer:
- Image système expérimentale des API Google 16 Ko ARM 64 v8a
- Image système expérimentale des API Google au format 16 ko Intel x86_64 Atom
Cliquez sur Appliquer > OK pour télécharger les images système que vous avez sélectionnées.
Suivez les étapes pour configurer un appareil virtuel pour Android 15 et, 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é. Si elle n'est pas recommandée automatiquement, Image système de 16 Ko dans l'onglet Other Images (Autres images)
- Dans le Gestionnaire de périphériques, cliquez sur les trois points à côté de l'image de 16 Ko, puis cliquez sur Afficher sur le disque.
- Dans ce dossier, recherchez le fichier
config.ini
. Ajoutez la ligne suivante au fichier
config.ini
et enregistrez vos modifications:kernel.parameters = androidboot.page_shift=14
Pour vérifier vos modifications, exécutez la commande suivante, qui devrait renvoyer
16384
:adb shell getconf PAGE_SIZE