Build-Kategorien

Wählen Sie die Kategorie, die zu den von Ihnen geplanten Änderungen passt und dazu, wie Sie das Ergebnis verteilen möchten.

KategorieErlaubte ÄnderungenVerteilung und Updates
customProduktidentität, Funktionen, Anwendungen oder Dienste dürfen geändert werden.Unter einem eigenen Namen veröffentlichen und eine unabhängige Update-Infrastruktur betreiben.
unofficialÄnderungen sollten darauf beschränkt bleiben, die Unterstützung für das Zielgerät zu ermöglichen oder zu verbessern. Kernfunktionen und der Standard-App-Satz bleiben unverändert.Den Build klar als inoffiziell kennzeichnen. Nightly-Builds und OTA-Updates werden nicht bereitgestellt.
communityDie Geräteunterstützung wird auf einem für Community-Releases geeigneten Qualitätsniveau gepflegt, verfügbare Sicherheitsupdates werden eingespielt.Builds können über den Community-Release-Kanal veröffentlicht werden und erhalten OTA-Updates.
officialDas Gerät muss die Qualitätsanforderungen des Projekts erfüllen und einen offiziellen Maintainer haben.Builds werden über den offiziellen Release-Kanal veröffentlicht und erhalten OTA-Updates.
Warnung: Ein Build, der die Produktidentität, Funktionen, Standardanwendungen oder Dienste ändert, ist ein Custom-ROM, kein /e/OS-Build. Entfernen Sie den /e/OS-Namen und das Logo, wählen Sie einen eigenen ROM-Namen, kennzeichnen Sie ihn klar als Fork, und verwenden Sie nicht die offizielle OTA-Infrastruktur.

Die Quellen für Community- und offizielle Builds müssen auf der GitLab-Instanz des Projekts oder einer anderen vertrauenswürdigen öffentlichen Quelle wie LineageOS oder AOSP gehostet werden. Siehe Build-Status für die Release-Kanäle und Support-Level.

So bauen Sie das ROM

Warnung: Der Docker-Builder läuft auf jedem von Docker unterstützten 64-Bit-Linux-, macOS- oder Windows-Host. Die Android-Quellen müssen dennoch auf einem Dateisystem mit Groß-/Kleinschreibung gespeichert werden. Verwenden Sie unter macOS ein case-sensitives APFS-Volume. Verwenden Sie unter Windows Speicher, der vom WSL-2-Linux-Dateisystem oder einem Docker-Volume unterstützt wird, anstelle von NTFS.
Tipp: Ihr Computer benötigt einen 64-Bit-Prozessor und ein 64-Bit-Betriebssystem, mindestens 400 GB freien Speicherplatz und 16 GB RAM.

Docker installieren

Falls noch nicht geschehen, installieren Sie Docker.

Das Docker-Image abrufen

Tipp: Führen Sie diesen Schritt vor jedem Build aus, um sicherzustellen, dass Sie das neueste Docker-Image erhalten.
docker pull registry.gitlab.e.foundation:5000/e/os/docker-lineage-cicd:community

Ihren Gerätecode finden

Der Gerätecode findet sich in der /e/OS-Geräteliste oder durch Ausführen des folgenden Befehls über ADB:

adb shell getprop ro.product.device

Arbeitsverzeichnis wählen

Wählen Sie ein Dateisystem mit Groß-/Kleinschreibung und mindestens 400 GB freiem Speicherplatz. Setzen Sie WORK_DIR auf einen Ort in diesem Dateisystem; alle Quelldateien, Build-Artefakte, Protokolle und Compiler-Cache-Daten werden darunter gespeichert.

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

Optional: proprietäre Blobs extrahieren

Überspringen Sie diesen Abschnitt für den üblichen Docker-Community-Build. Der Builder verwendet die öffentlichen Manifeste und enthält standardmäßig unterstützte proprietäre Vendor-Dateien aus den öffentlichen TheMuppets-Manifesten.

Verwenden Sie diesen optionalen Schritt nur, wenn die öffentlichen Manifeste nicht die für Ihr Zielgerät benötigten Vendor-Dateien bereitstellen, oder wenn der Device-Tree, den Sie bauen, lokal extrahierte Blobs erwartet.

Tipp: Dieser Schritt erfordert ein Gerät, auf dem bereits ein Build desselben Android-Zweigs läuft, den Sie kompilieren möchten. Wenn Sie keinen Zugriff auf ein solches Gerät haben, lesen Sie Proprietäre Blobs extrahieren aus einer installierbaren ZIP-Datei.

