Descubrí que AOSP build.sh dist crea:

  • Archivos XML:

    ./out/soong/.intermediates/kernel/configs/q/android-4.19/kernel_config_q_4.19/gen/conditional.xml
    ./out/soong/.intermediates/kernel/configs/q/android-4.19/kernel_config_q_4.19/matrix.xml
    

    de los archivos de configuración del kernel:

    kernel/configs/q/
    ├── android-4.14
    │   ├── android-base-conditional.xml
    │   ├── android-base.config
    │   ├── Android.bp
    │   ├── android-recommended-arm64.config
    │   ├── android-recommended-arm.config
    │   ├── android-recommended.config
    │   └── android-recommended-x86.config
    ├── android-4.19
    │   ├── android-base-conditional.xml
    ... ...
    
  • Una copia completa del directorio del kernel de Linux en:

    out/target/product/sdm660_64/obj/kernel/msm-4.14
    

Este msm-4.14 recién creado incluye un archivo .config que parece una configuración normal del kernel.

¿Cómo puedo compilar este kernel para aarch64?

Cuando uso make, me pide que se regenere un archivo de configuración x86_64, ya que .config contiene correctamente la configuración de Aarch64.

Quizás estoy intentando hacer algo incorrecto, pero mm en kernel/msm-4.14 ignoró los cambios en las configuraciones del kernel, y build.sh dist tomó horas.

Quiero poder cambiar la configuración del kernel y el código fuente, y construir nuevos kernels en solo unos minutos, como puedo hacer para las máquinas de escritorio.

¿Cómo debo hacer esto para Android?

0
fadedbee 28 jul. 2020 a las 17:44

1 respuesta

La mejor respuesta

Esta es la forma de compilar el kernel para su hardware y crear la imagen de arranque:

$ cd <aosp_root_dir>
$ source ./build/envsetup.sh
$ lunch <product_name>-<build_variant>
# Example: lunch sdm660_64-userdebug

$ make bootimage -j4
# This compiles the kernel and copies it to 
# <aosp_root_dir>/out/target/product/<product_name>/kernel,
# and creates boot image at 
# <aosp_root_dir>/out/target/product/<product_name>/boot.img

Si aún necesita reducir el tiempo que lleva, entonces debe encontrar los comandos individuales que ejecuta el sistema de compilación AOSP para compilar el kernel y crear la imagen de arranque.

Puede encontrar los comandos de <aosp_root_dir>/out/verbose.log.gz. Es el paquete comprimido que contiene el registro detallado de su última compilación. Entonces, construya la imagen de arranque usando el comando make bootimage primero, luego extraiga el paquete verbose.log.gz y obtendrá el archivo verbose.log.

Dentro de ese archivo, busque una línea de registro que contenga el texto: defconfig, y que probablemente sea el comando que ejecuta el sistema de compilación AOSP para compilar el kernel.

En mi caso, estos 2 son los comandos que encontré en verbose log, que se utilizan para compilar el kernel:

# make sdm660_defconfig
${ANDROID_BUILD_TOP}/prebuilts/build-tools/linux-x86/bin/make -j1 \
    -C kernel/msm-4.4 \
    O=${ANDROID_PRODUCT_OUT}/obj/kernel/msm-4.4 \
    HOSTCC=${ANDROID_BUILD_TOP}/prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.17-4.8/bin/x86_64-linux-gcc \
    HOSTAR=${ANDROID_BUILD_TOP}/prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.17-4.8/bin/x86_64-linux-ar \
    HOSTLD=${ANDROID_BUILD_TOP}/prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.17-4.8/bin/x86_64-linux-ld \
    HOSTCFLAGS="-I/usr/include -I/usr/include/x86_64-linux-gnu -L/usr/lib -L/usr/lib/x86_64-linux-gnu" \
    HOSTLDFLAGS="-L/usr/lib -L/usr/lib/x86_64-linux-gnu" \
    ARCH=arm64 \
    CROSS_COMPILE=${ANDROID_BUILD_TOP}/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin/aarch64-linux-android- \
    sdm660_defconfig

# make
${ANDROID_BUILD_TOP}/prebuilts/build-tools/linux-x86/bin/make -j4 \
    -C kernel/msm-4.4 \
    O=${ANDROID_PRODUCT_OUT}/obj/kernel/msm-4.4 \
    HOSTCC=${ANDROID_BUILD_TOP}/prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.17-4.8/bin/x86_64-linux-gcc \
    HOSTAR=${ANDROID_BUILD_TOP}/prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.17-4.8/bin/x86_64-linux-ar \
    HOSTLD=${ANDROID_BUILD_TOP}/prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.17-4.8/bin/x86_64-linux-ld \
    HOSTCFLAGS="-I/usr/include -I/usr/include/x86_64-linux-gnu -L/usr/lib -L/usr/lib/x86_64-linux-gnu" \
    HOSTLDFLAGS="-L/usr/lib -L/usr/lib/x86_64-linux-gnu" \
    ARCH=arm64 \
    CROSS_COMPILE=${ANDROID_BUILD_TOP}/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin/aarch64-linux-android-

Después de compilar el kernel usando los comandos anteriores, de acuerdo con verbose log copia la salida de la compilación a <aosp_root_dir>/out/target/product/<product_name>/kernel. Esos son los archivos del kernel utilizados para crear la imagen de arranque.

cp "${ANDROID_PRODUCT_OUT}/obj/kernel/msm-4.4/arch/arm64/boot/Image.gz" \
    "${ANDROID_PRODUCT_OUT}/kernel"

Finalmente, puede encontrar el comando que crea la imagen de arranque. Según mi verbose log, el siguiente fue el comando:

${ANDROID_BUILD_TOP}/out/host/linux-x86/bin/mkbootimg  \
    --kernel ${ANDROID_PRODUCT_OUT}/kernel  \
    --ramdisk ${ANDROID_PRODUCT_OUT}/ramdisk-recovery.img \
    --cmdline "console=ttyMSM0,115200,n8 androidboot.console=ttyMSM0 earlycon=msm_serial_dm,0xc170000 androidboot.hardware=qcom user_debug=31 msm_rtb.filter=0x37 ehci-hcd.park=3 lpm_levels.sleep_disabled=1 sched_enable_hmp=1 sched_enable_power_aware=1 service_locator.enable=1 swiotlb=1 loop.max_part=7 buildvariant=eng veritykeyid=id:`openssl x509 -in build/target/product/security/verity.x509.pem -text | grep keyid | sed 's/://g' | tr -d '[:space:]' | tr '[:upper:]' '[:lower:]' | sed 's/keyid//g'`" \
    --base 0x00000000 \
    --pagesize 4096 \
    --os_version 10 \
    --os_patch_level yyyy-mm-dd \
    --header_version 1 \
    --output  ${ANDROID_PRODUCT_OUT}/boot.img

Así, puede encontrar los comandos para compilar el kernel para su hardware y crear la imagen de arranque.

2
Lakindu 6 ago. 2020 a las 19:30