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
- si eso no funciona, intenta
- 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:
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
ysync -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 elemulator
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