¿Cómo comstackr el kernel AOSP de Android y probarlo con el emulador de Android?

¿Alguien compiló con éxito el kernel de Android y lo probó en el emulador de Android, y si es así, hay algo especial que deba hacerse?

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

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

  • Obtenga el núcleo de Android agregándolo a su manifiesto de repos o manualmente ejecutando:
    git clone https://android.googlesource.com/kernel/goldfish.git
  • Consulte la twig correcta para trabajar con el emulador, es decir, goldfish:
    git checkout -t origin/android-goldfish-2.6.29 -b goldfish
  • Genere la configuración del emulador (el emulador qemu ejecuta el código de armado, es decir, una configuración de armado):
    make ARCH=arm goldfish_defconfig
    • si eso no funciona, intente make ARCH=arm goldfish_armv7_defconfig
  • Ahora comstack el kernel usando las herramientas de comstackció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 creado de esta manera debe terminar en la carpeta arch / arm / boot de su árbol kernel (donde pone el código de clon git)
  • Para ejecutar el emulador con su kernel, existen dos alternativas, ya sea copiarlo en la carpeta kernel preconstruida del proyecto de código abierto para reemplazar el kernel estándar. La otra opción es iniciar el emulador con la opción de kernel establecida:
    emulator -kernel mydroid/kernel/common/arch/arm/boot/zImage

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

Información adicional: en la distribución estándar de código abierto de Android, el kernel se distribuye como un binario mydroid/prebuilt/android-arm/kernel en la mydroid/prebuilt/android-arm/kernel y el código fuente no está incluido. El origen del kernel se eliminó del manifiesto predeterminado por dos razones, según lo tomo. Una es que se necesita mucho ancho de banda y espacio de 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 núcleo está construido con el sistema de comstackción kernel y no como parte del sistema de comstackción aosp, tiene sentido mantenerlo separado. La twig común para el kernel es la utilizada por el emulador. También hay sucursales para experimental, msm (plataformas de Qualcomm) y Omap (plataforma de TI) y tal vez un poco más. Si desea utilizar el núcleo de Android con hardware, estos pueden ser más interesantes para usted.

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

  • git clone git: //android.git.kernel.org/kernel/common.git ( kernel perdido);
  • git checkout -t origen / android-goldfish-2.6.29 -b goldfish (lo mismo);
  • hacer ARCH = armar goldfish_defconfig (idem);
  • make ARCH = armar CROSS_COMPILE = mydroid / prebuilt / linux-x86 / toolchain / arm-eabi-4.2.1 / bin / arm-eabi- (idem)
  • emulator -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 twigs de peces dorados se cambiaron a partir de 2011/03/03. Cuando revise la twig de goldfish, use esto:

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

¡Fíjate en 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, encontré que comstackrlo llevó algunos bashs. Aquí están los comandos que utilicé para construir un kernel 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 pregunta, pude hacerlo con fragmentos de esta respuesta. “Necesitas el AVD” de Amaund fue la última pieza que me causó problemas.

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

Al comstackr eso, obtendrá su salida en el directorio /out . Eso incluye, además de las imágenes ROM, un montón de herramientas también, incluido el emulador. Mi emulador está en /out/host/linux-x86/bin/emulator . Simplemente configure una variable de entorno llamada ANDROID_PRODUCT_OUT en /out/target/product/generic , y luego ejecute el emulador sin ninguna opción ejecutará su ROM comstackda.

A partir de mayo de 2012, descubrí que no puedes usar ‘goldfish_defconfig’ para comstackr el kernel. Necesitas usar goldfish_armv7_defconfig ‘. Esto explicaría por qué el método de JonnyLambada de extraer la configuración del emulador (para el núcleo precomstackdo) 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 un 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.

Procedimiento completamente automatizado para el invitado de Android 8.1 y el host de Ubuntu 17.10

 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 . build/envsetup.sh lunch aosp_x86_64-eng USE_CCACHE=1 CCACHE_DIR=ccache make -j $(($(nproc) - 2)) emulator -show-kernel 

El directorio out/ build ocupa alrededor de 90 Gb, y el rest del árbol aproximadamente 40 Gb, sin incluir CCACHE.

Notas:

  • ./repo init -b DEBE señalar una etiqueta . master sucursal master siempre está rota, y también lo fueron las twigs de -release .

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

    Es probable que haya dos razones por las cuales las sucursales siempre se rompen:

    • Android se desarrolla detrás de puertas cerradas y se descarta el código. Por lo tanto, los desarrolladores de Google y OEM ya tienen una tonelada de paches encima del “maestro” público, y ya han resuelto el problema.

      Por la misma razón, es probable que sea inútil intentar informar cualquier error de comstackción en el maestro: ya se han informado y solucionado. También te desafío incluso a encontrar el lugar oficial correcto para informar las fallas de comstackción.

    • repo sync en una twig simplemente extrae la última versión de todos los repositorys de 650 git que conforma AOSP para la twig dada, sin sincronizarlos como submódulos. Por lo tanto, nada garantiza que sean compatibles. Sin embargo, las tags traen una etiqueta específica de todos los repos.

  • --depth 1 y sync -c --no-tags --no-clone-bundle fueron un bash de hacer el clon dolorosamente lento más rápido. No estoy seguro de lo exitoso que fue. Ver también: la sincronización de repo de AOSP toma demasiado tiempo

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

    Para construir una versión ARM en su lugar, solo use el lunch aosp_arm-eng lugar.

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

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

  • type emulator muestra que es solo un alias del emulator sin ningún argumento. Ejecuta ROM personalizada en Android Emulator pregunta cómo pasar algunos argumentos para seleccionar explícitamente tu ROM.

    Los objectives de -help emulador son sorprendentemente perspicaces:

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

La forma en que pude arrancar la ROM AOSP que compilé fue copiar el archivo system.img comstackdo en ~ / .android / avd / Froyo.avd / Pero cuando extraje System.img y agrego la versión rooteada de su y busybox, luego rehaga el system.img, el emulador no arranca. Todavía estoy tratando de entender esa parte: S