Catégories de builds

Choisissez la catégorie qui correspond aux modifications que vous comptez apporter et à la manière dont vous prévoyez de distribuer le résultat.

CatégorieModifications autoriséesDistribution et mises à jour
customL’identité du produit, les fonctionnalités, les applications ou les services peuvent être modifiés.Publiez sous un nom distinct et exploitez votre propre infrastructure de mise à jour.
unofficialLes modifications doivent se limiter à activer ou améliorer la prise en charge de l’appareil cible. Les fonctionnalités de base et l’ensemble d’applications par défaut restent inchangés.Identifiez clairement le build comme non officiel. Les builds nightly et les mises à jour OTA ne sont pas fournis.
communityLa prise en charge de l’appareil est maintenue à un niveau de qualité adapté aux versions community, avec application des mises à jour de sécurité disponibles.Les builds peuvent être publiés via le canal de diffusion community et reçoivent des mises à jour OTA.
officialL’appareil doit répondre aux exigences de qualité du projet et disposer d’un mainteneur officiel.Les builds sont publiés via le canal de diffusion officiel et reçoivent des mises à jour OTA.
Avertissement: Une build qui modifie l’identité du produit, les fonctionnalités, les applications par défaut ou les services est une ROM personnalisée, pas une build /e/OS. Retirez le nom et le logo /e/OS, choisissez un nom de ROM distinct, indiquez clairement qu’il s’agit d’un fork, et n’utilisez pas l’infrastructure OTA officielle.

Les sources des builds community et official doivent être hébergées sur l’instance GitLab du projet ou sur une autre source publique de confiance, comme LineageOS ou AOSP. Consultez Types de versions pour les canaux de diffusion et les niveaux de support.

Comment compiler la ROM

Avertissement: Le builder Docker fonctionne sur tout hôte Linux, macOS ou Windows 64 bits pris en charge par Docker. Les sources Android doivent néanmoins être stockées sur un système de fichiers sensible à la casse. Sur macOS, utilisez un volume APFS sensible à la casse. Sur Windows, utilisez un stockage reposant sur le système de fichiers Linux de WSL 2 ou un volume Docker plutôt que NTFS.
Astuce: Votre ordinateur doit disposer d’un processeur et d’un système d’exploitation 64 bits, d’au moins 400 Go de stockage libre et de 16 Go de RAM.

Installer Docker

Si ce n’est pas déjà fait, installez Docker.

Récupérer l’image Docker

Astuce: Veuillez exécuter cette étape avant chaque build, afin d’être sûr d’obtenir la dernière image Docker.
docker pull registry.gitlab.e.foundation:5000/e/os/docker-lineage-cicd:community

Trouver le code de votre appareil

Le code de l’appareil se trouve sur la liste des appareils /e/OS ou en exécutant la commande suivante avec ADB :

adb shell getprop ro.product.device

Choisir un répertoire de travail

Choisissez un système de fichiers sensible à la casse disposant d’au moins 400 Go d’espace libre. Faites pointer WORK_DIR vers un emplacement sur ce système de fichiers ; tous les fichiers sources, artefacts de build, journaux et données de cache du compilateur y seront stockés.

export WORK_DIR=/path/to/eos-build
mkdir -p \
"${WORK_DIR}/src" \
"${WORK_DIR}/zips" \
"${WORK_DIR}/logs" \
"${WORK_DIR}/ccache"

Optionnel : extraire les blobs propriétaires

Passez cette section pour un build community Docker habituel. Le builder utilise les manifestes publics et, par défaut, inclut les fichiers vendor propriétaires pris en charge provenant des manifestes publics TheMuppets.

N’utilisez cette étape optionnelle que lorsque les manifestes publics ne fournissent pas les fichiers vendor requis par votre appareil cible, ou lorsque le device tree que vous compilez attend des blobs extraits localement.

Astuce: Cette étape nécessite un appareil fonctionnant déjà avec une build basée sur la même branche Android que celle que vous voulez compiler. Si vous n’avez pas accès à un tel appareil, reportez-vous à Extraire les blobs propriétaires depuis un zip installable.

Pour extraire les blobs depuis un appareil connecté :

  • Connectez l’appareil à votre ordinateur en USB.
  • Activez ADB et le root.
  • Rendez-vous dans ${WORK_DIR}/src/<branch>/device/<vendorname>/<my-device>.
  • Exécutez le script d’extraction du device tree :
./extract-files.sh

Les blobs sont habituellement copiés dans ${WORK_DIR}/src/<branch>/vendor/<vendorname>/<my-device>. Une fois qu’ils sont en place, lancez le build Docker.

