Comment construire des ROM Android sur Ubuntu 16.04

introduction

Android est le système d’exploitation le plus populaire au monde. Des centaines de fabricants d’équipement d’origine (OEM) ont choisi de l’installer sur leurs appareils, car il est gratuit, à source ouverte et sur lequel repose un vaste écosystème d’applications et de services. Malheureusement, de nombreux constructeurs ne proposent pas régulièrement de mises à jour OTA (Over-the-Air) pour Android. Et les autres constructeurs ne fournissent des mises à jour que pendant une période limitée après le lancement du périphérique. De plus, les constructeurs ont tendance à personnaliser intensément Android pour s’assurer que leurs appareils présentent une apparence et une convivialité uniques. Leurs personnalisations incluent des lanceurs alternatifs, des interfaces utilisateur système à thème et des applications préinstallées.

Si vous souhaitez supprimer toutes ces personnalisations ou si vous souhaitez exécuter la dernière version d’Android pur sur votre appareil, vous pouvez créer vous-même un nouveau microprogramme. Dans la communauté de modding Android, ce micrologiciel est généralement appelé ROM, abréviation de Read Only Memory.

Dans ce didacticiel, vous allez créer une ROM Android Oreo basée sur le projet Android Open Source, ou AOSP. Pour que ce tutoriel reste générique et indépendant du périphérique, nous ne viserons que l’émulateur AOSP, mais vous pouvez appliquer les mêmes techniques aux périphériques actuels.

Conditions préalables

Pour pouvoir suivre, vous aurez besoin de:

  • Un serveur Ubuntu 16.04 x64 avec au moins 16 Go de RAM, 4 processeurs et 120 Go d’espace de stockage configuré en suivant les adresses https://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu- 16-04 [le guide de configuration initiale du serveur Ubuntu 16.04], y compris un utilisateur sudo non root et un pare-feu. Le processus de compilation nécessite beaucoup de mémoire vive et davantage de processeurs accélèreront le temps de compilation. De plus, les fichiers que vous allez télécharger et créer sont assez volumineux. DigitalOcean a High CPU Droplets, ce qui pourrait parfaitement convenir à ce projet.

  • Git est installé en suivant Comment installer Git sur Ubuntu 16.04.

Étape 1 - Démarrer une session de dépistage

Certaines des commandes que vous allez exécuter dans ce tutoriel peuvent potentiellement s’exécuter pendant des heures. Si la connexion SSH entre votre PC et votre serveur est interrompue pendant l’exécution des commandes, elles seront interrompues de manière abrupte. Pour éviter une telle situation, utilisez l’utilitaire + screen +, qui vous permet d’exécuter plusieurs sessions de console dans un même terminal. Avec screen, vous pouvez vous déconnecter d’une session en cours et y attacher plus tard. Si vous êtes nouveau sur Screen, consultez this tutorial on en utilisant Screen sur Ubuntu.

Démarrer une nouvelle session + screen +.

screen

Lorsque vous exécutez screen pour la première fois, un contrat de licence vous est présenté. Appuyez sur * Entrée * pour accepter la licence.

À partir de ce moment, en cas d’échec de votre connexion SSH, vos commandes de longue durée continueront de s’exécuter en arrière-plan. Une fois la connexion SSH rétablie, vous pourrez reprendre la session en exécutant + screen -r +.

Ensuite, installons les composants nécessaires à la compilation d’Android.

Étape 2 - Installation des dépendances

Le code source AOSP est réparti sur plusieurs référentiels Git. Pour faciliter le téléchargement de tous ces référentiels par les utilisateurs, la communauté AOSP a créé un outil de ligne de commande appelé https://storage.googleapis.com/git-repo-downloads/repo [+ repo +].

Nous allons télécharger la dernière version de l’outil en utilisant + wget + et le stocker dans le répertoire + ~ / bin +. Commencez par créer le répertoire + ~ / bin +:

mkdir -p ~/bin

Ensuite, téléchargez le script + repo +:

wget 'https://storage.googleapis.com/git-repo-downloads/repo' -P ~/bin

Utilisez + chmod + pour accorder à votre utilisateur actuel l’autorisation d’exécuter + repo +.

chmod +x ~/bin/repo

L’outil + repo + utilise Git en interne et nécessite la création d’une configuration Git spécifiant votre nom d’utilisateur et votre adresse électronique. Exécutez ces commandes pour le faire:

