[HOW-TO]Nexus 4 Kernel kompilieren

  • 39 Antworten
  • Letztes Antwortdatum
D

Daniboy3000

Fortgeschrittenes Mitglied
15
Da es im Forum schon eine Anleitung gibt, um CyanogenMod zu kompillieren,
füge ich noch eine Anleitung für den Kernel (Stock/AOSP) hinzu.

Als Grundlage hab ich diese beiden Anleitungen auf XDA benutzt:

[HOWTO] Building from sources [Kernel only for now] - xda-developers
[HOWTO] build nexus 4 kernel - xda-developers

Ich übernehme keine Verantwortung für entstandene Schäden an elektronischen Geräten, usw... ;)

Voraussetzungen:
- Linux (ich verwende Ubuntu 12.04 LTS)
- Linux/Terminalkenntnisse
- ungelockter Bootloader
- Internet :D

Vorarbeiten:
Als erstes muss man sich eine Build-Umgebung einrichten. Dazu guckt man
am besten hier nach:
Initializing a Build Environment | Android Open Source

Sobald die steht sollte man, wenn es noch nicht vorhanden ist, git installieren.
Git lädt man hier herunter: Downloads - git-core - Git - the stupid content tracker - Google Project Hosting
Dann entpackt man das Archiv, im Terminal wechselt man in das entpackte Verzeichnis und kompiliert Git:
Code:
tar -xvf git-1.8.0.tar.gz
cd git-1.8.0
./configure
 make
 sudo make install

Source:
Nun braucht man die Kernel-Sourcen, dafür erstellt man ein neues Verzeichnis, z.B: Android/Kernel und wechselt dort hinein:
Code:
mkdir -p ~/Android/Kernel #Verzeichnis kann beliebig gewählt werden
cd ~/Android/Kernel
git clone https://android.googlesource.com/kernel/msm

Dies sind allerdings noch nicht die richtigen Sourcen, denn man muss erst eine bestimmte Version herunterladen. Diese findet man bei Stockkerneln auf dem Nexus 4 in der Kernelversion unter Einstellungen, aktuell ist diese g7ce11cd (Danke an Xerolux).
Code:
cd msm
git checkout 7ce11cd #g7ce11cd scheint bei mir nicht zu funktionieren!

Toolchain:
Wenn nun sämtliche Sourcen zu guter Letzt heruntergeladen wurden, benötigt man noch eine Toolchain, die den richtigen Compiler enthält. In meinem Fall habe ich die Google Toolchain benutzt. Dazu erstellt man wieder ein neues Verzeichnis und wechselt in dieses:
Code:
mkdir -p ~/Android/Toolchain #Verzeichnis kann ebenfalls beliebig gewählt werden
cd ~/Android/Toolchain
git clone https://android.googlesource.com/platform/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.6

Kompilieren:
Nun kommen wir zum eigentlichen kompilieren, als erstes müssen noch einige Umgebungsvariablen erstellt werden:
Code:
export PATH=$PATH:~/Android/Toolchain/arm-linux-androideabi-4.6/bin
export ARCH=arm
export SUBARCH=arm
export CROSS_COMPILE=arm-linux-androideabi-
Dann kann endlich der Kernel kompiliert werden, hierzu wechselt man in den Ordner mit den Kernelsource (Beispielsweise: Android/Kernel/msm)
Code:
cd ~/Android/Kernel/msm
make mako_defconfig
make -jN
Das N muss man durch die Anzahl seiner Prozessorkerne * 2 ersetzten, also für eine Dual-Core "-j4".

Boot.img erstellen:
Wenn nun keine Fehler aufgetreten sind, sollte der Kernel in arch/arm/boot/ liegen, als Datei mit Namen zImage. In dieser Form kann man den Kernel allerdings nicht flashen. Man benötigt ein boot.img. Dieses kann man zum Beispiel aus einem Factoryimage extrahieren oder ich habe hier die aktuelle (4.2.2/7ce11cd) hochgeladen: https://www.dropbox.com/s/do0fktpugqnp1mg/boot.img . Dann lädt man sich folgen des Script herunter und entpackt es in den selben Ordner, wo das boot.img liegt.
Code:
./zhack -x boot.img
Dann ersetzt man zImage mit dem eigenen Kernelimage(arch/arm/boot)
Code:
./zhack -z boot.img -f bootimg.cfg -k zImage -r initrd.img