Lancer le build

Exécutez la commande suivante. N’oubliez pas de remplacer <my-device> par le code de votre appareil et <branch> par une branche de développement publique existante.

docker run --rm \
-v "${WORK_DIR}/src:/srv/src" \
-v "${WORK_DIR}/zips:/srv/zips" \
-v "${WORK_DIR}/logs:/srv/logs" \
-v "${WORK_DIR}/ccache:/srv/ccache" \
-e "BRANCH_NAME=<branch>" \
-e "DEVICE_LIST=<my-device>" \
-e "REPO=https://gitlab.e.foundation/e/os/android.git" \
registry.gitlab.e.foundation:5000/e/os/docker-lineage-cicd:community

Choisissez une branche du dépôt public e/os/android.

Variables d’environnement

Transmettez les réglages de build à docker run avec -e "NAME=value". Seuls BRANCH_NAME et DEVICE_LIST doivent être définis pour un build standard d’appareil.

VariableValeur par défautRôle
BRANCH_NAMEa16Branche de développement publique à compiler. Utilisez une branche versionnée comme v4.2-a16 pour un build reproductible.
DEVICE_LISTvideNom de code de l’appareil, ou plusieurs noms de code séparés par des virgules.
REPOhttps://gitlab.e.foundation/e/os/android.gitDépôt de manifestes utilisé pour récupérer les sources.
CCACHE_SIZE100GTaille maximale du cache du compilateur.
REPO_JOBS10Nombre de tâches parallèles de synchronisation des sources ; réduisez cette valeur sur un stockage lent.
BUILD_JOBSCPU logiques + 2Nombre de tâches parallèles de compilation Android ; définissez une valeur plus basse pour limiter l’usage CPU ou mémoire.
INCLUDE_PROPRIETARYtrueInclut les fichiers vendor propriétaires pris en charge provenant des manifestes publics TheMuppets.
LFS_STRICTfalseÉchoue lorsqu’un objet Git LFS ne peut pas être téléchargé, au lieu d’enregistrer un avertissement.
IS_EMULATORfalseCompile une image système pour émulateur au lieu d’un paquet OTA pour appareil.
BACKUP_IMGfalseGénère un paquet fastboot d’usine lorsque l’appareil fournit une configuration de flash d’usine.
MINIMAL_APPSfalseExclut du build certaines applications optionnelles.
ENG_BUILDfalseProduit un build engineering avec des réglages par défaut orientés développement.
OTA_URLvideDéfinit l’URL du serveur de mise à jour embarquée dans le build.

L’ensemble complet des options et leurs valeurs par défaut actuelles est défini dans Dockerfile.community.

Exemple pour le Fairphone 3/3+ avec la branche publique /e/OS v4.2 Android 15 :

docker run --rm \
-v "${WORK_DIR}/src:/srv/src" \
-v "${WORK_DIR}/zips:/srv/zips" \
-v "${WORK_DIR}/logs:/srv/logs" \
-v "${WORK_DIR}/ccache:/srv/ccache" \
-e "BRANCH_NAME=v4.2-a15" \
-e "DEVICE_LIST=FP3" \
-e "REPO=https://gitlab.e.foundation/e/os/android.git" \
-e "INCLUDE_PROPRIETARY=false" \
-e "BACKUP_IMG=true" \
-e "REPO_JOBS=2" \
registry.gitlab.e.foundation:5000/e/os/docker-lineage-cicd:community

REPO_JOBS=2 convient à une grappe de disques durs. La valeur par défaut est 10 ; utilisez la valeur par défaut ou une valeur plus élevée sur un stockage SSD rapide si la connexion réseau peut suivre.

Pour une image émulateur x86_64 Android 16, utilisez le produit émulateur et activez l’empaquetage émulateur :

docker run --rm \
-v "${WORK_DIR}/src:/srv/src" \
-v "${WORK_DIR}/zips:/srv/zips" \
-v "${WORK_DIR}/logs:/srv/logs" \
-v "${WORK_DIR}/ccache:/srv/ccache" \
-e "BRANCH_NAME=v4.2-a16" \
-e "DEVICE_LIST=sdk_phone_x86_64" \
-e "REPO=https://gitlab.e.foundation/e/os/android.git" \
-e "INCLUDE_PROPRIETARY=false" \
-e "IS_EMULATOR=true" \
registry.gitlab.e.foundation:5000/e/os/docker-lineage-cicd:community

