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 al 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 compatibles del kernel de Pixel de 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-kernel android-gs-comet-6.1-android14-qpr3-d1 android14-6.1
Pixel 9 (tokay)
Pixel 9 Pro (caiman)
Pixel 9 Pro XL (komodo)
device/google/caimito-kernel android-gs-caimito-6.1-android14-qpr3-d1 android14-6.1
Pixel 8a (akita) device/google/akita-kernel android-gs-akita-5.15-android14-qpr3 android14-5.15
Pixel 8 (shiba)
Pixel 8 Pro (husky)
device/google/shusky-kernel android-gs-shusky-5.15-android14-qpr3 android14-5.15
Pixel Fold (felix) device/google/felix-kernel android-gs-felix-5.10-android14-qpr3 android13-5.10
Pixel Tablet (tangorpro) device/google/tangorpro-kernel android-gs-tangorpro-5.10-android14-qpr3 android13-5.10
Pixel 7a (lynx) device/google/lynx-kernel android-gs-lynx-5.10-android14-qpr3 android13-5.10
Pixel 7 (panther)
Pixel 7 Pro (cheetah)
device/google/pantah-kernel android-gs-pantah-5.10-android14-qpr3 android13-5.10
Pixel 6a (bluejay) device/google/bluejay-kernel android-gs-bluejay-5.10-android14-qpr3 android13-5.10
Pixel 6 (oriole)
Pixel 6 Pro (raven)
device/google/raviole-kernel android-gs-raviole-5.10-android14-qpr3 android13-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.8) AP1A.240505.004 (11583682)
android14-gs-pixel-6.1 android14-6.1 AP1A.240505.004 (11583682)
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 el dispositivo en la memoria flash 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. Existen algunas opciones que puedes elegir.

Opción 1) 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
    
Opción 2) Copia el vendor_ramdisk de un repositorio de plataforma de Android compilado localmente.
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 ANDROID_ROOT/out/target/product/DEVICE/vendor_ramdisk-debug.img \
   KERNEL_REPO_ROOT/DEVICE_RAMDISK_PATH/vendor_ramdisk-DEVICE.img

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 Pixel 6 y 6 Pro con android14 y kernels posteriores, ejecuta el comando de compilación Kleaf:

tools/bazel run --config=fast --config=stamp //private/google-modules/soc/gs:slider_dist

Para 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 Pixel 6 y Pixel 6 Pro, y build_cloudripper.sh para Pixel 7 y Pixel 7 Pro.

Por ejemplo, para compilar el kernel de 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 secuencias de comandos de build_DEVICE.sh, se usa el kernel de GKI compilado de manera previa para acelerar 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.

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 que cambiar a una versión inferior 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)

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