Cómo compilar kernels de Pixel

En esta guía, se proporcionan instrucciones paso a paso sobre cómo descargar, compilar y escribir en la memoria flash un kernel personalizado de Pixel para desarrollo. Gracias a la GKI, ahora es posible actualizar el kernel de manera independiente de la compilación de la plataforma de Android. Estos pasos solo se aplican a dispositivos Pixel 6 y versiones posteriores. Esto se debe a que el dispositivo Pixel 5 y versiones anteriores requieren la actualización de los módulos de kernel en la partición vendor, que depende de la compilación de la plataforma de Android para esos dispositivos. En la tabla de las ramas del kernel de Pixel compatibles con GKI, se incluye la rama del manifiesto del repositorio del kernel para cada dispositivo Pixel compatible con GKI. Consulta la sección Kernels heredados de Pixel para las ramas del manifiesto de kernel de Pixel 5 y versiones anteriores.

Ramas del kernel de Pixel compatibles con GKI
Dispositivo Ruta de objeto binario en el árbol de AOSP Ramas de repositorio Kernel de GKI
Pixel 9 Pro Fold (comet) device/google/comet-kernels/6.1 android-gs-comet-6.1-android15-qpr1 android15-6.1
Pixel 9 (tokay)
Pixel 9 Pro (caiman)
Pixel 9 Pro XL (komodo)
device/google/caimito-kernels/6.1 android-gs-caimito-6.1-android15-qpr1 android15-6.1
Pixel 8a (akita) device/google/akita-kernels/5.15 android-gs-akita-5.15-android15-qpr1 android15-5.15
Pixel 8 (shiba)
Pixel 8 Pro (husky)
device/google/shusky-kernels/5.15 android-gs-shusky-5.15-android15-qpr1 android15-5.15
Pixel Fold (felix) device/google/felix-kernels/5.10 android-gs-felix-5.10-android15-qpr1 android15-5.10
Pixel Tablet (tangorpro) device/google/tangorpro-kernels/5.10 android-gs-tangorpro-5.10-android15-qpr1 android15-5.10
Pixel 7a (lynx) device/google/lynx-kernels/5.10 android-gs-lynx-5.10-android15-qpr1 android15-5.10
Pixel 7 (panther)
Pixel 7 Pro (cheetah)
device/google/pantah-kernels/5.10 android-gs-pantah-5.10-android15-qpr1 android15-5.10
Pixel 6a (bluejay) device/google/bluejay-kernels/5.10 android-gs-bluejay-5.10-android15-qpr1 android15-5.10
Pixel 6 (oriole)
Pixel 6 Pro (raven)
device/google/raviole-kernels/5.10 android-gs-raviole-5.10-android15-qpr1 android15-5.10

Además de los kernels compatibles de fábrica, los dispositivos Pixel 6 y 6 Pro son compatibles con fines de desarrollo de GKI únicamente en las ramas de los kernels comunes de Android incluidas en la tabla Combinaciones compatibles de plataforma de Android y kernel para Pixel 6/6 Pro. Debido a las diferencias de UAPI de proveedores entre las HAL de la plataforma de Android y los controladores del kernel de Pixel, en la tabla se detallan las combinaciones de compilación admitidas.

Combinaciones compatibles de plataforma de Android y kernel para Pixel 6/6 Pro
Rama del manifiesto del kernel de Pixel Rama de GKI Compilación de la plataforma de Android ¿Es compatible con aosp-main?
gs-android-gs-raviole-mainline android-mainline (v6.12) BP11.241025.006 (12620009)
android-gs-raviole-6.1-android15-qpr2-beta android14-6.1 BP11.241025.006 (12620009)
gs-android13-gs-raviole-5.15 android13-5.15 TQ1A.230205.002 (9471150) No

Prepara tu dispositivo Pixel

En el siguiente diagrama de flujo, se describe el proceso para actualizar el kernel en el dispositivo Pixel 6 y versiones posteriores:

**Figura 1.** Diagrama de flujo de actualización del kernel

Escribe en la memoria flash del dispositivo usando flash.android.com

  1. Navega a flash.android.com.
  2. Elige la compilación de Android según las combinaciones compatibles de la plataforma de Android y el kernel.
  3. Selecciona las siguientes opciones:
    • Limpiar el dispositivo
    • Forzar la escritura de todas las particiones en la memoria flash
    • Inhabilitar la verificación
  4. Presiona el botón Install build para escribir en la memoria flash del dispositivo.

**Figura 2.** Ejemplo de la estación de escritura en memoria flash

Descarga y compila el kernel

Sincroniza el repositorio del kernel

