# Android unter Gentoo bauen

## JoHo42

Hallo Leute,

ich würde ganz gerne ein Android System unter Gentoo bauen.

Die Anleitungen beziehen sich meistens auf Ubunntu LTS.

Geht das auch unter Gentoo?

Wenn ich im Portage nach den Softwarepakete suche, finde ich manche nicht.

Es gibt wohl im layman was, aber funktioniert nicht wirklich.

Hat das jemand schonmal gemacht oder doch ein Ubuntu in einer VM installieren.

Eigentlich möchte ich VM vermeiden und es lieber direkt unter Gentoo bearbeiten.

Gruß Jörg

----------

## firefly

Klar geht das unter jeder linux distribution, vorraussetzung ist nur die passenden pakete installiert zu haben.

Welche Pakete findest du denn nicht?

----------

## JoHo42

Hi firefly,

hier ist die Liste an programmen die installieret werden soll:

bc bison build-essential curl flex g++-multilib gcc-multilib git gnupg gperf imagemagick lib32ncurses5-dev lib32readline-gplv2-dev lib32z1-dev libesd0-dev liblz4-tool libncurses5-dev libsdl1.2-dev libwxgtk2.8-dev libxml2 libxml2-utils lzop pngcrush schedtool squashfs-tools xsltproc zip zlib1g-dev

