Introduction

Alors depuis qu'on me demande j'ai décidé de consacrer un petit morceau de wiki pour la compilation d'un kernel pour Android. Ce wiki n'est pas là pour expliquer comment on compile un noyau de manière générale, loin de là, si vous n'avez jamais compilé un noyau de votre vie, je pense que vous aurez du mal, mais il faut bien un début à tout dans la vie. Si vous n'êtes pas familier avec la compilation en général, ou avec la compilation du noyau en général sur un système GNU/Linux de base, si vous ne savez pas ce qu'est la compilation ou un noyau ou un kernel, je vous recommande chaudement de vous entrainer avant, ou ce tuto n'est pas fait pour vous.

Prérequis

Pour compiler il va te falloir un environnement de travail propre. Il faut un système d'exploitation 32 bits, qui tourne sur un kernel linux, je pense que le plus générique possible fera l'affaire, un i386 sera bien donc j'ai choisis pour se faire : Debian lenny 32 bits i386 installer sur un kvm (kernel virtual machine) Gentoo 64 bits pure (sans une octet 32).

Une fois la machine installer, réelle ou virtuelle, cela n'as pas d'importance, la connexion avec Android n'est pas forcément faites avec cette machines ni même la construction de rom en ce qui me concerne. J'ai dédié une machine virtuelle à la compilation d'Android. Il faut matériellement parlant 1.5 de ram sur cette machine virtuelle, mais je pense que 2Go ne seront pas de trop, cela ne sert que pour la compilation du full android, à noter que pour compiler uniquement le kernel je ne met que 380 de ram.

Modification des sources.list pour avoir les binaires proprios :

# vim /etc/apt/sources.list
deb http://ftp2.fr.debian.org/debian/ lenny main contrib non-free
deb-src http://ftp2.fr.debian.org/debian/ lenny main contrib non-free

deb http://security.debian.org/ lenny/updates main contrib non-free
deb-src http://security.debian.org/ lenny/updates main contrib non-free

deb http://volatile.debian.org/debian-volatile lenny/volatile main contrib non-free
deb-src http://volatile.debian.org/debian-volatile lenny/volatile main contrib non-free

Mise à jour de la liste des paquets et upgrade s'il y a besoin :

# aptitude update && aptitude safe-upgrade

Installation des dépendances :

# aptitude install git-core gnupg sun-java5-jdk flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential zip curl libncurses5-dev zlib1g-dev libreadline5 libreadline5-dev readline-common

Pour finir d'installer les dépendances il faut compiler python 2.4 depuis les sources, car il faut le support readline d'actif :

# wget "http://www.python.org/ftp/python/2.4.6/Python-2.4.6.tar.bz2"
# tar xvjf Python-2.4.6.tar.bz2 && cd Python-2.4.6/
# ./configure --disable-ipv6 --with-readline && make && make install
Si on téléchargeait les sources ?

Premièrement nous allons créer un environnement de travail agréable, avec tout ce qu'il faut, un bon shell etc.. Personnellement j'utilise zsh, je donnerais donc la configuration du shell que j'utilise un ~/.zshrc.

# mkdir -p /root/Build/bin/ /root/Build/luoAndroid
# export PATH="$PATH:/root/Build/bin"
# cd ~/Build && wget "http://android.git.kernel.org/repo" -O bin/repo

ou
# curl http://android.git.kernel.org/repo >~/Build/bin/repo

On continue.
# chmod a+x ~/Build/bin/repo
# cd ~/Build/luoAndroid/
# repo init -u git://android.git.us.kernel.org/platform/manifest.git -b cupcake{BR}
# vim .repo/manifest.xml

Remplacer la 4ème ligne par celle là :
fetch="git://android.git.us.kernel.org/"

