So erstellen Sie Android-ROMs unter Ubuntu 16.04

Einführung

Android ist heute das weltweit beliebteste Betriebssystem. Hunderte verschiedener Originalgerätehersteller oder OEMs installieren es auf ihren Geräten, da es kostenlos und Open Source ist und ein großes Ökosystem von Apps und Diensten enthält. Leider veröffentlichen viele OEMs keine regelmäßigen OTA-Updates für Android. Andere OEMs bieten Updates nur für einen begrenzten Zeitraum nach dem Start eines Geräts an. Darüber hinaus tendieren OEMs dazu, Android umfassend anzupassen, um sicherzustellen, dass ihre Geräte ein einzigartiges Erscheinungsbild aufweisen. Zu ihren Anpassungen gehören alternative Startprogramme, thematische Systembenutzeroberflächen und vorinstallierte Apps.

Wenn Sie all diese Anpassungen entfernen oder die neueste Version von reinem Android auf Ihrem Gerät ausführen möchten, können Sie selbst eine neue Firmware für dieses Gerät erstellen. In der Android-Modding-Community wird eine solche Firmware normalerweise als ROM (Read Only Memory) bezeichnet.

In diesem Tutorial erstellen Sie ein Android Oreo-ROM, das auf dem Android Open Source Project oder kurz AOSP basiert. Um dieses Lernprogramm geräteunabhängig und allgemein zu halten, wird nur der AOSP-Emulator als Ziel verwendet. Sie können jedoch die gleichen Techniken für tatsächliche Geräte anwenden.

Voraussetzungen

Um mitmachen zu können, benötigen Sie:

  • Ein Ubuntu 16.04 x64-Server mit mindestens 16 GB RAM, 4 CPUs und 120 GB Speicherplatz wird unter https://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu- eingerichtet. 16-04 [das Handbuch zur Einrichtung des Ubuntu 16.04-Servers], einschließlich eines sudo-Benutzers ohne Rootberechtigung und einer Firewall. Der Kompilierungsprozess erfordert viel RAM und mehr CPUs beschleunigen die Kompilierungszeit. Außerdem sind die Dateien, die Sie herunterladen und erstellen, recht groß. DigitalOcean hat High CPU Droplets, was für dieses Projekt eine gute Lösung sein könnte.

  • Git wird unter How To Install Git on Ubuntu 16.04 installiert.

Schritt 1 - Starten Sie eine Bildschirmsitzung

Einige der Befehle, die Sie in diesem Lernprogramm ausführen, können möglicherweise stundenlang ausgeführt werden. Wenn die SSH-Verbindung zwischen Ihrem PC und Ihrem Server unterbrochen wird, während die Befehle ausgeführt werden, werden sie abrupt beendet. Um eine solche Situation zu vermeiden, verwenden Sie das Dienstprogramm "+ screen +", mit dem Sie mehrere Konsolensitzungen in einem einzigen Terminal ausführen können. Mit screen können Sie sich von einer laufenden Sitzung trennen und später eine Verbindung herstellen. Wenn Sie noch nicht mit Screen vertraut sind, erfahren Sie mehr unter https://www.digitalocean.com/community/tutorials/how-to-install-and-use-screen-on-an-ubuntu-cloud-server im vorliegenden Tutorial mit Screen auf Ubuntu].

Starten Sie eine neue "+ screen +" - Sitzung.

screen

Wenn Sie screen zum ersten Mal ausführen, wird eine Lizenzvereinbarung angezeigt. Drücken Sie die Eingabetaste, um die Lizenz zu akzeptieren.

Sollte Ihre SSH-Verbindung ab diesem Zeitpunkt fehlschlagen, werden Ihre lang laufenden Befehle weiterhin im Hintergrund ausgeführt. Sobald Sie die SSH-Verbindung wiederhergestellt haben, können Sie die Sitzung fortsetzen, indem Sie "+ screen -r +" ausführen.

Als Nächstes installieren wir die Komponenten, die wir zum Kompilieren von Android benötigen.

