miércoles, 23 de junio de 2010

Cómo COMPILAR el KERNEL de LINUX para el EMULADOR de ANDROID (versión ECLAIR)

DESCARGAR EL CÓDIGO FUENTE DEL KERNEL

Lo primero descargamos las fuentes del kernel desde http://android.git.kernel.org

En esa url aparecen kernels para otras plataformas también. Elegimos descargar kernel/common project de esa página.

$git clone git://android.git.kernel.org/kernel/common

Comprobamos qué rama (branch) hemos descargado:
$git branch
Muestra * android-2.6.27, la cual no es la que estamos buscando:

Para listar todas las ramas remotas disponibles:
$git branch -r
origin/HEAD -> origin/android-2.6.27
origin/android-2.6.25
origin/android-2.6.27
origin/android-2.6.29
origin/android-2.6.32
origin/android-goldfish-2.6.27
origin/android-goldfish-2.6.29


¿Qué significa goldfish? (según la lista de correo android-kernel)
Goldfish es la rama hackeada del kernel que da soporte al emulador de android basado en qemu, así que es la que necesitamos.

Descargar la versión del kernel GOLDFISH
$git checkout --track -b android-goldfish-2.6.29 origin/android-goldfish-2.6.29
$git branch
android-2.6.27
* android-goldfish-2.6.29



EJECUTANDO EL EMULADOR

Este enlace cuenta cómo descargar el emulador de android, y cómo ejecutarlo.
Compilar Android en Debian Sid

Averiguar la versión del kernel que se está ejecutando en el emulador
$adb shell
#cat /proc/version
Linux version 2.6.29-00261-g0097074 (digit@digit.mtv.corp.google.com) (gcc version 4.4.0 (GCC) ) #14 Tue Feb 2 15:49:02 PST 2010



OBTENER LA CONFIGURACIÓN DEL KERNEL

Vamos a obtener el fichero de configuración del kernel .config del emulador que se está ejecutando.

$cd common # entramos en el directorio con las fuentes del kernel.
$adb pull /proc/config.gz . # obtenemos el fichero .config comprimido del emulador.

$gunzip config.gz # lo descomprimimos.
$cp config .config # lo renombramos a .config

Ahora podemos editar el fichero .config según nuestras necesidades.


COMPILANDO EL KERNEL

La variable de entorno CROSS_COMPILE almacena el path donde están situadas las herramientas(toolchain) necesarias para croscompilar para la arquitectura arm. Podemos usar el croscompilador que viene con el código fuente de android.

$ARCH=arm CROSS_COMPILE=/path/to/mydroid/prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin/arm-eabi- make

Ejecutamos make para compilar el kernel.

Las últimas líneas mostrarán:
Kernel: arch/arm/boot/Image is ready
Kernel: arch/arm/boot/zImage is ready


Entonces, hemos obtenido los binarios del kernel: Image y zImage.


EJECUTAR EL EMULADOR UTILIZANDO LA IMAGEN DEL KERNEL QUE ACABAMOS DE COMPILAR

Necesitamos la opción -kernel:
$emulator -kernel /path/to/common/arch/arm/boot/zImage -show-kernel -verbose

Podemos comprobar la versión del kernel:
$adb shell
# cat /proc/version
Linux version 2.6.29-00262-gb0d93fb (user@myPC) (gcc version 4.4.0 (GCC) ) #1 Sun May 2 14:27:31 CEST 2010


Cuando no se especifica la opción kernel, suele utilizar el kernel que viene precompilado:
$emulator -show-kernel -verbose
emulator: argv[01] = "-kernel"
emulator: argv[02] = "/path/to/mydroid/prebuilt/android-arm/kernel/kernel-qemu"



ACTIVAR EL SOPORTE PARA LA CARGA DINÁMICA DE MÓDULOS EN EL KERNEL

El soporte para cargar módulos está deshabilitado por defecto en el kernel de android, debemos habilitarlo si queremos cargar módulos en el kernel.

editamos el fichero .config y seleccionamos:
CONFIG_MODULES=y

$ ARCH=arm CROSS_COMPILE=/path/to/mydroid/prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin/arm-eabi- make

Nos preguntará sobre varias opciones más al ejecutar make. Respondemos "yes" para las opciones relacionadas con los módulos del kernel.

Despues de compilar observamos que aparecen algunos módulos.

MODPOST 6 modules
CC      drivers/video/fb_sys_fops.mod.o
LD [M]  drivers/video/fb_sys_fops.ko
CC      drivers/video/syscopyarea.mod.o
LD [M]  drivers/video/syscopyarea.ko
CC      drivers/video/sysfillrect.mod.o
LD [M]  drivers/video/sysfillrect.ko
CC      drivers/video/sysimgblt.mod.o
LD [M]  drivers/video/sysimgblt.ko
CC      drivers/video/vfb.mod.o
LD [M]  drivers/video/vfb.ko


Podemos subir los módulos al emulador e instalarlos:
$adb push drivers/video/fb_sys_fops.ko /data
$adb shell
#insmod /data/fb_sys_fops.ko


PUEDE QUE TAMBIÉN LE INTERESE

Compilar Android en Debian Sid


REFERENCIA

http://www.cianer.com/androidg1/28-building-android-kernel-images

TRADUCIDO DE

http://linuxclues.blogspot.com/2010/05/build-compile-linux-kernel-android.html

2 comentarios:

  1. Un millón de Gracias .....
    Gracias a este tuto por fin he conseguido compilar mi primer kernel android (que arranca en el emulador).

    Un saludo

    ResponderEliminar