Architecture modulaire et évolution du framework
Dans l'écosystème Android, les bibliothèques framework.jar et services.jar constituent le cœur du système d'exploitation. Avec l'introduction d'Android 11, Google a finalisé la transition vers une architecture modulaire basée sur APEX (Android Pony EXpress). Cette refactorisation a profondément modifié la manière dont les composants système sont compilés et déployés.
Le changement majeur réside dans la séparation du framework monolithique en modules isolés. Désormais, le module principal est identifié sous le nom de framework-minus-apex, excluant les composants extraits vers des conteneurs APEX (comme ART ou le tethering).
Initialisation de l'environnement de développement
Avant de lancer la compilation, il est impératif de configurer la machine hôte (Ubuntu 20.04 ou supérieur recommandé) et de synchroniser le code source.
# Installation des dépendances système
sudo apt-get update
sudo apt-get install -y git-core gnupg flex bison build-essential \
zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 \
lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev \
libgl1-mesa-dev libxml2-utils xsltproc unzip fontconfig
# Initialisation du dépôt et synchronisation
repo init -u https://android.googlesource.com/platform/manifest -b android-11.0.0_r48
repo sync -c --no-tags -j16
# Chargement des variables d'environnement
source build/envsetup.sh
lunch aosp_arm64-userdebug
Processus de compilation : Avant et Après Android 11
La méthode de génération des artefacts Java diffère selon la version cible du système d'exploitation.
Cibles antérieures à Android 11
Pour les versions comme Android 10, la compilation du framework complet s'efffectue via la cible standard :
# Génération du framework complet
m framework -j16
# Emplacement de l'artefact généré
# out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes.jar
Lors du déploiement de services.jar sur ces anciennes versions, il est crucial de purger le cache Dalvik :
adb root && adb remount
adb shell "rm -rf /data/dalvik-cache/arm*/system@framework@services.jar@classes.*"
Spécificités d'Android 11 et versions ultérieures
À partir d'Android 11, la cible de compilation doit être adaptée pour exclure les modules APEX.
| Paramètre | Android 10 et antérieur | Android 11 et ultérieur |
|---|---|---|
| Commande de build | m framework |
m framework-minus-apex |
| Fichier de sortie | classes.jar |
framework-minus-apex.jar |
| Portée | Framework intégral | Framework de base (sans APEX) |
Déploiement sur l'appareil et gestion des redémarrages
Le remplacement des bibliothèques système nécessite une manipulation rigoureuse des permissions et des caches compilés (OAT/ODEX).
Procédure de remplacement sécurisée
# 1. Sauvegarde de la bibliothèque originale
adb pull /system/framework/framework.jar ./backup_framework/
# 2. Suppression des caches compilés obsolètes
adb shell "rm -rf /system/framework/arm64 /system/framework/oat"
# 3. Injection du nouveau module
adb push ./out/target/product/generic_arm64/system/framework/framework-minus-apex.jar /system/framework/framework.jar
# 4. Restauration des permissions POSIX
adb shell "chmod 0644 /system/framework/framework.jar"
adb shell "chown root:root /system/framework/framework.jar"
Stratégies de redémarrage du système
Selon le niveau de modification, différentes commandes de redémarrage peuvent être invoquées :
- Redémarrage du runtime (Soft reboot) :
adb shell setprop ctl.restart zygote(Idéal pour les modifications mineures du framework). - Redémarrage des services système :
adb shell stop && adb shell start(Nécessaire lors de la mise à jour deservices.jar). - Redémarrage matériel (Hard reboot) :
adb reboot(Obligatoire si les partitions ou les noyaux sont affectés).
Résolution de problèmes et optimisation
Anomalies fréquentes
Boucle de redémarrage (Bootloop) : Souvent causée par des caches OAT corrompus ou des règles SELinux bloquantes.
# Purge complète des caches d'exécution
adb shell "rm -rf /data/dalvik-cache/*"
adb shell "rm -rf /data/system/package_cache/*"
adb reboot
Exceptions ClassNotFoundException : Vérifiez que les dépendances inter-modules sont correctement déclarées dans les fichiers Android.bp et que la configuration ProGuard/R8 n'a pas supprimé de classes essentielles.
Accélération du cycle de compilation
Pour réduire les temps de build lors des itérations successives, activez le cache de compilation :
# Activation et dimensionnement de ccache
export USE_CCACHE=1
export CCACHE_DIR=~/.ccache
ccache -M 60G
# Compilation incrémentale utilisant tous les cœurs disponibles
m framework-minus-apex -j$(nproc)