Flashen:
Nun hat man eine boot.img Datei die man via:
Code:
fastboot boot boot.img #testen
fastboot flash boot boot.img #flashen kann

So ich hoffe das war einigermaßen verständlich,
viele Grüße Daniboy3000
 
Zuletzt bearbeitet:
  • Danke
Reaktionen: rudl1220 und vetzki
Super Anleitung. Danke

Gesendet von meinem Nexus 4 mit der Android-Hilfe.de App
 
Ha! Ich habe mich seit gestern damit rumgeschlagen. Habe auch die von dir verlinkten TUTs genutzt, doch irgendwas muss ich dort vergessen haben... Nun compilierts. Danke! :)

edit:

Bezieht sich "e039dcb" auf 4.2.2?

hells
 
Zuletzt bearbeitet von einem Moderator:
Ich glaub das ist noch 4.2.1 aber ich hab noch keine neuere gefunden, ist aber schön das es funktioniert, ich hatte am Anfang auch ziemliche Probleme :D
 
Mh... Die meisten Custom Kernel wurden aber auf 4.2.2 aktualisiert, darum die Frage.

btw. Wenn ich nen AOSP Kernel will, brauch ich da andere Sourcen?

hells
 
hellsgod schrieb:
Mh... Die meisten Custom Kernel wurden aber auf 4.2.2 aktualisiert, darum die Frage.

btw. Wenn ich nen AOSP Kernel will, brauch ich da andere Sourcen?

hells

Das ist AOSP,

ich hab noch nicht 4.2.2 deshalb kann ich dazu noch nichts sagen.

Statt e039dcb müsste man irgendwas anderes verwenden, hast du Stockrom/Kernel, wenn ja dann poste doch mal was unter Kernelversion in den Einstellungen steht.
 
Ich bin eben nicht auf Stock, sonst hätte ich nachgeschaut.

hells

Mit einem paranoiden Nexus 4 gesendet
 
Zuletzt bearbeitet:
  • Danke
Reaktionen: Daniboy3000
ok danke

Gesendet von meinem Nexus 4 mit der Android-Hilfe.de App
 
Dann kann endlich der Kernel kompiliert werden, hierzu wechselt man in den Ordner mit den Kernelsource (Android/Kernel/msm)
Code:
cd ~/Android/Kernel/msm make mako_defconfig make -jN
Das N muss man durch die Anzahl seiner Prozessorkerne * 2 ersetzten, also für eine Dual-Core "-j4".


Code:
rudl1220@rudl1220-desktop ~/Android/Kernel/msm $ cd ~/Android/Kernel/msm
rudl1220@rudl1220-desktop ~/Android/Kernel/msm $ make mako_defconfig
make: *** No rule to make target `mako_defconfig'.  Stop.
rudl1220@rudl1220-desktop ~/Android/Kernel/msm $ make -j8
make: *** No targets specified and no makefile found.  Stop.
rudl1220@rudl1220-desktop ~/Android/Kernel/msm $ cd ~/Android/Kernel/msm
rudl1220@rudl1220-desktop ~/Android/Kernel/msm $ make mako_defconfig
make: *** No rule to make target `mako_defconfig'.  Stop.
rudl1220@rudl1220-desktop ~/Android/Kernel/msm $ make -j8
make: *** No targets specified and no makefile found.  Stop.
rudl1220@rudl1220-desktop ~/Android/Kernel/msm $
Bis da hin bin ich gekommen^

Was mach ich falsch ?

ist der befehl richtig so ?

cd ~/Android/Kernel/msm make mako_defconfig make -j8
 
