Compilation et déploiement des modules framework et services sous Android 11

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 de services.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)

Étiquettes: android 11 AOSP framework.jar Android Build System APEX

Publié le 3 août à 10h52