Google berkomitmen untuk mendorong terwujudnya keadilan ras bagi komunitas Kulit Hitam. Lihat caranya.

Membangun Kernel

Halaman ini menjelaskan proses membangun kustom kernel untuk perangkat Android. Petunjuk ini memandu Anda melalui proses pemilihan sumber yang tepat, membangun kernel, dan menyematkan hasilnya ke dalam citra sistem yang dibuat dari Android Open Source Project (AOSP).

Anda dapat memperoleh sumber kernel yang lebih baru dengan menggunakan Repo ; membangun mereka tanpa konfigurasi lebih lanjut dengan menjalankan build/build.sh dari akar checkout sumber Anda.

Untuk membangun kernel yang lebih tua atau kernel tidak tercantum di halaman ini, lihat petunjuk tentang bagaimana membangun kernel warisan .

Mengunduh sumber dan membuat alat

Untuk kernel terbaru, penggunaan repo untuk men-download sumber, toolchain, dan membangun script. Beberapa kernel (misalnya, kernel Pixel 3) memerlukan sumber dari beberapa repositori git, sementara yang lain (misalnya, kernel umum) hanya memerlukan satu sumber. Menggunakan repo pendekatan memastikan setup direktori sumber yang benar.

Unduh sumber untuk cabang yang sesuai:

mkdir android-kernel && cd android-kernel
repo init -u https://android.googlesource.com/kernel/manifest -b BRANCH
repo sync

Berikut daftar tabel BRANCH nama untuk kernel yang tersedia melalui metode ini.

Perangkat Jalur biner di pohon AOSP Cabang repo
Pixel 5a (barbet) perangkat/google/barbet-kernel android-msm-barbet-4.19-android12
Pixel 5 (sirip merah)
Pixel 4a (5G) (berduri)
perangkat/google/redbull-kernel android-msm-redbull-4.19-android12
Pixel 4a (ikan mola-mola) perangkat/google/sunfish-kernel android-msm-sunfish-4.14-android12
Pixel 4 (api)
Pixel 4 XL (karang)
perangkat/google/coral-kernel android-msm-coral-4.14-android12
Piksel 3a (sargo)
Pixel 3a XL (bonito)
perangkat/google/bonito-kernel android-msm-bonito-4.9-android12
Pixel 3 (garis biru)
Pixel 3 XL (lintasan silang)
perangkat/google/crosshatch-kernel android-msm-crosshatch-4.9-android12
Pixel 2 (walleye)
Pixel 2 XL (taimen)
perangkat/google/wahoo-kernel android-msm-wahoo-4.4-android10-qpr3
Piksel (ikan layar)
Piksel XL (marlin)
perangkat/google/marlin-kernel android-msm-marlin-3.18-pie-qpr2
Hikey960 perangkat/linaro/hikey-kernel mendaki-linaro-android-4.14
mendaki-linaro-android-4.19
umum-android12-5.4
Anjing pemburu x15 perangkat/ti/beagle_x15-kernel omap-beagle-x15-android-4.14
omap-beagle-x15-android-4.19
Kernel Umum Android T/A umum-android-4.4
umum-android-4.9
umum-android-4.14
umum-android-4.19
umum-android-4.19-stabil
umum-android11-5.4
umum-android12-5.4
umum-android12-5.10
umum-android-mainline

Membangun kernel

Kemudian buat kernel dengan ini:

build/build.sh

Kernel biner, modul, dan gambar yang sesuai terletak di out/ BRANCH /dist direktori.

Membangun modul GKI

Android 11 diperkenalkan GKI , yang memisahkan kernel ke dalam Google terawat image kernel dan penjual dipertahankan-modul, yang dibangun secara terpisah.

Contoh ini menunjukkan konfigurasi gambar kernel:

BUILD_CONFIG=common/build.config.gki.x86_64 build/build.sh

Contoh ini menunjukkan konfigurasi modul (Cuttlefish dan Emulator):

BUILD_CONFIG=common-modules/virtual-device/build.config.cuttlefish.x86_64 build/build.sh

Dalam Android 12 Sotong dan konvergen Goldfish, sehingga mereka berbagi kernel yang sama: virtual_device . Untuk membangun modul kernel itu, gunakan konfigurasi build ini:

BUILD_CONFIG=common-modules/virtual-device/build.config.virtual_device.x86_64 build/build.sh

Menjalankan kernel

Ada beberapa cara untuk menjalankan kernel yang dibuat khusus. Berikut ini adalah cara-cara yang diketahui cocok untuk berbagai skenario pengembangan.

Menanamkan ke dalam build gambar Android

Copy Image.lz4-dtb ke lokasi kernel biner masing dalam pohon AOSP dan membangun kembali boot image.

Atau, mendefinisikan TARGET_PREBUILT_KERNEL variabel saat menggunakan make bootimage (atau lainnya make baris perintah yang membangun image boot). Variabel ini didukung oleh semua perangkat seperti itu diatur melalui device/common/populate-new-device.sh . Sebagai contoh:

export TARGET_PREBUILT_KERNEL=DIST_DIR/Image.lz4-dtb

Mem-flash dan mem-boot kernel dengan fastboot

Sebagian besar perangkat terbaru memiliki ekstensi bootloader untuk merampingkan proses menghasilkan dan mem-boot image boot.

Untuk mem-boot kernel tanpa mem-flash:

adb reboot bootloader
fastboot boot Image.lz4-dtb

Dengan menggunakan metode ini, kernel tidak benar-benar di-flash, dan tidak akan bertahan selama reboot.

Menyesuaikan pembuatan kernel