So extrahieren Sie Blobs von einem verbundenen Gerät:

  • Verbinden Sie das Gerät per USB mit Ihrem Computer.
  • Aktivieren Sie ADB und Root.
  • Wechseln Sie zu ${WORK_DIR}/src/<branch>/device/<vendorname>/<my-device>.
  • Führen Sie das Extraktionsskript des Device-Trees aus:
./extract-files.sh

Die Blobs werden üblicherweise nach ${WORK_DIR}/src/<branch>/vendor/<vendorname>/<my-device> kopiert. Sobald sie an Ort und Stelle sind, führen Sie den Docker-Build aus.

Den Build starten

Führen Sie den folgenden Befehl aus. Vergessen Sie nicht, <my-device> durch Ihren Gerätecode und <branch> durch einen vorhandenen öffentlichen Entwicklungszweig zu ersetzen.

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

Wählen Sie einen Zweig aus dem öffentlichen e/os/android-Repository.

Umgebungsvariablen

Übergeben Sie Build-Einstellungen an docker run mit -e "NAME=value". Für einen Standard-Gerätebuild müssen nur BRANCH_NAME und DEVICE_LIST gesetzt werden.

VariableStandardZweck
BRANCH_NAMEa16Öffentlicher Entwicklungszweig, der gebaut werden soll. Verwenden Sie einen versionierten Zweig wie v4.2-a16 für einen reproduzierbaren Build.
DEVICE_LISTleerGerätecodename oder durch Komma getrennte Codenamen.
REPOhttps://gitlab.e.foundation/e/os/android.gitManifest-Repository, aus dem die Quellen ausgecheckt werden.
CCACHE_SIZE100GMaximale Größe des Compiler-Caches.
REPO_JOBS10Parallele Source-Sync-Jobs; reduzieren Sie diesen Wert bei langsamem Speicher.
BUILD_JOBSlogische CPUs + 2Parallele Android-Build-Jobs; setzen Sie einen niedrigeren Wert, um CPU- oder Speichernutzung zu begrenzen.
INCLUDE_PROPRIETARYtrueUnterstützte proprietäre Vendor-Dateien aus öffentlichen TheMuppets-Manifesten einbeziehen.
LFS_STRICTfalseFehlschlagen, wenn ein Git-LFS-Objekt nicht heruntergeladen werden kann, statt eine Warnung aufzuzeichnen.
IS_EMULATORfalseEin Emulator-Systemabbild statt eines Geräte-OTA-Pakets bauen.
BACKUP_IMGfalseEin Factory-Fastboot-Paket erzeugen, wenn das Gerät eine Factory-Flash-Konfiguration bereitstellt.
MINIMAL_APPSfalseAusgewählte optionale Anwendungen aus dem Build ausschließen.
ENG_BUILDfalseEinen Engineering-Build mit entwicklungsorientierten Standardwerten erzeugen.
OTA_URLleerDie im Build eingebettete Update-Server-URL festlegen.

Der vollständige Satz an Optionen und ihre aktuellen Standardwerte ist in Dockerfile.community definiert.

Beispiel für Fairphone 3/3+ mit dem öffentlichen /e/OS v4.2 Android-15-Zweig:

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 eignet sich für ein Festplatten-Array. Der Standardwert ist 10; verwenden Sie den Standardwert oder einen höheren Wert bei schnellem SSD-Speicher, falls die Netzwerkverbindung mithalten kann.

Für ein Android-16-x86_64-Emulator-Image verwenden Sie das Emulator-Produkt und aktivieren die Emulator-Paketierung:

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

Das resultierende IMG-e-…-sdk_phone_x86_64.zip ist ein Android-SDK- Systemabbild-Archiv, kein Factory-Flash-Paket für ein physisches Gerät.

Android 16 enthält derzeit einen defekten öffentlichen AOSP-Git-LFS-Zeiger in einem Rust-Testdaten-Archiv. Der Community-Builder zeichnet dies als Warnung auf und fährt fort, da die Datei für das Systemabbild nicht benötigt wird. Setzen Sie LFS_STRICT=true, wenn in Ihrer Umgebung jedes LFS-Objekt verfügbar sein muss.

Referenz-Build-Messwerte für FP3

Diese Messwerte sind ein Beispiel, keine Mindestanforderung und keine Leistungsgarantie. Sie wurden für einen Android-15-FP3-Build auf einem Intel Core i9-9900K (8 Kerne, 16 Threads), 62,7 GiB RAM und einem RAID-1-Array aus zwei SATA-Festplatten aufgezeichnet:

VorgangGemessene Zeit
Erstes Source-Checkout mit Git LFSCa. 3 Std. 7 Min. (ca. 2 Std. 32 Min. für repo sync, dann 35 Min. für Git LFS)
Fortgesetztes repo sync mit REPO_JOBS=225 Min. 59 Sek.
Android-Build (target-files-package und otatools)6 Std. 19 Min. 38 Sek.
Vollständiger Container-Lauf einschließlich Paketierung6 Std. 35 Min. 54 Sek.
Inkrementeller Rebuild und korrigierte Paketierung37 Min. 21 Sek.

Der Build nutzte bis zu etwa 15 logische CPU-Kerne und 29,4 GiB RAM. Das erste Checkout übertrug etwa 43,9 GB und schrieb etwa 336 GB auf den Datenträger. Die Checkout-Messungen beinhalten Wiederholungsversuche und sind daher kein kontrollierter Cold-Cache-Benchmark.

Referenz-Build-Messwerte für den Android-16-Emulator

Derselbe HDD-basierte Host erzeugte ein Android-16-sdk_phone_x86_64-Image mit BUILD_JOBS=18, ohne Compiler-Cache, mit den folgenden Zeiten:

VorgangGemessene Zeit
Erstes Checkout bis zur Git-LFS-Prüfung4 Std. 3 Min. 25 Sek.
Manuelle Wiederherstellung eines defekten, nicht build-kritischen öffentlichen LFS-ObjektsCa. 22 Min.
Android-Build6 Std. 15 Min. 34 Sek.
emu_img_zip-Paketierung9 Min. 56 Sek.
Vollständiger Build-Container-Lauf7 Std. 10 Min. 23 Sek.

Das resultierende Archiv war 1,60 GB groß. Seine Prüfsumme und ZIP-Integrität wurden verifiziert, und es enthielt die API-36-x86_64-SDK-Metadaten, kernel-ranchu, ramdisk.img, system.img und vendor.img. Diese Messwerte beinhalten einen ungecachten Build auf langsamem Speicher und sind keine Leistungsgarantien.

Build-Optionen

Sie können jetzt die standardmäßig in /e/OS installierten Anwendungen anpassen.

  • Wenn Sie den Standardanwendungen zusätzliche Anwendungen hinzufügen möchten: Fügen Sie Ihre APK dem Verzeichnis android_prebuilts_prebuiltapks/ hinzu und setzen Sie die Umgebungsvariable CUSTOM_APPS im Docker-Image entsprechend, bevor Sie bauen.
  • Wenn Sie einen minimalen /e/OS-Build beibehalten möchten, setzen Sie die Umgebungsvariable MINIMAL_APPS auf true (Standard ist false). Damit werden derzeit LibreOffice Viewer, PDFViewer, Maps und Weather entfernt.

Ihr Image abrufen

Wenn Ihr Build abgeschlossen ist, finden Sie die Pakete und ihre .sha256sum-Dateien in ${WORK_DIR}/zips/<my-device>:

  • Mit BACKUP_IMG=true ist IMG-e-…-<my-device>.zip das Factory-Fastboot- Paket zur Installation auf einem Gerät von Grund auf. Es enthält die Partitionsabbilder, das Flash-Skript und die Fastboot-Binärdateien, wenn das Gerät eine Factory-Flash-Konfiguration bereitstellt.
  • e-…-<my-device>.zip ist das OTA-Paket für ein Update oder eine Installation über die Recovery.
  • Mit IS_EMULATOR=true ist IMG-e-…-sdk_phone_x86_64.zip ein Android-SDK-Systemabbild-Archiv zum Erstellen eines virtuellen Emulator-Geräts.

Überprüfen Sie die Prüfsumme, bevor Sie ein Gerätepaket flashen oder ein Emulator-Systemabbild installieren. Für gerätespezifische Installationsschritte siehe die /e/OS-Geräteliste.

Weitere Hilfe benötigt

Wenn Sie Hilfe benötigen, wenden Sie sich bitte an andere ROM-Builder, die in unserem Forum aktiv sind und inoffizielle /e/OS-ROMs bauen. Eine Internetsuche nach Anleitungen zum Bauen von Android-ROMs kann ebenfalls hilfreiche Seiten liefern.

Weitere Informationen zu unserem Docker-Image und seinen Umgebungsvariablen finden Sie hier.

Um ein Problem mit einem Build zu melden, lesen Sie bitte diese Anleitung