git config --global user.name ""
git config --global user.email ""

Le code source d’Android se compose principalement de fichiers Java, C et XML. Pour compiler le code source, vous devez installer OpenJDK 8, les compilateurs GNU C et C , les bibliothèques d’analyse XML, ImageMagick et plusieurs autres packages associés. Heureusement, vous pouvez tous les installer en utilisant + apt +. Avant de le faire, assurez-vous de mettre à jour les listes de paquets de votre serveur.

sudo apt-get update

Une fois les listes mises à jour, installez les dépendances:

sudo apt-get install openjdk-8-jdk android-tools-adb bc bison build-essential curl flex g++-multilib gcc-multilib gnupg gperf imagemagick lib32ncurses5-dev lib32readline-dev lib32z1-dev libesd0-dev liblz4-tool libncurses5-dev libsdl1.2-dev libssl-dev libwxgtk3.0-dev libxml2 libxml2-utils lzop pngcrush rsync schedtool squashfs-tools xsltproc yasm zip zlib1g-dev

Une fois les dépendances téléchargées, nous pouvons utiliser le script + repo + pour obtenir la source Android.

Étape 3 - Télécharger le code source

Nous allons utiliser le script + repo + pour effectuer quelques tâches afin de préparer notre espace de travail. Créez un nouveau répertoire pour stocker la source Android que vous allez télécharger:

mkdir -p ~/aosp/oreo

Vous travaillerez dans ce répertoire tout au long du reste de ce didacticiel, alors passez à celui-ci maintenant:

cd ~/aosp/oreo

Le répertoire doit être initialisé avec le référentiel AOSP manifest, un référentiel Git spécial contenant un fichier XML nommé + default.xml +, qui spécifie les chemins d’accès de tous les autres. Les référentiels Git qui forment ensemble la base de code AOSP.

Travailler avec l’intégralité de l’arbre de code AOSP peut devenir fastidieux. Par conséquent, vous devez également spécifier le nom d’une révision ou d’une branche spécifique qui vous intéresse. Dans ce tutoriel, dans la mesure où nous construisons une ROM Oreo, nous allons utiliser la branche + android-8.0.0_r33 +, dont l’ID de construction est + OPD1.170816.025 +. Vous pouvez obtenir une liste de tous les identifiants de construction et noms de branche disponibles à partir de la page officielle de AOSP, des noms de code, des balises et des numéros de construction.

De plus, vous n’avez pas besoin de tout l’historique de validation de l’arbre de code pour ce didacticiel. Vous pouvez économiser du temps et de l’espace de stockage en tronquant l’historique à une profondeur de + 1 +.

En conséquence, utilisez la commande + repo init + pour initialiser le répertoire et spécifiez les options suivantes:

repo init -u https://android.googlesource.com/platform/manifest -b  --depth=

Lorsque vous êtes invité à activer l’affichage des couleurs, appuyez sur * Y *, puis sur * Entrée *.

Enfin, téléchargez les fichiers AOSP réels à partir des différents référentiels en exécutant la commande + repo sync +:

repo sync

La commande ci-dessus télécharge plus de 30 Go de données. Soyez patient pendant son exécution. Une fois que ce sera fait, nous mettrons en place un cache pour accélérer la compilation.

Étape 4 - Préparation d’un cache de compilateur

Pour accélérer vos générations, vous pouvez utiliser un cache de compilateur. Comme son nom l’indique, un cache de compilateur vous évite de recompiler des parties de la ROM déjà compilées.

Pour activer l’utilisation d’un cache de compilateur, définissez une variable d’environnement nommée + USE_CCACHE +.

export USE_CCACHE=1

Si vous n’avez pas beaucoup d’espace disque disponible, vous ne voudriez pas que le cache s’agrandisse trop, vous pouvez donc limiter sa taille. Si vous construisez votre ROM pour un seul appareil, vous pouvez la limiter à 15 Go. Pour ce faire, utilisez la commande + ccache +.

prebuilts/misc/linux-x86/ccache/ccache -M

Vous verrez une sortie qui confirme que vous avez apporté cette modification:

OutputSet cache size limit to  Gbytes

Il nous reste une optimisation à faire avant de pouvoir compiler. Faisons-le ensuite.

Étape 5 - Configuration de Jack

