This guide provides step-by-step instructions on how to download, compile, and
flash a custom Pixel kernel for development. Due to GKI, it's now possible to
update the kernel independently of the Android platform build. These steps are
only applicable for Pixel 6 and later devices. This is because Pixel 5 and
earlier devices require updating the kernel modules on the vendor
partition,
which is dependent on the Android platform build for those devices. The GKI
supported Pixel kernel branches table includes the
kernel repository manifest branch for each GKI supported Pixel device. Refer to
the Legacy Pixel Kernels section for the Pixel 5 and
earlier kernel manifest branches.
GKI supported Pixel kernel branches
Device | Binary path in AOSP tree | Repository branches | GKI Kernel |
---|---|---|---|
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 |
In addition to the factory supported kernels, the Pixel 6 and 6 Pro devices are supported for GKI development purposes only on the Android Common kernel branches included in the Supported Pixel 6/6 Pro Android Platform and Kernel Combinations table. Due to vendor UAPI differences between the Android platform HALs and Pixel kernel drivers, the table provides the supported build combinations.
Supported Pixel 6/6 Pro Android platform and kernel combinations
Pixel Kernel Manifest Branch | GKI Branch | Android Platform Build | aosp-main support? |
---|---|---|---|
gs-android-gs-raviole-mainline | android-mainline (v6.8) | AP1A.240505.004 (11583682) | Yes |
android14-gs-pixel-6.1 | android14-6.1 | AP1A.240505.004 (11583682) | Yes |
gs-android13-gs-raviole-5.15 | android13-5.15 | TQ1A.230205.002 (9471150) | No |
Prepare your Pixel device
The following flow chart describes the process for updating the kernel on Pixel 6 and later devices:
Flash the device using flash.android.com
- Navigate to flash.android.com
- Pick the Android build based on the supported Android Platform and Kernel combinations.
- Select the following options:
- Wipe Device
- Force Flash all Partitions
- Disable Verification
- Press the Install build button to flash the device.
Download and compile the kernel
Sync the kernel repository
Run the following commands to download the kernel source code. Refer to the Supported Pixel 6/6 Pro Android Platform and Kernel Combinations table for the Pixel KERNEL_MANIFEST_BRANCH.
repo init -u https://android.googlesource.com/kernel/manifest -b KERNEL_MANIFEST_BRANCH
repo sync -c --no-tags
Update the vendor ramdisk
Update the file vendor_ramdisk-DEVICE.img
in the
kernel repository to match the Android platform build that is flashed on the
device. There are a few options you can following.
Option 1) Extract the vendor ramdisk image from the Pixel factory image.
Download the supported factory image for your device from https://developers.google.com/android/images.
Extract the
vendor_boot.img
:- The following commands use the Pixel 6 Pro AP1A.240505.004 as an example. Replace the zipfile name with the filename of the factory image you downloaded.
unzip raven-ap1a.240505.004-factory-9d783215.zip
cd raven-ap1a.240505.004
unzip image-raven-ap1a.240505.004.zip vendor_boot.img
Unpack the
vendor_boot.img
to obtain the vendor ramdisk.KERNEL_REPO_ROOT/tools/mkbootimg/unpack_bootimg.py --boot_img vendor_boot.img \ --out vendor_boot_out
Copy the extracted
vendor-ramdisk-by-name/ramdisk_
file to the Pixel kernel repository.Device 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
Option 2) Copy the vendor_ramdisk
from a locally built Android platform repository.
Device | 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
Compile the kernel (Kleaf)
In Android 13, the build.sh
script was replaced with a new kernel build system
called Kleaf. For devices using android13-5.15
and later, the
kernel should be built using Kleaf.
For Pixel 6 and 6 Pro with android14
and later kernels, run the Kleaf build
command:
tools/bazel run --config=fast --config=stamp //private/google-modules/soc/gs:slider_dist
For Pixel 6 and 6 Pro with android13-5.15
kernels, run the Kleaf build
command:
tools/bazel run --lto=thin //gs/google-modules/soc-modules:slider_dist
For all other Pixel kernels, run the build_DEVICE.sh
script found at KERNEL_REPO_ROOT
. In most
cases, DEVICE
needs to be the code name that
matches the code name used in the Binary path in AOSP tree column of the
table GKI supported Pixel kernel branches. This
can be the code name of one device, such as "akita" (Pixel 8a), or a code name
that represents a group of related devices that share a kernel, such as
"caimito" which means Pixel 9 (tokay), Pixel 9 Pro (caiman), and Pixel 9 Pro XL
(komodo). For android14
and earlier releases, use build_slider.sh
for Pixel
6 and Pixel 6 Pro, and build_cloudripper.sh
for Pixel 7 and Pixel 7 Pro.
For example, to build the kernel for Pixel 6 on the branch
android-gs-raviole-5.10-android14
, you would run the command:
build_slider.sh
By default, the build_DEVICE.sh
scripts use the
prebuilt GKI kernel to speed up the build process. If you want to modify the
core kernel, then set the environment variable BUILD_AOSP_KERNEL=1
to build
the kernel from the local sources instead.
For more details about the kernel build system and how to customize the build, refer to the Kleaf - Building Android Kernels with Bazel.
Flash the kernel images
Note: If you haven't disabled verification, you need to do it before flashing the custom kernel. Here is the command to do so:fastboot oem disable-verification
WARNING: If you are flashing a custom kernel on top of a platform build, then you may need to wipe your device if there is a security patch level (SPL) downgrade associated with the new kernel. This process erases all of your personal data. Be sure to back up your data before wiping.fastboot -w
To flash the kernel images, run the fastboot flash
command for each kernel
partition listed for your device. For dynamic partitions, you need to reboot
into fastbootd
mode before flashing.
Device | Kernel Partitions |
---|---|
Pixel 6
(oriole) Pixel 6 Pro (raven) Pixel 6a (bluejay) |
boot dtbo vendor_boot vendor_dlkm (dynamic partition) |
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 (dynamic partition) system_dlkm (dynamic partition) |
Here are the flashing commands for Pixel 6 on 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
The kernel images can be found in the DIST_DIR.
Kernel branch | DIST_DIR |
---|---|
v5.10 | out/mixed/dist |
v5.15 and later | out/DEVICE/dist |
Note: If you have a serial dongle and want to enable serial logs, the command is:Example command to connect from the host: fastboot oem uart enable
fastboot oem uart config 3000000
screen -fn /dev/ttyUSB* 3000000
Restore the factory images
To restore your device back to the factory images, you can use flash.android.com.
Legacy Pixel kernels
As a reference, the legacy Pixel kernel branches table provides the kernel repository branches for Pixel 5 and earlier devices. These are non-GKI supported devices.
Legacy Pixel kernel branches
Device | Binary path in AOSP tree | Repository branches |
---|---|---|
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 |