Ejecuta los siguientes comandos para descargar el código fuente del kernel. Consulta la tabla Combinaciones compatibles de plataforma de Android y kernel para Pixel 6/6 Pro para la KERNEL_MANIFEST_BRANCH del Pixel.

repo init -u https://android.googlesource.com/kernel/manifest -b KERNEL_MANIFEST_BRANCH
repo sync -c --no-tags

Actualiza el ramdisk del proveedor

Actualiza el archivo vendor_ramdisk-DEVICE.img en el repositorio del kernel para hacer coincidir la compilación de la plataforma de Android que se escribe en la memoria flash del dispositivo. Hay dos formas de actualizar el archivo vendor_ramdisk-DEVICE.img. Elige la opción (1) si usas Android 15 QPR2 (BP11.241025.006) o una versión posterior. De lo contrario, elige la opción (2).

  • Opción (1): Actualiza solo las partes DTB y DLKM ramdisk de la partición vendor_boot.

    A partir de la versión de fastboot 35.0.2-12583183, puedes escribir directamente el DTB y DLKM ramdisk en la memoria flash de la partición vendor_boot. Para usarla, descarga y extrae sdk-repo-HOST_OS-platform-tools-12583183.zip desde los artefactos v35.0.2-12583183 en el entorno de tu máquina anfitrión.

    Sigue las instrucciones para escribir DTB y vendor_boot:dlkm en la memoria flash en Escribir imágenes de kernel en la memoria flash.

  • Opción (2): Extrae la imagen del ramdisk del proveedor de la imagen de fábrica del Pixel.

    1. Descarga la imagen de fábrica compatible de tu dispositivo de https://developers.google.com/android/images.

    2. Extrae el archivo vendor_boot.img:

      En los siguientes comandos, se usa AP1A.240505.004 del Pixel 6 Pro como ejemplo. Reemplaza el nombre del archivo zip por el nombre de la imagen de fábrica que descargaste.

        unzip raven-ap1a.240505.004-factory-9d783215.zip
      
        cd raven-ap1a.240505.004
      
        unzip image-raven-ap1a.240505.004.zip vendor_boot.img
      
    3. Descomprime el archivo vendor_boot.img para obtener el ramdisk del proveedor.

        KERNEL_REPO_ROOT/tools/mkbootimg/unpack_bootimg.py --boot_img vendor_boot.img \
            --out vendor_boot_out
      
    4. Copia el archivo vendor-ramdisk-by-name/ramdisk_ que se extrajo en el repositorio del kernel de Pixel.

      Dispositivo DEVICE_RAMDISK_PATH
      Pixel 6 (oriole)
      Pixel 6 Pro (raven)
      prebuilts/boot-artifacts/ramdisks/vendor_ramdisk-oriole.img
      Pixel 6a (bluejay) private/devices/google/bluejay/vendor_ramdisk-bluejay.img
        cp vendor_boot_out/vendor-ramdisk-by-name/ramdisk_ \
            KERNEL_REPO_ROOT/DEVICE_RAMDISK_PATH
      

Compila el kernel (Kleaf)

En Android 13, la secuencia de comandos de build.sh se reemplazó con un nuevo sistema de compilación de kernel llamado Kleaf. Para dispositivos en los que se usa android13-5.15 y versiones posteriores, el kernel debería compilarse usando Kleaf.

Para los teléfonos Pixel 6 y 6 Pro con kernels de android13-5.15, ejecuta el comando de compilación Kleaf:

tools/bazel run --lto=thin //gs/google-modules/soc-modules:slider_dist

Para el resto de los kernels de Pixel, ejecuta la secuencia de comandos build_DEVICE.sh que se encuentra en KERNEL_REPO_ROOT. En la mayoría de los casos, DEVICE debe ser el nombre interno que coincide con el que se utiliza en la columna Ruta de objeto binario en el árbol de AOSP de la tabla Ramas del kernel de Pixel compatibles con GKI. Puede ser el nombre interno de un dispositivo, como "akita" (Pixel 8a), o un nombre interno que representa a un grupo de dispositivos relacionados que comparten un kernel, como "caimito", que significa Pixel 9 (tokay), Pixel 9 Pro (caiman) y Pixel 9 Pro XL (komodo). Para android14 y versiones anteriores, usa build_slider.sh para el Pixel 6 y el Pixel 6 Pro, y build_cloudripper.sh para el Pixel 7 y el Pixel 7 Pro.

Por ejemplo, para compilar el kernel del Pixel 6 en la rama de android-gs-raviole-5.10-android14, deberías ejecutar este comando:

build_slider.sh