(je choisis .us, car j'ai rencontré des soucis en laissant par défaut parfois.) Ps: le mail valide n'est pas nécessaire.

Vous venez d'initialiez le repo git Android pour télécharger les sources, maintenant je vais vous montrer comment choisir un kernel dans le lot :) avant de télécharger tant qu'à faire.

On prend un éditeur de texte favoris, pour moi ce sera vim :

# cd /root/Build/luoAndroid && vim .repo/local_manifest.xml

Si vous voulez le kernel 2.6.27 par exemple vous copiez ça dedans :

<?xml version="1.0" encoding="UTF-8"?>
<manifest>
 <project path="kernel" name="kernel/msm" revision="refs/heads/android-msm-2.6.27"/>
</manifest>

Vous sauvegardez, vous quittez.

Si vous voulez le kernel 2.6.29 par exemple vous copiez ça dedans :

<?xml version="1.0" encoding="UTF-8"?>
<manifest>
 <project path="kernel" name="kernel/msm" revision="refs/heads/android-msm-2.6.29"/>
</manifest>

Vous sauvegardez, vous quittez.

Téléchargement des sources :

# cd /root/Build/luoAndroid && repo sync
Passons aux choses sérieuses

Une fois le téléchargement des sources, on a finit tout le blabla du début on va pouvoir faire le plus important, la configuration :

# cd /root/Build/luoAndroid/kernel/
# export PATH="$PATH:/root/Build/bin:/root/Build/luoAndroid/prebuilt/linux-x86/toolchain/arm-eabi-4.3.1/bin"
# export ARCH=arm
# export SUBARCH=arm
# export CROSS_COMPILE=arm-eabi-

Ceci est un export d'environnement, c'est temporaire, dès que vous sortez du shell, les exports sont effacés, je vous recommande pour cela de mettre les export directement dans le fichier ~/.zshrc si vous utilisez zsh ou dans ~/.bashrc. (Je mettrais mon .zshrc en exemple à la fin)

On continue :

SI VOUS NE FAITES PAS ÇA CE N'EST PAS LA PEINE DE CONTINUER

# make msm_defconfig 
(ce script permet d'écrire un fichier de pré configuration valide pour Android)
Configurer le noyau :

soit :
# vim .config

soit :
# make menuconfig

Je n'explique absolument rien à la configuration (pour le moment), celle de départ est valide, si vous ne savez pas ce que vous faites ne touchez à rien et compiler comme ça. Vous pouvez par exemple rechercher CRAMFS pour rajouter le support, rajouter le support de netfilter aussi. Et bien entendu enlever plein de truc inutile qui font gagner en consommation de ressource.

# make
# make INSTALL_MOD_PATH=modules modules_install
# cp arch/arm/boot/zImage /root/my_first_kernel

(Cette image lié à un ramdisk est boot.img biensur)

Compiler le module wifi lier au noyau wlan.ko :

noyau 2.6.27 :

# cd /root/Build/luoAndroid/system/wlan/ti/sta_dk_4_0_4_32/
# make KERNEL_DIR=/root/Build/luoAndroid/kernel

Vous verrez une fois finis le chemin pour récupérer le wlan.ko.

noyau 2.6.29 :

# cd /root/Build/luoAndroid/
# repo download platform/system/wlan/ti 10344/1
# cd system/wlan/ti/sta_dk_4_0_4_32/
# make KERNEL_DIR=/root/Build/luoAndroid/kernel

Vous verrez une fois finis le chemin pour récupérer le wlan.ko.

A noter que chaque version de kernel est lié à un module wlan.ko, donc à chaque recompilation de kernel, pensez à recompiler un wlan.ko histoire d'être sur de ne pas avoir d'ennuie wifi.

Conclusion

C'est une approche assez basique de la compilation du noyau sur Android, j'espère que cela vous sera utile. C'est loin d'être exhaustif et destiné à des personnes ayant un certain niveau de connaissance dans le domaine. N'hésitez pas à le corriger, à le remplir, me poser des questions, me demander des informations complémentaires, ou me dire sur quel point je n'aurais pas été clair. Ne venez pas me demander de vous expliquez de A à Z une compilation du kernel, je n'aurais pas le temps. Merci de votre compréhension.

Je vous laisse en exemple un fichier ~/.zsrhrc à placer dans les racines utilisateurs avec un shell zsh par défaut biensur !

~/.zshrc

android/compile_ton_kernel_pour_android.txt · Last modified: 2010/01/12 13:29 (external edit)