Schritt 2 - Abhängigkeiten installieren

Der AOSP-Quellcode ist auf mehrere verschiedene Git-Repositorys verteilt. Um den Benutzern das Herunterladen all dieser Repositorys zu erleichtern, hat die AOSP-Community ein Befehlszeilentool mit dem Namen https://storage.googleapis.com/git-repo-downloads/repo [+ repo +] erstellt.

Wir laden die neueste Version des Tools mit "+ wget " herunter und speichern sie im Verzeichnis " ~ / bin ". Erstellen Sie zuerst das Verzeichnis ` ~ / bin +`:

mkdir -p ~/bin

Dann lade das + repo + Skript herunter:

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

Verwenden Sie "+ chmod ", um Ihrem aktuellen Benutzer die Berechtigung zum Ausführen von " repo +" zu erteilen.

chmod +x ~/bin/repo

Das Tool + repo + verwendet Git intern und erfordert, dass Sie eine Git-Konfiguration erstellen, in der Ihr Benutzername und Ihre E-Mail-Adresse angegeben sind. Führen Sie dazu die folgenden Befehle aus:

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

Der Quellcode von Android besteht hauptsächlich aus Java-, C - und XML-Dateien. Um den Quellcode zu kompilieren, müssen Sie OpenJDK 8, GNU C- und C - Compiler, XML-Parsing-Bibliotheken, ImageMagick und mehrere andere verwandte Pakete installieren. Glücklicherweise können Sie alle mit + apt + installieren. Stellen Sie zuvor sicher, dass Sie die Paketlisten Ihres Servers aktualisieren.

sudo apt-get update

Installieren Sie nach der Aktualisierung der Listen die Abhängigkeiten:

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

Sobald die Abhängigkeiten heruntergeladen sind, können wir das "+ repo +" - Skript verwenden, um die Android-Quelle zu erhalten.

Schritt 3 - Herunterladen des Quellcodes

Wir werden das "+ repo +" -Skript verwenden, um einige Aufgaben auszuführen, um unseren Arbeitsbereich vorzubereiten. Erstellen Sie ein neues Verzeichnis zum Speichern der Android-Quelle, die Sie herunterladen möchten:

mkdir -p ~/aosp/oreo

Sie werden in diesem Verzeichnis im weiteren Verlauf dieses Lernprogramms arbeiten. Wechseln Sie jetzt zu diesem Verzeichnis:

cd ~/aosp/oreo

Das Verzeichnis muss mit dem AOSP-Repository manifest initialisiert werden, einem speziellen Git-Repository, das eine XML-Datei mit dem Namen "+ default.xml +" enthält, in der die Pfade aller anderen angegeben sind Git-Repositorys, die zusammen die AOSP-Codebasis bilden.

Das Arbeiten mit dem gesamten AOSP-Codebaum kann mühsam werden. Aus diesem Grund müssen Sie zusätzlich den Namen einer bestimmten Revision oder eines bestimmten Zweigs angeben, an dem Sie interessiert sind. In diesem Tutorial verwenden wir, da wir ein Oreo-ROM erstellen, den Zweig "+ android-8.0.0_r33 ", dessen Build-ID " OPD1.170816.025 +" lautet. Eine Liste aller verfügbaren Build-IDs und Filialnamen finden Sie auf der offiziellen AOSP-Seite Codenamen, Tags und Build-Nummern.

Außerdem benötigen Sie für dieses Lernprogramm nicht den gesamten Festschreibungsverlauf des Codebaums. Sie können sowohl Zeit als auch Speicherplatz sparen, indem Sie den Verlauf bis zu einer Tiefe von "+ 1 +" kürzen.

Verwenden Sie daher den Befehl + repo init +, um das Verzeichnis zu initialisieren und die folgenden Optionen anzugeben:

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

Wenn Sie aufgefordert werden, die Farbanzeige zu aktivieren, drücken Sie * Y * und anschließend * Enter *.