Du musst das in dem Verzeichnis ausführen, in dem die Kernelsourcen liegen.
Mit cd wechselst man in das Verzeichnis wo diese liegen, in der Anleitung war ~/Android/Kernel/ ein Beispiel. Wo hast du denn deine Sourcen?
 
Habe wie in der Anleitung Android/Kernel als Verzeichnis gewählt.

Wenn ich mit mit dem Explorer manuell ins Verzeichnis navigiere ist der Ordner aber leer!
Denke irgendwo vorher muss mir ein Fehler passiert sein.
Obwohl ich eigentlich keine Fehlermeldung bis zu diesen Punkt bekam!
 
Dann hast du wahrscheinlich den checkout befehl vergessen , führe den Befehl in dem Verzeichnis aus wo die Kernelsourcen liegen sollen.

Gesendet von meinem Nexus 4 mit der Android-Hilfe.de App
 
Hey zusammen, folgendes:

In den letzten zwei Tagen ist es mir genau zwei mal gelungen das compilieren zum starten zu bringen. Doch mein PC hat irgendeinen Defekt, sodass er immer mal wieder Neustartet. Also hab ich gestern noch mein Laptop frisch eingerichtet, doch auch hier passiert folgendes:

Code:
hellsgod-HP-ProBook-4510s msm # export PATH=$PATH:~/toolchain/arm-linux-androideabi-4.6/bin
hellsgod-HP-ProBook-4510s msm # export ARCH=arm
hellsgod-HP-ProBook-4510s msm # export SUBARCH=arm
hellsgod-HP-ProBook-4510s msm # export CROSS_COMPILE=arm-linux-androideabi-
hellsgod-HP-ProBook-4510s msm # make mako_defconfig
 HOSTCC  scripts/basic/fixdep
  HOSTCC  scripts/kconfig/conf.o
  SHIPPED scripts/kconfig/zconf.tab.c
  SHIPPED scripts/kconfig/zconf.lex.c
  SHIPPED scripts/kconfig/zconf.hash.c
  HOSTCC  scripts/kconfig/zconf.tab.o
  HOSTLD  scripts/kconfig/conf
warning: (ARCH_MSM_KRAITMP && ARCH_MSM_CORTEX_A5) selects HAVE_HW_BRKPT_RESERVED_RW_ACCESS which has unmet direct dependencies (HAVE_HW_BREAKPOINT)
warning: (ARCH_MSM_KRAITMP && ARCH_MSM_CORTEX_A5) selects HAVE_HW_BRKPT_RESERVED_RW_ACCESS which has unmet direct dependencies (HAVE_HW_BREAKPOINT)
#
# configuration written to .config
#
hellsgod-HP-ProBook-4510s msm # make
scripts/kconfig/conf --silentoldconfig Kconfig
warning: (ARCH_MSM_KRAITMP && ARCH_MSM_CORTEX_A5) selects HAVE_HW_BRKPT_RESERVED_RW_ACCESS which has unmet direct dependencies (HAVE_HW_BREAKPOINT)
warning: (ARCH_MSM_KRAITMP && ARCH_MSM_CORTEX_A5) selects HAVE_HW_BRKPT_RESERVED_RW_ACCESS which has unmet direct dependencies (HAVE_HW_BREAKPOINT)
  WRAP    arch/arm/include/generated/asm/auxvec.h
  WRAP    arch/arm/include/generated/asm/bitsperlong.h
  WRAP    arch/arm/include/generated/asm/cputime.h
  WRAP    arch/arm/include/generated/asm/emergency-restart.h
  WRAP    arch/arm/include/generated/asm/errno.h
  WRAP    arch/arm/include/generated/asm/ioctl.h
  WRAP    arch/arm/include/generated/asm/irq_regs.h
  WRAP    arch/arm/include/generated/asm/kdebug.h
  WRAP    arch/arm/include/generated/asm/local.h
  WRAP    arch/arm/include/generated/asm/local64.h
  WRAP    arch/arm/include/generated/asm/percpu.h
  WRAP    arch/arm/include/generated/asm/poll.h
  WRAP    arch/arm/include/generated/asm/resource.h
  WRAP    arch/arm/include/generated/asm/sections.h
  WRAP    arch/arm/include/generated/asm/siginfo.h
  WRAP    arch/arm/include/generated/asm/sizes.h
  CHK     include/linux/version.h
  UPD     include/linux/version.h
  CHK     include/generated/utsrelease.h
  UPD     include/generated/utsrelease.h
  Generating include/generated/mach-types.h
  CC      kernel/bounds.s