Proses dan hasil pembangunan dapat dipengaruhi oleh variabel lingkungan. Kebanyakan dari mereka adalah opsional dan setiap cabang kernel harus datang dengan konfigurasi default yang tepat. Yang paling sering digunakan tercantum di sini. Untuk daftar lengkap (dan up-to-date), merujuk pada build/build.sh .

Variabel lingkungan Keterangan Contoh
BUILD_CONFIG Buat file konfigurasi dari tempat Anda menginisialisasi lingkungan build. Lokasi harus ditentukan relatif terhadap direktori root Repo. Default untuk build.config .
Wajib untuk kernel umum.
BUILD_CONFIG=common/build.config.gki.aarch64
CC Timpa kompiler yang akan digunakan. Jatuh kembali ke compiler default yang didefinisikan oleh build.config . CC=clang
DIST_DIR Direktori keluaran dasar untuk distribusi kernel. DIST_DIR=/path/to/my/dist
OUT_DIR Direktori keluaran dasar untuk pembuatan kernel. OUT_DIR=/path/to/my/out
SKIP_DEFCONFIG Lewati make defconfig SKIP_DEFCONFIG=1
SKIP_MRPROPER Lewati make mrproper SKIP_MRPROPER=1

Konfigurasi kernel khusus untuk build lokal

Jika Anda perlu mengganti opsi konfigurasi kernel secara teratur, misalnya, saat mengerjakan suatu fitur, atau jika Anda memerlukan opsi untuk disetel untuk tujuan pengembangan, Anda dapat mencapai fleksibilitas itu dengan mempertahankan modifikasi lokal atau salinan konfigurasi build.

Set variabel POST_DEFCONFIG_CMDS pernyataan yang dievaluasi setelah biasa make defconfig langkah dilakukan. Sebagai build.config file yang bersumber dalam membangun lingkungan, fungsi yang didefinisikan dalam build.config bisa disebut sebagai bagian dari perintah pasca-defconfig.

Contoh umum adalah menonaktifkan optimasi waktu tautan (LTO) untuk kernel crosshatch selama pengembangan. Sementara LTO bermanfaat untuk kernel yang dirilis, overhead pada waktu pembuatan bisa menjadi signifikan. Berikut cuplikan ditambahkan ke lokal build.config menonaktifkan LTO terus-menerus ketika menggunakan build/build.sh .

POST_DEFCONFIG_CMDS="check_defconfig && update_debug_config"
function update_debug_config() {
    ${KERNEL_DIR}/scripts/config --file ${OUT_DIR}/.config \
         -d LTO \
         -d LTO_CLANG \
         -d CFI \
         -d CFI_PERMISSIVE \
         -d CFI_CLANG
    (cd ${OUT_DIR} && \
     make O=${OUT_DIR} $archsubarch CC=${CC} CROSS_COMPILE=${CROSS_COMPILE} olddefconfig)
}

Mengidentifikasi versi kernel

Anda dapat mengidentifikasi versi yang benar untuk dibuat dari dua sumber: pohon AOSP dan citra sistem.

Versi kernel dari pohon AOSP

Pohon AOSP berisi versi kernel bawaan. Log git mengungkapkan versi yang benar sebagai bagian dari pesan komit:

cd $AOSP/device/VENDOR/NAME
git log --max-count=1

Jika versi kernel tidak terdaftar di git log, dapatkan dari citra sistem, seperti yang dijelaskan di bawah ini.

Versi kernel dari citra sistem

Untuk menentukan versi kernel yang digunakan dalam citra sistem, jalankan perintah berikut terhadap file kernel:

file kernel

Untuk Image.lz4-dtb file, jalankan:

grep -a 'Linux version' Image.lz4-dtb

Membangun Gambar Boot

Dimungkinkan untuk membangun image boot menggunakan lingkungan build kernel. Untuk melakukan ini, Anda memerlukan biner ramdisk, yang dapat diperoleh dengan mengunduh image boot GKI dan membongkarnya. Gambar boot GKI apa pun dari rilis Android terkait akan berfungsi.

tools/mkbootimg/unpack_bootimg.py --boot_img=boot-5.4-gz.img
mv tools/mkbootimg/out/ramdisk gki-ramdisk.lz4

Folder target adalah direktori tingkat atas dari pohon kernel (direktori kerja saat ini).

Jika Anda sedang mengembangkan dengan AOSP induk, Anda malah dapat men-download ramdisk-recovery.img membangun artefak dari aosp_arm64 membangun di ci.android.com dan menggunakan itu sebagai biner ramdisk Anda.

Bila Anda memiliki biner ramdisk dan telah disalin ke gki-ramdisk.lz4 dalam direktori root dari membangun kernel, Anda dapat menghasilkan gambar boot dengan mengeksekusi:

BUILD_BOOT_IMG=1 SKIP_VENDOR_BOOT=1 KERNEL_BINARY=Image GKI_RAMDISK_PREBUILT_BINARY=gki-ramdisk.lz4 BUILD_CONFIG=common/build.config.gki.aarch64 build/build.sh

Jika Anda bekerja dengan arsitektur berbasis x86, ganti Image dengan bzImage , dan aarch64 dengan x86_64 :

BUILD_BOOT_IMG=1 SKIP_VENDOR_BOOT=1 KERNEL_BINARY=bzImage GKI_RAMDISK_PREBUILT_BINARY=gki-ramdisk.lz4 BUILD_CONFIG=common/build.config.gki.x86_64 build/build.sh

File yang terletak di direktori artefak $KERNEL_ROOT/out/$KERNEL_VERSION/dist .

Gambar boot terletak di out/<kernel branch>/dist/boot.img .