Le serveur Jack, qui est responsable de la construction de la plupart des parties de la ROM basées sur Java, nécessite beaucoup de mémoire. Pour éviter les erreurs d’allocation de mémoire, vous pouvez utiliser une variable d’environnement nommée + ANDROID_JACK_VM_ARGS + pour spécifier la quantité de mémoire Jack autorisée à utiliser. Habituellement, allouer environ 50% de la RAM de votre serveur est suffisant. Cette variable d’environnement spécifie également d’autres paramètres de compilation.

Exécutez la commande suivante pour allouer 8 Go de RAM au serveur Jack et conserver les options de compilation par défaut dont Jack a besoin:

export ANDROID_JACK_VM_ARGS="-Xmx -Dfile.encoding=UTF-8 -XX:+TieredCompilation"

Vous êtes maintenant prêt à créer votre ROM Android.

Étape 6 - Démarrer la construction

L’arbre de code AOSP contient un script nommé + envsetup.sh +, qui possède plusieurs fonctions d’assistance liées à la construction. Bien que de nombreuses fonctions d’aide, telles que + mm +, '+ mma + et + mmm + , servent de raccourcis pour la commande + make + , d’autres telles que + lunch + `définissent des variables d’environnement importantes d’autres choses, décidez de l’architecture du processeur de la ROM et du type de construction.

Source le script pour accéder aux fonctions d’assistance.

source build/envsetup.sh
Outputincluding device/asus/fugu/vendorsetup.sh
including device/generic/car/car-arm64/vendorsetup.sh
including device/generic/car/car-armv7-a-neon/vendorsetup.sh
including device/generic/car/car-x86_64/vendorsetup.sh
including device/generic/car/car-x86/vendorsetup.sh
including device/generic/mini-emulator-arm64/vendorsetup.sh
including device/generic/mini-emulator-armv7-a-neon/vendorsetup.sh
including device/generic/mini-emulator-mips64/vendorsetup.sh
including device/generic/mini-emulator-mips/vendorsetup.sh
including device/generic/mini-emulator-x86_64/vendorsetup.sh
including device/generic/mini-emulator-x86/vendorsetup.sh
including device/google/dragon/vendorsetup.sh
including device/google/marlin/vendorsetup.sh
including device/google/muskie/vendorsetup.sh
including device/google/taimen/vendorsetup.sh
including device/huawei/angler/vendorsetup.sh
including device/lge/bullhead/vendorsetup.sh
including device/linaro/hikey/vendorsetup.sh
including sdk/bash_completion/adb.bash

