Pregunta

¿Alguien ha compilado con éxito el kernel de Android y lo ha probado en el emulador de Android? De ser así, ¿hay algo especial que deba hacerse?

La documentación para el SDK es excelente, sin embargo, me ha resultado difícil encontrar documentación para compilar el kernel y configurar una máquina personalizada en el emulador.

¿Fue útil?

Solución

Desde agosto de 2009, el kernel ya no forma parte del manifiesto de repositorio estándar que se obtiene cuando se siguen las instrucciones para descargar el código fuente del proyecto de código abierto de Android.Los pasos necesarios para descargar, compilar y ejecutar con éxito un kernel específico en el emulador son los siguientes:

  • Obtenga el kernel de Android agregándolo al manifiesto de su repositorio o manualmente ejecutando:
    git clone https://android.googlesource.com/kernel/goldfish.git
  • Consulte la rama correcta para trabajar con el emulador, es decir.pez de colores:
    git checkout -t origin/android-goldfish-2.6.29 -b goldfish
  • Genere la configuración del emulador (el emulador qemu ejecuta el código arm, es deciruna configuración de brazo):
    make ARCH=arm goldfish_defconfig
    • si eso no funciona, intenta make ARCH=arm goldfish_armv7_defconfig
  • Ahora construya el kernel usando las herramientas de compilación cruzada distribuidas con el proyecto de código abierto:
    make ARCH=arm CROSS_COMPILE=mydroid/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi-
  • El kernel construido de esta manera debería terminar en la carpeta arch/arm/boot de su árbol de kernel (donde coloca el código de git clone)
  • Para ejecutar el emulador con su kernel, existen dos alternativas: cópielo en la carpeta del kernel precompilado del proyecto de código abierto para reemplazar el kernel estándar.La otra opción es iniciar el emulador con las opciones del kernel configuradas:
    emulator -kernel mydroid/kernel/common/arch/arm/boot/zImage

Tenga en cuenta que he utilizado las rutas predeterminadas en la descripción anterior; debe cambiarlas según lo que se aplique a su configuración.Ha pasado algún tiempo desde la última vez que probé esto, pero creo que debería funcionar.

Alguna información adicional:En la distribución estándar de código abierto de Android, el kernel se distribuye como un binario prediseñado en el mydroid/prebuilt/android-arm/kernel carpeta y el código fuente no está incluido.La fuente del kernel se eliminó del manifiesto predeterminado por dos razones, según tengo entendido.Una es que se necesita mucho ancho de banda y espacio en disco para un componente de plataforma con el que la mayoría de la gente no trabajará mucho.La otra razón es que dado que el kernel se construye con el sistema de compilación del kernel y no como parte del sistema de compilación aosp, tiene sentido mantenerlo separado.La rama común del kernel es la que utiliza el emulador.También hay ramas para experimental, msm (plataformas Qualcomm) y Omap (plataforma TI) y tal vez algunas más.Si desea utilizar el kernel de Android con hardware, estos pueden resultarle más interesantes.

Otros consejos

Solo para corregir algunas cosas de la publicación de BMB (que fue muy útil para mí, salvó mi proyecto):

  • git clone git: //android.git.kernel.org/kernel/common.git (el kernel perdido);
  • git checkout -t origin / android-goldfish-2.6.29 -b goldfish (lo mismo);
  • make ARCH = arm goldfish_defconfig (idem);
  • make ARCH = arm CROSS_COMPILE = mydroid / prebuilt / linux-x86 / toolchain / arm-eabi-4.2.1 / bin / arm-eabi- (idem)
  • emulador -avd my_avd -kernel mydroid / kernel / common / arch / arm / boot / zImage (aquí agregué un avd en el comando, no funcionó sin mí).

Esta es una actualización para las respuestas de BMB y Arnaud LM.
Parece que los nombres de las ramas de peces de colores se cambiaron a partir del 03/03/2011. Cuando revise la rama de peces de colores, use esto:

git checkout -t origin/archive/android-gldfish-2.6.29 -b goldfish 

¡Tenga en cuenta la 'o' que falta en android-gldfish-2.6.29!

Espero que esto ahorre tiempo para alguien.

A partir de 2012, la descarga del kernel está bien documentada en source.google.com, sin embargo, descubrí que la compilación tardó algunos intentos. Estos son los comandos que utilicé para construir un núcleo para el emulador ARM:

cd /kernel/source/root
make mrproper
adb pull /proc/config.gz # from the emulator
gunzip config
mv config .config  # now you have a (perhaps slightly outdated kernel .config)
make ARCH=arm silentoldconfig # update the .config - take the defaults if prompted
make ARCH=arm menuconfig # make any further changes
time make -j4 ARCH=arm CROSS_COMPILE=/path/to/android/source/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin/arm-eabi- 2>&1 | tee ../../logs/$(date +%Y%m%d-%H%M)-make-kernel.log
emulator -kernel /kernel/source/root/kernel/goldfish/arch/arm/boot/zImage -avd myAVD &

Gracias a todos los que respondieron a esta, pude hacerlo con partes de esta respuesta. "Necesitas el AVD" de Amaund fue la última pieza que me causó problemas.

Invitado Android 8.1 totalmente automatizado en el host Ubuntu 17.10