De forma predeterminada, en las ramas de producción de kernel, la secuencia de comandos build_DEVICE.sh usa el kernel GKI compilado previamente para agilizar el proceso de compilación. Si quieres modificar el kernel principal, configura la variable de entorno BUILD_AOSP_KERNEL=1 para compilar el kernel desde fuentes locales. Las ramas de kernel de desarrollo compilan directamente la fuente de kernel de forma predeterminada.

Para obtener más detalles sobre el sistema de compilación de kernels y cómo personalizar la compilación, consulta Kleaf: Cómo compilar kernels de Android con Bazel.

Escribe las imágenes del kernel en la memoria flash

Nota: Si no inhabilitaste la verificación, debes hacerlo antes de escribir el kernel personalizado en la memoria flash. Este es el comando para hacerlo:
fastboot oem disable-verification
ADVERTENCIA: Si escribes un kernel personalizado en la memoria flash sobre una compilación de plataforma, es posible que necesites limpiar tu dispositivo si hay un cambio a una versión inferior en el nivel de parche de seguridad asociado con el kernel nuevo. Con este proceso, se borran todos tus datos personales. Antes de realizar la limpieza, asegúrate de respaldar todos tus datos.
fastboot -w

Para escribir las imágenes del kernel en la memoria flash, ejecuta el comando fastboot flash para cada partición de kernel detallada para tu dispositivo. Para las particiones dinámicas, debes reiniciar en modo fastbootd antes de escribir en la memoria flash.

Dispositivo Particiones de kernel
Pixel 6 (oriole)
Pixel 6 Pro (raven)
Pixel 6a (bluejay)
boot
dtbo
vendor_boot
vendor_dlkm (partición dinámica)
Pixel 8 (shiba)
Pixel 8 Pro (husky)
Pixel Fold (felix)
Pixel Tablet (tangorpro)
Pixel 7a (lynx)
Pixel 7 (panther)
Pixel 7 Pro (cheetah)
boot
dtbo
vendor_kernel_boot
vendor_dlkm (partición dinámica)
system_dlkm (partición dinámica)

Para los teléfonos Pixel 6, 6 Pro o 6a, si omitiste la descarga de vendor_ramdisk en la sección Actualiza el ramdisk del proveedor, usa el siguiente comando para actualizar DTB y DLKM ramdisk en lugar de escribir la imagen vendor_boot.img en la memoria flash.

fastboot flash  --dtb out/DEVICE/dist/dtb.img vendor_boot:dlkm out/slider/dist/initramfs.img

A continuación, se detallan los comandos para escribir en la memoria flash de Pixel 6 en android-mainline:

fastboot flash boot        out/slider/dist/boot.img
fastboot flash dtbo        out/slider/dist/dtbo.img
fastboot flash vendor_boot out/slider/dist/vendor_boot.img
fastboot reboot fastboot
fastboot flash vendor_dlkm out/slider/dist/vendor_dlkm.img

Las imágenes del kernel pueden encontrarse en DIST_DIR.

Rama del kernel DIST_DIR
v5.10 out/mixed/dist
v5.15 y posteriores out/DEVICE/dist
Nota: Si tienes una llave de serie y quieres habilitar registros de serie, el comando es:
fastboot oem uart enable
fastboot oem uart config 3000000
Comando de ejemplo para conectarse desde el host:
screen -fn /dev/ttyUSB* 3000000

Restablece las imágenes de fábrica

Para restablecer el dispositivo a las imágenes de fábrica, puedes usar flash.android.com.

Kernels heredados de Pixel

Como referencia, en la tabla Ramas de kernels heredados de Pixel, se proporcionan las ramas del repositorio de kernels para Pixel 5 y dispositivos anteriores, es decir, dispositivos compatibles que no son de GKI.

Ramas de kernels heredados de Pixel
Dispositivo Ruta de objeto binario en el árbol de AOSP Ramas de repositorio
Pixel 5a (barbet)
Pixel 4a (5G) (bramble)
Pixel 5 (redfin)
device/google/redbull-kernel android-msm-redbull-4.19-android14-qpr3
Pixel 4a (sunfish) device/google/sunfish-kernel android-msm-sunfish-4.14-android13-qpr3
Pixel 4 (flame)
Pixel 4 XL (coral)
device/google/coral-kernel android-msm-coral-4.14-android13
Pixel 3a (sargo)
Pixel 3a XL (bonito)
device/google/bonito-kernel android-msm-bonito-4.9-android12L
Pixel 3 (blueline)
Pixel 3 XL (crosshatch)
device/google/crosshatch-kernel android-msm-crosshatch-4.9-android12
Pixel 2 (walleye)
Pixel 2 XL (taimen)
device/google/wahoo-kernel android-msm-wahoo-4.4-android10-qpr3
Pixel (sailfish)
Pixel XL (marlin)
device/google/marlin-kernel android-msm-marlin-3.18-pie-qpr2