Ensuite, lancez + lunch + et donnez-lui le nom de code de votre périphérique, avec le suffixe d’un type de construction, qui peut être + eng +, + + userdebug + ou + utilisateur + . Bien que les types de construction `+ young et` + userdebug` donnent des ROM mieux adaptées aux tests, le type de construction + user et est recommandé pour une utilisation en production.

Pour créer une ROM de test pouvant s’exécuter sur l’émulateur AOSP ARM, transmettez + aosp_arm-eng + à la commande + lunch +:

lunch aosp_arm-eng

Vous verrez cette sortie, montrant les paramètres d’environnement:

Output============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=8.0.0
TARGET_PRODUCT=aosp_arm
TARGET_BUILD_VARIANT=eng
TARGET_BUILD_TYPE=release
TARGET_PLATFORM_VERSION=OPD1
TARGET_BUILD_APPS=
TARGET_ARCH=arm
TARGET_ARCH_VARIANT=armv7-a
TARGET_CPU_VARIANT=generic
TARGET_2ND_ARCH=
TARGET_2ND_ARCH_VARIANT=
TARGET_2ND_CPU_VARIANT=
HOST_ARCH=x86_64
HOST_2ND_ARCH=x86
HOST_OS=linux
HOST_OS_EXTRA=Linux-4.4.0-104-generic-x86_64-with-Ubuntu-16.04-xenial
HOST_CROSS_OS=windows
HOST_CROSS_ARCH=x86
HOST_CROSS_2ND_ARCH=x86_64
HOST_BUILD_TYPE=release
BUILD_ID=OPD1.170816.025
OUT_DIR=out
AUX_OS_VARIANT_LIST=
============================================

Enfin, exécutez + make + pour démarrer la construction. + make + prend en charge les travaux parallèles. Vous pouvez donc accélérer considérablement la construction en utilisant l’option + -j + pour définir le nombre de travaux parallèles égal au nombre de CPU disponibles sur le serveur.

Utilisez la commande + nproc + pour voir combien de processeurs vous avez:

nproc

La commande retourne le nombre de CPUS:

Output8

Vous pouvez ensuite utiliser ce numéro avec + make + pour spécifier une exécution parallèle:

make -j

Même avec 8 processeurs, vous devrez attendre plus d’une heure pour que la construction soit terminée, à condition qu’aucun autre processus gourmand en ressources processeur ne soit actif sur votre serveur. La durée de la construction est directement proportionnelle à la quantité de RAM et au nombre de CPU que vous avez. Si vous voulez des versions plus rapides, envisagez d’utiliser des High CPU Droplets spécialisées, qui prennent en charge jusqu’à 32 processeurs et 48 Go de mémoire.

Une fois que la ROM est prête, vous devriez voir un message disant que la construction est terminée avec succès. Vous pourrez également voir la durée exacte de la construction.

Output...
Creating filesystem with parameters:
   Size: 2147483648
   Block size: 4096
   Blocks per group: 32768
   Inodes per group: 8192
   Inode size: 256
   Journal blocks: 8192
   Label: system
   Blocks: 524288
   Block groups: 16
   Reserved block group size: 127
Created filesystem with 2266/131072 inodes and 178244/524288 blocks
[100% 63193/63193] Install system fs i... out/target/product/generic/system.img
out/target/product/generic/system.img+ maxsize=2192446080 blocksize=2112 total=2147483648 reserve=22146432

#### make completed successfully (01:05:44 (hh:mm:ss)) ####

Vérifions que les choses ont été construites correctement.

Étape 7 - Vérification de la construction

La sortie du processus de construction consiste en plusieurs images de système de fichiers, qui forment ensemble la ROM. Vous les trouverez dans le répertoire + out / target / product / generic / +.

ls -l out/target/product/generic/*.img
Output-rw-r--r-- 1 sammy sammy   69206016 Jan  5 18:51 out/target/product/generic/cache.img
-rw-rw-r-- 1 sammy sammy    1699731 Jan  5 19:09 out/target/product/generic/ramdisk.img
-rw-r--r-- 1 sammy sammy 2147483648 Jan  5 19:10 out/target/product/generic/system.img
-rw-r--r-- 1 sammy sammy  576716800 Jan  5 19:09 out/target/product/generic/userdata.img

Pour tester la ROM, vous pouvez essayer de démarrer un émulateur avec elle en exécutant la commande + emulator +. Si vous êtes dans un environnement non graphique, assurez-vous de lui transmettre les indicateurs + -no-windows et` + -no audio + `.

emulator  > /dev/null 2>&1 &

Pour vérifier si l’émulateur a réussi à démarrer, attendez une minute et utilisez l’outil de pont de débogage Android, + adb +, pour ouvrir un shell sur l’émulateur.

adb shell

Si la ROM ne présente aucun problème, une invite du shell s’exécutant sur l’émulateur s’affiche.

Output* daemon not running; starting now at tcp:5037
* daemon started successfully
generic:/ #

Quittez ce shell en tapant + exit + et en appuyant sur + ENTER +, ou en appuyant sur + CTRL + D +.

Dépannage

Si votre construction échoue, la cause la plus probable est une mémoire insuffisante. Pour résoudre ce problème, commencez par tuer le serveur Jack en exécutant la commande suivante:

jack-admin kill-server

Relancez ensuite la construction, mais avec moins de travaux parallèles autorisés. Par exemple, voici comment réduire le nombre de travaux parallèles à 2:

make -j

Si votre génération échoue à cause d’un espace disque insuffisant, vous tenterez probablement de créer plusieurs fois sans nettoyer les résultats des générations précédentes. Pour ignorer les résultats des versions précédentes, vous pouvez exécuter la commande suivante:

make clobber

Vous pouvez également ajouter plus d’espace disque à votre Droplet à l’aide de Block Storage de DigitalOcean.

Conclusion

Dans ce didacticiel, vous avez construit avec succès une ROM basée sur AOSP pour Android Oreo. Les techniques que vous avez apprises aujourd’hui sont également applicables à toutes les forks de l’AOSP, telles que Lineage OS et Resurrection Remix OS. Si vous avez déjà développé des applications Android, vous voudrez peut-être modifier de petites parties de la base de code AOSP pour donner à votre ROM une touche personnelle.

Pour en savoir plus sur la création du code source AOSP, parcourez le Android Building forum sur Google Groupes.