arm-linux-androideabi-gcc: No such file or directory
Is your PATH set correctly?
make[1]: *** [kernel/bounds.s] Error 2
make: *** [prepare0] Error 2

export PATH=$PATH:~/toolchain/arm-linux-androideabi-4.6/bin habe ich schon auf alle möglichen Arten probiert, sprich: /home/hellsgod/toolchain/arm-linux-androideabi-4.6/bin

Zwei mal hat es am PC funktioniert, doch am Laptop hab ichs noch nicht zum laufen gekriegt. Kann mir da Jemand auf die Sprünge helfen, was mache ich genau falsch?

Danke.

hells
 
Kannst "arm-linux-anrdoideabi-gcc" manuell im Terminal aufrufen, wenn nichts stimmt irgendwas mit deiner PATH-Variable nicht...
 
Wie meinst du "arm-linux-anrdoideabi-gcc" manuell aufrufen?

Und wie kann ich das mit den PATH Variablen überprüfen, worauf muss ich genau schauen?

hells
 
Gib einfach irgendwo im Terminal arm-linux-androideabi-gcc (ich hab mich vertippt bei arm-linux-anrdoideabi-gcc!!!) ein, wenn dann folgendes steht, ist mit deiner PATH-Variablen alles in Ordnung:
Code:
arm-linux-androideabi-gcc
arm-linux-androideabi-gcc: fatal error: no input files
compilation terminated.

Um die PATH-Variable zu überprüfen gibs ebenfalls im Terminal:
Code:
echo $PATH
 
Dann kommt folgendes, ich habe Testweise deine Ordnerstruktur für die Toolchain übernommen:

Code:
hellsgod-HP-ProBook-4510s msm # arm-linux-androideabi-gcc
arm-linux-androideabi-gcc: command not found
hellsgod-HP-ProBook-4510s msm # echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/root/Android/Toolchain/arm-linux-androideabi-4.6/bin

hells
 
hellsgod schrieb:
Dann kommt folgendes, ich habe Testweise deine Ordnerstruktur für die Toolchain übernommen:

Code:
hellsgod-HP-ProBook-4510s msm # arm-linux-androideabi-gcc
arm-linux-androideabi-gcc: command not found
hellsgod-HP-ProBook-4510s msm # echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/root/Android/Toolchain/arm-linux-androideabi-4.6/bin

hells

Zwischen /root und /Android/Tolchain/blabla fehlt glaub ich ein Doppelpunkt und ein Tilde, probier mal:
Code:
export $PATH:~/Android/Toolchain/arm-linux/androideabi-4.6/bin

Ich gehe davon aus, dass die Toolchain in deinem Home-Verzeichnis ist.

Der ursprüngliche Beitrag von 15:57 Uhr wurde um 16:20 Uhr ergänzt:

Ich kämpfe jetzt gerade mit der neuen Version, scheinbar ist dies nicht g7ce11cd, das findet git bei mir nicht. Sondern 7ce11cdd. Allerdings klappt das kompilieren jetzt nicht mehr, ist bricht mit einer Warnug ab:
In der Datei drivers/gpu/msm/adreno.c:433 würde das frame size mit 1023 größer sein als 1024 bytes und dann mit forbidden warnung !?
 
Wenn ich das so eingebe, kommt folgendes:

Code:
export $PATH:~/Android/Toolchain/arm-linux/androideabi-4.6/bin
bash: export: `/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:~/Android/Toolchain/arm-linux/androideabi-4.6/bin': not a valid identifier
hells

edit: Diesen Fehler bei der GPU hatte ich auch beim durchcompilieren als es mal geklappt hatte...
 
Zurück
Oben Unten