Saltar al contenido

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

Solución:

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

  • Obtenga el kernel de Android agregándolo a su manifiesto de repositorio o manualmente ejecutando:
    git clone https://android.googlesource.com/kernel/goldfish.git
  • Consulte la rama correcta para trabajar con el emulador, es decir, peces 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 de brazo, es decir, una configuración de brazo):
    make ARCH=arm goldfish_defconfig

    • si eso no funciona, intenta make ARCH=arm goldfish_armv7_defconfig
  • Ahora compile 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 del kernel (donde coloca el código de git clone)
  • Para ejecutar el emulador con su kernel hay dos alternativas, o 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 el conjunto de opciones del kernel:
    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 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.

Alguna información adicional: en la distribución estándar de código abierto de Android, el kernel se distribuye como un binario preconstruido 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 creo. 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 de aosp, tiene sentido mantenerlo separado. La rama común del kernel es la que usa 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.

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 núcleo omitido) ;
  • git checkout -t origin / android-goldfish-2.6.29 -b goldfish (el mismo);
  • hacer 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 para mí).

Invitado Android 8.1 completamente 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

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

Aproximadamente 1-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:

ingrese la descripción de la imagen aquí

Notas:

  • ./repo init -b DEBE señalar 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.

    Es probable que haya 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 paquetes además del “maestro” público y ya han solucionado el problema.

      Por la misma razón, es probable que sea inútil intentar informar cualquier error de compilación en el maestro: ya se han informado y solucionado. También te reto a que encuentres el lugar oficial adecuado para informar fallas de construcción.

    • repo sync en una rama simplemente extrae la última versión de los 650 repositorios de git que componen AOSP para la rama determinada, 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 sea 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, incluido KVM.

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

    Además, la imagen ARM tenía 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

    Todas las “cosas habituales de alto nivel” que haces en las API nativas de Java / C ++ deberían funcionar por igual en x86 y ARM en teoría, por lo que no debería importar a menos que seas lo suficientemente duro como para tocar manualmente algún ensamblaje.

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

  • type emulator muestra que es solo un alias para el emulator sin ningún argumento. Ejecutar 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 perspicaces:

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

    Puede determinar los argumentos exactos de la línea de comando QEMU dados 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, por ejemplo -android-hw, por lo que deben haber bifurcado QEMU: QEMU vs emulador de Android: opciones de línea de comando La fuente mueve la ubicación cada 5 minutos aparentemente: Modificación del código fuente del emulador de Android

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *