Blog

Android AOSP in Docker bauen

JUL 14, 2016

Android AOSP in Docker erstellen

Eficode is the leading DevOps company in Europe, driving and building the future of software development across 10 countries, with 500+ experts in DevOps and sustainable software development. Our Eficode ROOT managed DevOps platform provides centralized access control and real-time visibility of project status, quality, and performance that integrates with 50+ of your preferred tools, including the Atlassian Stack and open-source systems like Jenkins and Kubernetes.

Das Dockerisieren verschiedener Umgebungen wird immer beliebter. Wir hatten die Idee, eine Umgebung zu schaffen, mit der wir Android AOSP für jedes Ziel in einem Docker-Container bauen können. Als Grundlage haben wir uns dafür entschieden, Android Marshmallow (6.0.1) für Nexus9 zu bauen.

Der Android-Build stellt Anforderungen an die Hardware. Er benötigt mindestens eine 64-Bit-Umgebung für Gingerbread (2.3.x) und neuere Versionen, einschließlich des Master-Branches, mindestens 100 GB freien Speicherplatz für einen Checkout und 150 GB für einen einzelnen Build. Mehr zu den Hardwareanforderungen. Wir haben diese Umgebung auf AWS- und DigitalOcean-Maschinen getestet. Für eine bessere Performance empfehlen wir einen Host mit 8 Kernen, 32 GB RAM und mindestens 200 GB SSD-Speicher. Bei Ubuntu 14.04 LTS als Host-OS für den Build von Android AOSP in einem Docker-Container sind einige Probleme aufgetreten, siehe „Bekannte Probleme“ unten. Daher empfehlen wir RedHat oder Ubuntu 16.04 LTS als Host-OS.

Vorbereitungen

Es gibt ein Setup für den Build von Android Marshmallow, Branch: android-6.0.1_r40, für den Nexus9-Kernel: aosp_flo. Wir empfehlen, das Setup als root-Benutzer auszuführen. Der Marshmallow-Branch benötigt openjdk-7. Wenn ihr jedoch einen Master-Branch bauen möchtet, müsst ihr Java im Dockerfile auf openjdk-8 aktualisieren.

Dieses Setup wurde getestet auf:

  • AWS-EC2-Instanz c4.4xlarge, 30 GB RAM, 16 VCPU, 62 ECU, 320 GB SSD. OS Ubuntu Trusty 14.04 LTS, Kernel-Version: 3.13.0-77-generic. Docker-Version 1.11.2, Docker-Compose-Version 1.7.1

  • AWS-EC2-Instanz m4.4xlarge, 64 GB RAM Pure, 16 VCPU, 240 GB SSD. OS RedHat RHEL 7.2, Kernel-Version: 3.10.0-327.el7.x86_64. Docker-Version 1.11.2, Docker-Compose-Version 1.7.1

  • DigitalOcean-Droplet, 16 GB RAM, 8 VCPU, 160 GB SSD. OS Ubuntu Xenial 16.04 LTS, Kernel-Version 4.4.0-24-generic. Docker-Version 1.11.2, Docker-Compose-Version 1.7.1. In dieser Dokumentation gehen wir davon aus, dass ihr einen ähnlichen Host mit installiertem GIT, Docker v1.11.2 und docker-compose v1.7.1 verwendet.

AWS-EC2-Instanz c4.4xlarge, 30 GB RAM, 16 VCPU, 62 ECU, 320 GB SSD. OS Ubuntu Trusty 14.04 LTS, Kernel-Version: 3.13.0-77-generic. Docker-Version 1.11.2, Docker-Compose-Version 1.7.1

AWS-EC2-Instanz m4.4xlarge, 64 GB RAM Pure, 16 VCPU, 240 GB SSD. OS RedHat RHEL 7.2, Kernel-Version: 3.10.0-327.el7.x86_64. Docker-Version 1.11.2, Docker-Compose-Version 1.7.1

DigitalOcean-Droplet, 16 GB RAM, 8 VCPU, 160 GB SSD. OS Ubuntu Xenial 16.04 LTS, Kernel-Version 4.4.0-24-generic. Docker-Version 1.11.2, Docker-Compose-Version 1.7.1. In dieser Dokumentation gehen wir davon aus, dass ihr einen ähnlichen Host mit installiertem GIT, Docker v1.11.2 und docker-compose v1.7.1 verwendet.

Siehe Docker unter Ubuntu installieren. Siehe Docker unter RedHat installieren.

Installation

Ladet die Android-Quellen herunter. Um Build-Zeit zu sparen, ist dieses Setup darauf ausgelegt, das Quellverzeichnis als Volume einzubinden. Das müsst ihr nur einmal tun und könnt dieselben Quellen für viele Container wiederverwenden. Wir folgen den Anweisungen auf source.android.com.

Repo-Tool installieren und Quellen herunterladen

mkdir ~/bin PATH=~/bin:$PATH curl https://storage.googleapis.com/git-repo downloads/repo > ~/bin/repo chmod a+x ~/bin/repo # Repo is a python script, so apt-get install python </code>

Erstellt ein Verzeichnis, in das die Quellen heruntergeladen werden sollen. Wechselt in dieses Verzeichnis und legt die globale Git-Konfiguration fest:

git config --global user.name "Your Name" git config --global user.email "you@example.com" mdkir ~/source cd ~/source # -b android-6.0.1_r40 is to checkout sources for Nexus 9 repo init -u https://android.googlesource.com/platform/manifest -b android-6.0.1_r40 repo sync

Weitere Details findet ihr unter Repo installieren und Quellen herunterladen.

Dieses Git-Projekt klonen

cd ~/ git clone https://github.com/Praqma/AndroidAospInDocker.git

Erstellt zwei weitere Verzeichnisse: eines für ccache und eines für die Build-Ausgabe aus dem Repo-Verzeichnis.

mkdir ~/ccache mkdir ~/build

Ändert die docker-compose-Datei mit den neuen Pfaden: Legt die Pfade zum Quellverzeichnis, zu ccache und zu den Build-Ausgabeverzeichnissen auf dem Host fest. Das Dockerfile und das Ausführungsskript findet ihr in diesem GitHub-Repo.

Zeit für den Build!

Wechselt in das Git-Repo mit dem heruntergeladenen Dockerfile und führt Folgendes aus:

cd ~/AndroidAospInDocker docker-compose up -d --build

Beim ersten Mal kann der Build auf unserer größten Instanz etwa 30 Minuten dauern. Danach könnt ihr ccache verwenden, und der Build dauert etwa 15 Minuten.

Ihr könnt das Build-Log mit Folgendem verfolgen:

docker logs -f <ContainerID>

Nach Abschluss des Builds findet ihr ein Image in dem Verzeichnis, in das ihr die Ausgabe umgeleitet habt.

Bekannte Probleme

Ausführung paralleler Jobs unter Ubuntu 14.04

Aus Gründen, die wir noch untersuchen, kann ein „make“-Build in einem Docker-Container nicht mehr als drei parallele Jobs unterstützen. Dies führt zu nicht mehr reagierenden Java-Prozessen, die nur durch einen Neustart des Hosts beendet werden können. Es gibt einige Hinweise darauf, dass Probleme mit Java in Docker mit diesem speziellen Problem zusammenhängen könnten. Dieses Problem tritt nur unter Ubuntu 14.04 auf; unter 16.04 funktioniert alles einwandfrei. Auch unter RedHat RHEL 7.2 funktioniert es problemlos.

  • Cloud
  • CI/CD

Subscribe to our newsletter