Laden Sie abschließend die aktuellen AOSP-Dateien aus den verschiedenen Repositorys herunter, indem Sie den Befehl + repo sync + ausführen:

repo sync

Mit dem obigen Befehl werden über 30 GB Daten heruntergeladen. Seien Sie also geduldig, während der Vorgang abgeschlossen ist. Sobald dies der Fall ist, richten wir einen Cache ein, um die Kompilierung zu beschleunigen.

Schritt 4 - Compiler-Cache vorbereiten

Um Ihre Builds zu beschleunigen, können Sie einen Compiler-Cache verwenden. Wie der Name schon sagt, können Sie mit einem Compiler-Cache vermeiden, dass Teile des ROMs, die bereits kompiliert wurden, erneut kompiliert werden.

Um die Verwendung eines Compiler-Caches zu aktivieren, legen Sie eine Umgebungsvariable mit dem Namen "+ USE_CCACHE +" fest.

export USE_CCACHE=1

Solange Sie nicht viel freien Speicherplatz haben, möchten Sie nicht, dass der Cache zu groß wird, und Sie können seine Größe begrenzen. Wenn Sie Ihr ROM für ein einzelnes Gerät erstellen, können Sie es auf 15 GB beschränken. Verwenden Sie dazu den Befehl + ccache +.

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

Es wird eine Meldung angezeigt, die bestätigt, dass Sie diese Änderung vorgenommen haben:

OutputSet cache size limit to  Gbytes

Wir müssen noch eine Optimierung vornehmen, bevor wir kompilieren können. Lassen Sie uns das als nächstes tun.

Schritt 5 - Konfigurieren von Jack

Der Jack-Server, der für die Erstellung der meisten Java-basierten Teile des ROM verantwortlich ist, benötigt viel Speicher. Um Speicherzuordnungsfehler zu vermeiden, können Sie eine Umgebungsvariable mit dem Namen "+ ANDROID_JACK_VM_ARGS +" verwenden, um anzugeben, wie viel Speicher Jack verwenden darf. Normalerweise reicht es aus, etwa 50% des Arbeitsspeichers Ihres Servers zuzuweisen. Diese Umgebungsvariable gibt auch andere Kompilierungseinstellungen an.

Führen Sie den folgenden Befehl aus, um dem Jack-Server 8 GB RAM zuzuweisen und die von Jack benötigten Standard-Kompilierungsoptionen beizubehalten:

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

Jetzt können Sie Ihr Android-ROM erstellen.

Schritt 6 - Starten des Builds

Der AOSP-Codebaum enthält ein Skript mit dem Namen "+ envsetup.sh ", das mehrere Hilfsfunktionen für die Erstellung enthält. Während viele der Hilfsfunktionen wie " mm ", " mma " und " mmm " als Shortcuts für den Befehl " make " dienen, setzen andere wie " lunch +" wichtige Umgebungsvariablen Anderenfalls entscheiden Sie über die CPU-Architektur des ROM und den Typ des Builds.

Rufen Sie das Skript auf, um Zugriff auf die Hilfsfunktionen zu erhalten.

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

Führen Sie anschließend "+ lunch " aus und übergeben Sie den Codenamen Ihres Geräts mit einem Build-Typ, der entweder " eng ", " userdebug " oder " user " sein kann. Während die Build-Typen " young" und "+ userdebug" zu ROMs führen, die sich am besten für Testzwecke eignen, wird der Build-Typ "+ user" und "+ build" für die Produktion empfohlen.

Um ein Test-ROM zu erstellen, das auf dem AOSP ARM-Emulator ausgeführt werden kann, übergeben Sie "+ aosp_arm-eng " an den Befehl " lunch +":

lunch aosp_arm-eng

Sie sehen diese Ausgabe mit den Umgebungseinstellungen:

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=
============================================

Führen Sie abschließend "+ make " aus, um den Build zu starten. ` make ` unterstützt parallele Jobs, sodass Sie den Build erheblich beschleunigen können, indem Sie die Option ` -j +` verwenden, um die Anzahl der parallelen Jobs gleich der Anzahl der auf dem Server verfügbaren CPUs zu setzen.