Die Liste ist für Ubuntu (https://forum.xda-developers.com/chef-central/android/how-to-build-lineageos-14-1-t3551484) und nicht für Gentoo, es gibt keine Liste für Gentoo.

Was es davon nicht unter Gentoo gibt:

build-essential

g++-multilib

gcc-multilib

lib32ncurses5-dev

lib32readline-gplv2-dev

usw...

Gruß Jörg

----------

## firefly

 *Quote:*   

> g++-multilib
> 
> gcc-multilib 
> 
> 

 

Das ist nichts anderes als dass der gcc auch 32bit binaries bauen kann bzw. in 32bit existiert. Und wenn du unter gentoo multilib verwendest (ein entsprechendes profil ist aktiv) dann ist der part schon installiert.

Die ganzen -dev sachen sind nicht relevant unter gentoo. Diese pakete enhalten nur die Teile (z.b. header files beu c/c++ code), welche benötigt werden um ein anderes programm, welches diese libs verwendet bauen zu können.

Da unter gentoo alles aus sourcen gebaut wird sind diese Teile schon im system vorhanden.

Du musst nur die entsprechenden pakete (z.b. libxml2 für libxml2-dev) installiert haben.

Für die lib32 varianten musst du unter gentoo das paket (ohne den lib32 prefix) installiert haben und dabei muss ABI_X86=32 für das paket beim bauen gesetzt sein. 

Durch ABI_X86=32 wird das paket neben der 64bit Fassung auch in einer 32bit Fassung gebaut.

----------

## ChrisJumper

hi JoHo42,

wenn du auch lineageos bauen willst. Das geht allerdings gab es ein paar Stolpersteine. Ich hab das nicht an die XDA-Developer Anleitung gehalten aber an die aus dem Lineagewiki zu dem Device welches ich bauen wollten Bsp wiki LG G2 (Intl). Bei der von dir genannten Liste:

bc bison build-essential curl flex g++-multilib gcc-multilib git gnupg gperf imagemagick lib32ncurses5-dev lib32readline-gplv2-dev lib32z1-dev libesd0-dev liblz4-tool libncurses5-dev libsdl1.2-dev libwxgtk2.8-dev libxml2 libxml2-utils lzop pngcrush schedtool squashfs-tools xsltproc zip zlib1g-dev

Hab ich einfach alle installiert die ich mit ähnlichem Namen per eix in portage finden konnte.

1. Dann musste ich in dem Build-Verzeichnis (~/android/lineageos) noch python2_7 als Default setzten weil das die Build Skripte wohl voraussetzen, aber das geht eifnach mit dev-python/virtualenv.

2. Wegen einem Bug im Breakfast Skript, sollte man wohl "export LC_ALL=C", sonst bricht er immer mit einem Date Time Fehler ab.

Google selber bietet auch umfangreiche Informationen zum Build Umgebung, also android-sdk-update-manager sollte schon installiert sein. Das ist mittlerweile aber ein Monster der selber den Download von Android und Abhängkeiten vor nimmt. Hab hier direkt 2.4.4.1 unstable installiert.

Einzig das mit dem openjdk ist ein wenig seltsam. Ich braucht halt für Lineageos 14 und 15 Openjdk 1.8 und das gibt es wohl nur von Oracle (dev-java/oracle-jdk-bin), weil openjdk unter Gentoo die Version 11.0.1_p13 besitzt, hab ich es damit gar nicht erst probiert.

Zur Liste:

sys-libs/ncurses-5.9-r101

sys-libs/readline-7.0_p3

Wenn du noch fragen hast schreib einfach dann schau ich nach. Das mit den 32-Bit Versionen hat firefly ja schon geschrieben. Ich glaube Multilib ist bei Gentoo sogar default und no-multilib die Ausnahme. Ich hab jedenfalls ein Multilib-System und da nichts besonders angegeben.

----------

## firefly

 *ChrisJumper wrote:*   

> Einzig das mit dem openjdk ist ein wenig seltsam. Ich braucht halt für Lineageos 14 und 15 Openjdk 1.8 und das gibt es wohl nur von Oracle (dev-java/oracle-jdk-bin), weil openjdk unter Gentoo die Version 11.0.1_p13 besitzt, hab ich es damit gar nicht erst probiert.

 

Die version sagt erstmal gar nichts. Die Version von openjdk, der java api version und die version des paketes, welche eine java runtime (mit hilfe von openjdk) zusammenstellt, müssen nicht identisch sein.

Z.b. habe ich icedtea (in der -bin variante) in version 3.9.0 installiert und folgende versionsangabe gibt java aus:

 *Quote:*   

> $ java -version
> 
> openjdk version "1.8.0_181"
> 
> OpenJDK Runtime Environment (IcedTea 3.9.0) (Gentoo icedtea-3.9.0)
> ...

 

EDIT: Hab mich vertan, die version von openjdk ist gleichzeitig die java api version.

dev-java/openjdk-11.x ist für die java api version 11.

Aber für java 8 (oder 1.8 ) gibt es in gentoo mindestens zwei pakete die diese Version bereitstellen:

dev-java/oracle-jdk-bin-1.8.0.x

dev-java/icedtea(-bin)-3.9.0

----------

## forrestfunk81

Die JDKs sind abwärtskompatibel und können Byte Code in niedrigerer Version erzeugen. Ein JDK 11 kann also auch Bytecode erzeugen, der von einem JDK 8 ausgeführt wird. Das muss als Compiler Flag angegeben werden. Ich gehe davon aus, dass der Android Build aber schon so konfiguriert ist, dass er Byte Code erzeugt der mit der entsprechenden Android Version ausgeführt werden kann.

TL;DR

Mit icedtea 3.9 und Oracle JDK 8 ist es sicher zu bauen

Mit OpenJDK 11 geht es wenn die Build Tools gut konfiguriert sind

----------

## ChrisJumper

Vielen Dank für den Hinweis forrestfunk81,

das war mir bisher unbekannt. Was aber LineageOS betrifft, ich bin mir nicht sicher ob das "ordentlich konfiguriert ist". Immerhin hat das jemand so in die Dokumentation geschrieben. Ausprobiert habe ich es jetzt nicht, aber es schien mir logisch zu dem Zeitpunkt als ich mein erstes LOS Build einstellte.

Mag sein das die Fehlermeldungen noch andere Ursachen hatten und ich deswegen zufällig die Oracle Version ergriffen hatte (ich werde es bald mal ausprobieren mit der Icetea-Variante, besonders seit dem ich den Urheberrechtsstreit von Google und Oracle verfolgte!), aber ich bin mir nicht so sicher ob das die freiwilligen bei Lineageos auch so konfiguriert haben.

Im Grunde drückt der Schuh ja immer bei der Zeit und es scheint so als wird noch nicht mal eine ordentliches Howto erstellt. Die Kommunikation mit den Nutzern landet auf Reddit oder im IRC. Letztlich ist es das was die meisten bevorzugen die diese Software erstellen, das ist ein Problem auf seine Weise.

Doch wahrscheinlich trifft es die aktuelle Zielgruppe. Ein wenig so wie Gentoo, die halt auch Probleme haben werden jüngere Menschen zu finden die sich hier versammeln. Auf diese Weise so nah an dem Source Code zu sein ist abschreckend oder nicht hilfreich für Jünge, es bleibt wohl ein Spezialfall.

JoHo42

Ich weiß nicht wie viel Zeit du hast, aber lies dir auf jeden Fall bei Lineageos die Howtows zu GIT, Gerrit und Co durch. Dann liest du am besten Quer über Reddit und schaust bei Zeiten im IRC vorbei. Heise schrieb das LOS den Support für einige Smartphones einstellt, beziehungsweise nicht auf 15.1 anhebt. Open Source bekommt man aber nicht so schnell tot. Was aber nicht stimmt, denn sie verlangsamen schließen nur die Build-Produktion durch die Automatismen. Kernelemente wie Sicherheitspatches finden in Bestandteilen von Android weiterhin statt und die werden auch an die einzelnen unter-Distributionen weitergegeben.

Was ich noch nicht verstanden hab, ist in wie fern Quellcom zum Beispiel Treiber für die Geräte aktualisiert zur Verfügung stellt.  Das Git-Overlay für Images der Smartphone-Treiber (von TheMuppets), aktualisiert diese denke ich nicht. Was halt ein Problem darstellen kann. Vielleicht schreibe ich mal eine E-Mail an den Hersteller des Smartphones oder an Quellcom mit dieser Frage.

Wenn ich noch mal die Chance hätte würde ich wohl zu Google-Hardware greife, einfach weil ich nicht glaube das Hardware-Rootkit oder Trojaner eingesetzt wurden, aber Google selber sich um die Treiber viel besser kümmert als die Dritt Hersteller.

----------

## JoHo42

Hi Leute,

das compilen für mein device läuft jetzt schonmal.

Allerdings bricht der immer an einer Stelle ab und die Fehlermeldung auf dem Bildschirm sagen mir nix:

 *Quote:*   

> 
> 
> ninja: build stopped: subcommand failed.
> 
> 14:52:09 ninja failed with: exit status 1
> ...

 

Der bricht ab, wenn der den Kernel für mein Device versucht zu compilieren.

Gibt es in dem Lineage-source irgendwo eine Logdatei, damit ich bessere Informationen bekomme, warum der abbricht?

(Es könnte sein, das vielleicht noch ein Paket nicht installiert ist)

Nur zur Info: python2.7 muss eingestellt sein und das mit dem "export LC_ALL=C" muss auch eingestellt sein, sonst geht es nicht.

Gruß Jörg

----------

## ChrisJumper

Hi JoHo42,

Es könnte sein das ein Paket fehlt, aber dann würdest du auch eine Fehlermeldung bekommen das eine Bibliothek nicht gefunden wurde oder ein Program/Kommando.

Wegen dem Errorlog. Da bin ich mir nicht sicher, die komplette Ausgabe landet halt wie beim Kompilieren von Gentoo auch in der Shell/Terminal als Ausgabe. Du kannst das halt umleiten z.B. via 

```
$ brunch DEVICE > buildlog.txt
```

 und dann da nach schauen.

In der Regel musst du weiter oben schauen, nach der Fehlermeldung. Ist wie bei Gentoo. Setzt man halt LC_ALL nicht, bekommt man unter umständen diese Meldung:

 *Quote:*   

> [  1% 668/34315] Lex: aidl <= system/tools/aidl/aidl_language_l.ll
> 
> FAILED: /home/carmina/android/lineage/out/host/linux-x86/obj/STATIC_LIBRARIES/libaidl-common_intermediates/aidl_language_l.cpp 
> 
> /bin/bash -c "prebuilts/misc/linux-x86/flex/flex-2.5.39 -o/home/carmina/android/lineage/out/host/linux-x86/obj/STATIC_LIBRARIES/libaidl-common_
> ...

 

Da half dann auch nur eine Suchmaschine mit dem Ausdruck "lineageos _nl_intern_locale_data failed".

Bisher hab ich noch kein make clean gemacht, aber es ist wohl hilfreich, meisten hab ich einfach das out Folder gelöscht, aber ich glaube das ist eher unsauber.

Denke daran das immer wenn du das Terminal zu machst oder dich neu einloggst, musst du dieses ganze Build Environment von vorne erneut setzen. (source ~/.profile && cd ~/android/lineage && source build/envsetup.sh)

Wegen dem virtuellen python2.7 mach ich dann noch source venv/bin/activate. Dann setze ich export LC_ALL=C

Vor jedem Build (also brunch DEVICE) mache ich auch immer ein breakfast DEVICE.

CCACHE nutze ich aktuell nicht, weil der Build-Vorgang eigentlich sehr kurz ist, verglichen mit dem was man unter Gentoo sonst so kompiliert.

----------

## ChrisJumper

Hi JoHo42,

ich hoffe das hat gut geklappt mit deinem Android!

Wegen den aktuellen Sicherheitsupdates hier noch ein kleiner Hinweis, wie du zuerst heraus bekommst, unter welcher ID die Patches für das neue Security Update gehandelt werden. Dann wie du einen GIT-Brunch erstellst wenn du frühzeitig diese Patches ausprobieren willst und dann wieder zurück nimmst wenn sie gemerched wurden.

Du kannst natürlich auch so lange warten bis die Patches regulär gemerged wurden aber meistens dauert das immer 1 Woche. Wenn man dann schon selbst kompiliert kann man das auch gleich mit testen. Ist natürlich immer mit einem Risiko behaftet.

Mist jetzt hab ich wieder vergessen ein make clean zu probieren. Statt dessen hatte ich einen Fehler und hab android/lineageos/out komplett gelöscht.

1. Schritt: Schaue am Monatsbeginn bei review.lineageos.org vorbei. Unter dem Link zeigt er dir alle Ergebnisse zu Security Patch.

2. Wähle den Link "Bump Security Patch Level to 2019-01-05" oder "Bump Security String to 2019-01-05", als Beispiel. Achte auf deine Android Version (14.1 oder 15.1) in der Brunch Zeile. Schau auf jeden Fall auch im Review nach, ob das Patch-Set schon fertig ist.

An der Stelle wäre natürlich auch gut sich anzumelden und sich als Reviewer/Betatester zur Verfügung zu stellen.

3. Gehe in dein Lineage-Verzeichnis und mache es dir gemütlich und führe einen repo-sync durch.

4. Mache einen make clean (ich hab diesen Schritt wieder vergessen), hoffe er hießt so.

5. Erstelle einen eigenen Zweig. BSP git checkout -b security_patch_2019_01

6. repopick -t

(Hinter dem -t kommt der String der als ID hinter dem Topic steht im Review. Beispielsweise n-asb-2019-01 bei dem Review zum Pacht für 2019-01-05 (hier in der Ansicht zu 14.1).

7. Damit du später wieder zurück zum ursprünglichen Brunch kommst musst du ein git checkout master machen.

8. Mit git branch -d security_patch_2019_01 kannst du den Brunch dann wieder löschen. Zu dem Zeitpunk wurde der Patch wahrscheinlich schon migriert und du bekommst ihn über einen Repo Sync. Es empfiehlt sich das zu beobachten, auch wegen Bugs und noch mal neu zu bauen wenn die offizielle Version integriert wurde.

Ich ärgere mich gerade das meine Lineage-Version raus genommen wurde, freue mich aber das ich zumindest die Main-Updates für Android und Lineageos, inoffiziell noch erhalte.

Blöd ist es stellenweise natürlich trotzdem weil manche Änderungen weitere Anpassungen benötigen. So gibt es aber zumindest die Möglichkeit diese Vorzunehmen und den Code anzupassen. Wenn es Bugs gibt oder nicht Compiliert. Vielleicht noch etwas länger warten bis das Security-Branch Stable wird oder weitere Änderungen erfahren hat.

Edit: Punkt 8. brunch nach branch geändert. Danke firefly!Last edited by ChrisJumper on Fri Jan 11, 2019 10:46 pm; edited 1 time in total

----------

## firefly

@Chrisjumper: Kleine anmerkung. Es heist branch und nicht brunch, wir sind hier doch nicht bei einem Vormittagsbüfett  :Wink: 

----------

## ChrisJumper

Danke firefly! Bei anderen besonders Journalisten mache ich mich immer drüber lustig wenn die Worterkennung versagte... :)

Ich werde in Zukunft mehr darauf achten, vielen Dank. War gestern einfach zu spät/müde. Wollte es aber trotzdem noch schreiben, weil es dem ein oder anderen vielleicht ein wenig Arbeit abnimmt.

Edit: Ich wollte nur mitteilen das die Sicherheitspatches 2019-01-05 (repopick -t  n-asb-2019-01) sich jetzt auch bei mir (Lineage OS 14.1) ohne Fehler kompilieren lassen.

----------

## ChrisJumper

Seit Android 9 und Lineageos 16.x bringt der Tree eine eigene Java Version mit. die sollte man dann auch noch setzen wenn man in die Arbeitsumgebung wechselt.

```
$ JAVAC="prebuilts/jdk/jdk9/linux-x86/bin/javac"
```

Ob das für das JDK auch nötig ist, da bin ich mir nicht so sicher, aber ich mach es trotzdem auch, gab bisher noch keine Fehlermeldung:

```
$ JDK_HOME="~/android/lineage/prebuilts/jdk/jdk9/linux-x86/"
```

Noch was:

Wenn man den Security Patch noch vor dem Merge mit repopick baut, am besten mit:

```
$ repopick -b -t P_asb_2019-09
```

Weil es dann von alleine als neuer Zweig gesetzt wird und man kann sich den hick-hack mit git sparen.

----------

## ChrisJumper

 *firefly wrote:*   

> @Chrisjumper: Kleine anmerkung. Es heist branch und nicht brunch, wir sind hier doch nicht bei einem Vormittagsbüfett ;)

 

Ah, bei Git stimmt das natürlich.

Aber der Befehl mit dem man den Build Prozess bei Android und Lineageos startet nennt sich brunch. Zuvor muss man beim Frühstück das Model vorbereiten.

Aber aktuell bricht bei mir immer der Build Vorgang für Lineageos 17 ab und wirft kein fertigs Zip File mehr raus. Irgendwas mit Python.

Mal schauen wie lange ich das noch mache, steige bald auf ein Librem5 um, da lassen sich Android-Apps mit Ambox virtuell nutzen. Vielleicht probiere ich aber auch mal Project Android aus.

Edit: Problem gelöst: Man muss nur Python anders verlinken  damit es in der Sandbox geht..

Zum Beispiel:

```
ln -s /usr/bin/python3.8 ~/bin/python3

ln -s python3 ~/bin/python
```

----------