# Download the source. Takes several minutes.
curl https://storage.googleapis.com/git-repo-downloads/repo >repo
chmod a+x repo
./repo init -b android-8.1.0_r1 --depth 1 -u https://android.googlesource.com/platform/manifest
./repo sync -c  -j $(($(nproc) - 2)) --no-tags --no-clone-bundle

# Do the actual build. Takes minutes / hours.
. build/envsetup.sh
lunch aosp_x86_64-eng
USE_CCACHE=1 CCACHE_DIR=ccache make -j $(($(nproc) - 2))

# Run the emulator.
emulator -show-kernel

El out/ El directorio de compilación ocupa aproximadamente 90 Gb y el resto del árbol aproximadamente 40 Gb, excluyendo CCACHE.

Aproximadamente 1 o 2 minutos después de iniciar el emulador, la pantalla de inicio muestra:

y si presiona Enter en el terminal host desde el que se inició Android, obtendrá un shell en el sistema Android en su terminal host:

enter image description here

Notas:

  • ./repo init -b DEBE apuntar a una etiqueta. master La rama siempre está rota, y también lo estaban. -release sucursales.

    La lista de etiquetas se puede encontrar en: https://android.googlesource.com/platform/manifest o clonando ese repositorio.

    Probablemente hay dos razones por las que las ramas siempre están rotas:

    • Android se desarrolla a puerta cerrada y se elimina el código.Por lo tanto, los desarrolladores de Google y OEM ya tienen un montón de parches además del "maestro" público y ya han solucionado el problema.

      Por la misma razón, probablemente sea inútil intentar informar cualquier error de compilación en el maestro:ya han sido reportados y arreglados.También te reto a que encuentres el lugar oficial adecuado para informar fallas de compilación.

    • repo sync en una rama simplemente extrae la última versión de los 650 repositorios de git que componen AOSP para la rama dada, sin sincronizarlos como submódulos.Por tanto nada garantiza que sean compatibles.Sin embargo, las etiquetas obtienen una etiqueta específica de todos los repositorios.

  • --depth 1 y sync -c --no-tags --no-clone-bundle Fueron un intento de hacer que el clon dolorosamente lento fuera más rápido.No estoy seguro del éxito que tuvo.Ver también: La sincronización del repositorio de AOSP tarda demasiado

  • Usamos lunch aosp_x86_64-eng en lugar de ARM porque se ejecuta mucho más rápido debido a las extensiones de virtualización del host x86.

    Para crear una versión ARM, simplemente use lunch aosp_arm-eng en cambio.

    Además, la imagen ARM tiene errores, ¿posiblemente debido a la lentitud?Cuando se inicia la GUI (si tiene suerte), muestra "La interfaz de usuario del sistema no responde".Ver también: El sistema de proceso no responde en el emulador de Android

  • -show-kernel vincula el terminal a una serie, es decirves mensajes de arranque y obtienes un shell al final, lo cual es muy útil para depurar cosas.

  • type emulator muestra que es sólo un alias del emulator sin ningún argumento. Ejecute ROM personalizada en el emulador de Android pregunta cómo pasar algunos argumentos para seleccionar explícitamente su ROM.

    el emulador -help Los objetivos son sorprendentemente reveladores:

    emulator -help
    emulator -help-build-images
    emulator -help-disk-images
    

    Puede determinar los argumentos exactos de la línea de comando QEMU proporcionados con:

    emulator -verbose | grep 'emulator: argv'
    

    como se menciona en: ¿Cómo mostrar qué opciones se pasan a QEMU al iniciar el emulador de Android?

    Esto muestra algunas opciones personalizadas, p. -android-hw, por lo que deben haber bifurcado QEMU: QEMU vs emulador de Android:opciones de línea de comando La fuente aparentemente cambia de ubicación cada 5 minutos: Modificar el código fuente del emulador de Android

Eso es fácil. Siga las instrucciones en http://source.android.com/download para obtener y compilar el código fuente para Todo el androide. Eso lleva un tiempo, pero no es tan complicado.

Al construir eso, tendrás tu salida en el directorio <android>/out. Eso incluye, además de las imágenes de ROM, un montón de herramientas, incluido el emulador. Mi emulador está en <android>/out/host/linux-x86/bin/emulator. Simplemente configure una variable de entorno llamada ANDROID_PRODUCT_OUT a <android>/out/target/product/generic, y luego ejecutando el emulador sin ninguna opción ejecutará su ROM compilada.

A partir de mayo de 2012, descubrí que no puede usar 'goldfish_defconfig' para compilar el núcleo. Necesita usar goldfish_armv7_defconfig '. Esto explicaría por qué el método de JonnyLambada para extraer la configuración del emulador (para el núcleo preconstruido) funciona y es necesario.

goldfish_defconfig configura el núcleo para que se ejecute en un procesador ARM 926, pero el emulador está configurado para ejecutarse como Coretex A8 (que es una CPU ARM V7). Por lo tanto, debe usar el defconfig más nuevo si desea que funcione (o extraer la configuración del emulador).

Solo para tu información.

La forma en que pude arrancar la rom de AOSP que compilé fue copiar el system.img que se compiló en ~ / .android / avd / Froyo.avd / Pero, cuando extraigo el system.img y agrego la versión rooteada de su y busybox, luego rehago el system.img, el emulador no arranca. Todavía estoy tratando de resolver esa parte: S

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top