Le fichier IMG-e-…-sdk_phone_x86_64.zip obtenu est une archive d’image système Android SDK, et non un paquet de flash d’usine pour un appareil physique.

Android 16 contient actuellement un pointeur Git LFS public AOSP cassé dans une archive de données de test Rust. Le builder community l’enregistre comme un avertissement et continue, car ce fichier n’est pas nécessaire à l’image système. Définissez LFS_STRICT=true si tous les objets LFS doivent être disponibles dans votre environnement.

Mesures de référence d’un build FP3

Ces mesures sont un exemple, pas un minimum ni une garantie de performance. Elles ont été relevées pour un build FP3 Android 15 sur un Intel Core i9-9900K (8 cœurs, 16 threads), 62,7 Gio de RAM et une grappe RAID 1 composée de deux disques durs SATA :

OpérationTemps mesuré
Récupération initiale des sources avec Git LFSEnviron 3 h 7 min (environ 2 h 32 min pour repo sync, puis 35 min pour Git LFS)
Reprise de repo sync avec REPO_JOBS=225 min 59 s
Build Android (target-files-package et otatools)6 h 19 min 38 s
Exécution complète du conteneur, empaquetage inclus6 h 35 min 54 s
Recompilation incrémentale et empaquetage corrigé37 min 21 s

Le build a utilisé jusqu’à environ 15 cœurs CPU logiques et 29,4 Gio de RAM. La récupération initiale a transféré environ 43,9 Go et écrit environ 336 Go sur le stockage. Les mesures de récupération incluent des reprises et ne constituent donc pas un benchmark contrôlé à cache froid.

Mesures de référence d’un build émulateur Android 16

La même machine hôte à disques durs a produit une image Android 16 sdk_phone_x86_64 avec BUILD_JOBS=18, sans cache de compilation, avec les temps suivants :

OpérationTemps mesuré
Récupération initiale jusqu’à la vérification Git LFS4 h 3 min 25 s
Récupération manuelle d’un objet LFS public cassé, non critique pour le buildEnviron 22 min
Build Android6 h 15 min 34 s
Empaquetage emu_img_zip9 min 56 s
Exécution complète du conteneur de build7 h 10 min 23 s

L’archive obtenue pesait 1,60 Go. Sa somme de contrôle et l’intégrité du ZIP ont été vérifiées, et elle contenait les métadonnées SDK x86_64 API 36, kernel-ranchu, ramdisk.img, system.img et vendor.img. Ces mesures incluent un build sans cache sur un stockage lent et ne constituent pas des garanties de performance.

Options de build

Vous pouvez désormais personnaliser les applications installées par défaut dans /e/OS.

  • si vous voulez ajouter des applications supplémentaires aux applications par défaut : ajoutez votre APK dans le répertoire android_prebuilts_prebuiltapks/ et définissez la variable d’environnement CUSTOM_APPS en conséquence dans l’image Docker, avant de compiler.
  • si vous voulez conserver un build /e/OS minimal, définissez la variable d’environnement MINIMAL_APPS à true (false par défaut). Pour l’instant, cela retire la visionneuse LibreOffice, PDFViewer, Cartes et Météo.

Récupérer votre image

Une fois le build terminé, retrouvez les paquets et leurs fichiers .sha256sum dans ${WORK_DIR}/zips/<my-device> :

  • Avec BACKUP_IMG=true, IMG-e-…-<my-device>.zip est le paquet fastboot d’usine pour installer sur un appareil à partir de zéro. Il comprend les images de partitions, le script de flash et les binaires fastboot lorsque l’appareil fournit une configuration de flash d’usine.
  • e-…-<my-device>.zip est le paquet OTA pour une mise à jour ou une installation via le recovery.
  • Avec IS_EMULATOR=true, IMG-e-…-sdk_phone_x86_64.zip est une archive d’image système Android SDK pour créer un appareil virtuel d’émulation.

Vérifiez la somme de contrôle avant de flasher un paquet appareil ou d’installer une image système d’émulateur. Pour les étapes d’installation propres à chaque appareil, consultez la liste des appareils /e/OS.

Besoin d’aide supplémentaire

Si vous avez besoin d’aide, rapprochez-vous des autres compilateurs de ROM actifs sur notre forum qui compilent des ROM /e/OS non officielles. Une recherche sur internet de guides de compilation de ROM Android fera aussi apparaître des sites qui devraient vous être utiles.

Pour plus d’informations sur notre image docker et ses variables d’environnement, cliquez ici.

Pour signaler un problème concernant un build, consultez ce guide