Verwenden Sie den Befehl + nproc +, um zu sehen, wie viele CPUs Sie haben:

nproc

Der Befehl gibt die Anzahl der CPUS zurück:

Output8

Sie können diese Nummer dann mit + make + verwenden, um die parallele Ausführung anzugeben:

make -j

Selbst bei 8 CPUs müssen Sie über eine Stunde warten, bis der Build abgeschlossen ist, sofern auf Ihrem Server keine anderen CPU-intensiven Prozesse aktiv sind. Die Dauer des Builds ist direkt proportional zur Größe des Arbeitsspeichers und der Anzahl der CPUs, die Sie haben. Wenn Sie schnellere Builds wünschen, können Sie spezielle High CPU Droplets verwenden, die bis zu 32 CPUs und 48 GB Arbeitsspeicher unterstützen.

Sobald das ROM fertig ist, sollte eine Meldung angezeigt werden, dass der Build erfolgreich abgeschlossen wurde. Sie können auch die genaue Dauer des Builds anzeigen.

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)) ####

Lassen Sie uns überprüfen, ob die Dinge richtig aufgebaut sind.

Schritt 7 - Überprüfen des Builds

Die Ausgabe des Erstellungsprozesses besteht aus mehreren Dateisystemimages, die zusammen das ROM bilden. Sie finden sie im Verzeichnis "+ 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

Um das ROM zu testen, können Sie versuchen, einen Emulator damit zu starten, indem Sie den Befehl + emulator + ausführen. Wenn Sie sich in einer Nicht-GUI-Umgebung befinden, stellen Sie sicher, dass Sie die Flags "+ -no-window " und " -noaudio +" übergeben.

emulator  > /dev/null 2>&1 &

Um zu überprüfen, ob der Emulator erfolgreich gestartet werden konnte, warten Sie eine Minute und öffnen Sie mit dem Android-Debug-Bridge-Tool "+ adb +" eine Shell im Emulator.

adb shell

Wenn das ROM keine Probleme aufweist, wird eine Eingabeaufforderung von einer Shell angezeigt, die auf dem Emulator ausgeführt wird.

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

Verlassen Sie diese Shell, indem Sie "+ exit " eingeben und " ENTER " oder " CTRL + D +" drücken.

Fehlerbehebung

Wenn Ihr Build fehlgeschlagen ist, ist die wahrscheinlichste Ursache unzureichender Arbeitsspeicher. Um das Problem zu beheben, müssen Sie zuerst den Jack-Server mit dem folgenden Befehl beenden:

jack-admin kill-server

Starten Sie dann den Build erneut, wobei jedoch weniger parallele Jobs zulässig sind. So können Sie beispielsweise die Anzahl der parallelen Jobs auf nur 2 reduzieren:

make -j

Wenn Ihr Build aufgrund unzureichenden Speicherplatzes fehlgeschlagen ist, versuchen Sie wahrscheinlich, mehrmals zu erstellen, ohne die Ergebnisse früherer Builds zu bereinigen. Um die Ergebnisse früherer Builds zu verwerfen, können Sie den folgenden Befehl ausführen:

make clobber

Alternativ können Sie Ihrem Droplet mehr Speicherplatz hinzufügen, indem Sie DigitalOceans Block Storage verwenden.

Fazit

In diesem Tutorial haben Sie erfolgreich ein AOSP-basiertes ROM für Android Oreo erstellt. Die Techniken, die Sie heute gelernt haben, sind auch auf alle Gabeln von AOSP anwendbar, z. B. Lineage OS und Resurrection Remix OS. Wenn Sie Erfahrung mit der Entwicklung von Android-Apps haben, möchten Sie möglicherweise kleine Teile der AOSP-Codebasis ändern, um Ihrem ROM eine persönliche Note zu verleihen.

Weitere Informationen zum Erstellen des AOSP-Quellcodes finden Sie unter Android Building forum in Google Groups.