Halaman ini merinci proses pembuatan kernel khusus untuk perangkat Android. Petunjuk ini memandu Anda melalui proses pemilihan sumber yang tepat, membuat kernel, dan menyematkan hasilnya ke citra sistem yang dibuat dari Android Open Source Project (AOSP).
Anda dapat memperoleh sumber kernel yang lebih baru dengan menggunakan Repo ; bangun mereka tanpa konfigurasi lebih lanjut dengan menjalankan build/build.sh
dari root checkout sumber Anda.
Mengunduh sumber dan membangun alat
Untuk kernel terbaru, gunakan repo
untuk mengunduh source, toolchain, dan skrip build. Beberapa kernel (misalnya, kernel Pixel 3) memerlukan sumber dari beberapa repositori git, sementara yang lain (misalnya, kernel umum) hanya memerlukan satu sumber. Menggunakan pendekatan repo
memastikan pengaturan 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
Tabel berikut mencantumkan nama BRANCH untuk kernel yang tersedia melalui metode ini.
Perangkat | Jalur biner di pohon AOSP | Cabang repo |
---|---|---|
Piksel 7 (macan kumbang) Pixel 7 Pro (cheetah) | device/google/pantah-kernel | android-gs-pantah-5.10-android13-qpr2 |
Piksel 6a (biru) | perangkat/google/bluejay-kernel | android-gs-bluejay-5.10-android13-qpr2 |
Piksel 6 (oriole) Pixel 6 Pro (gagak) | perangkat/google/raviole-kernel | android-gs-raviole-5.10-android13-qpr2 |
Piksel 5a (barbet) Piksel 5 (redfin) Pixel 4a (5G) (semak duri) | perangkat/google/redbull-kernel | android-msm-redbull-4.19-android13-qpr2 |
Pixel 4a (ikan mola-mola) | device/google/sunfish-kernel | android-msm-sunfish-4.14-android13-qpr2 |
Piksel 4 (api) Pixel 4 XL (karang) | device/google/coral-kernel | android-msm-coral-4.14-android13 |
Piksel 3a (sargo) Pixel 3a XL (bonito) | perangkat/google/bonito-kernel | android-msm-bonito-4.9-android12L |
Piksel 3 (garis biru) Pixel 3 XL (garis 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 |
Mendaki960 | perangkat/linaro/hikey-kernel | mendakiy-linaro-android-4.14 mendakiy-linaro-android-4.19 umum-android12-5.4 umum-android13-5.10 |
Beagle 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-android13-5.10 umum-android13-5.15 umum-android14-5.15 umum-android14-6.1 common-android-mainline |
Membangun kernel
Kemudian bangun kernel dengan ini:
build/build.sh
Biner kernel, modul, dan image yang sesuai terletak di direktori out/ BRANCH /dist
.
Membangun dengan Bazel (Kleaf)
Android 13 memperkenalkan kernel build dengan Bazel , menggantikan build/build.sh
.
Untuk mem-build kernel GKI untuk arsitektur aarch64, periksa cabang Android Common Kernel yang tidak lebih lama dari Android 13, lalu jalankan perintah berikut:
tools/bazel build //common:kernel_aarch64_dist
Untuk membuat distribusi, jalankan:
tools/bazel run //common:kernel_aarch64_dist -- --dist_dir=$DIST_DIR
Setelah itu biner kernel, modul, dan gambar yang sesuai terletak di direktori $DIST_DIR
. Jika --dist_dir
tidak ditentukan, lihat keluaran perintah untuk lokasi artefak. Untuk detailnya, lihat dokumentasi di AOSP .
Membangun Modul Vendor untuk Perangkat Virtual
Android 11 memperkenalkan GKI , yang memisahkan kernel menjadi image kernel yang dikelola Google dan modul yang dikelola vendor, yang dibuat secara terpisah.
Contoh ini menunjukkan konfigurasi gambar kernel:
BUILD_CONFIG=common/build.config.gki.x86_64 build/build.sh
Contoh ini menunjukkan konfigurasi modul (Sotong dan Emulator):
BUILD_CONFIG=common-modules/virtual-device/build.config.cuttlefish.x86_64 build/build.sh
Di Android 12 Cuttlefish dan Goldfish bertemu, jadi mereka menggunakan kernel yang sama: virtual_device
. Untuk membangun modul kernel tersebut, gunakan konfigurasi build ini:
BUILD_CONFIG=common-modules/virtual-device/build.config.virtual_device.x86_64 build/build.sh
Android 13 memperkenalkan kernel build dengan Bazel (Kleaf), menggantikan build.sh
.
Untuk membuat modul virtual_device
, jalankan:
tools/bazel build //common-modules/virtual-device:virtual_device_x86_64_dist
Untuk membuat distribusi, jalankan:
tools/bazel run //common-modules/virtual-device:virtual_device_x86_64_dist -- --dist_dir=$DIST_DIR
Untuk detail selengkapnya tentang membuat kernel Android dengan Bazel, lihat. Kleaf - Membangun Kernel Android dengan Bazel .
Untuk detail tentang dukungan Kleaf untuk masing-masing arsitektur, lihat Dukungan Kleaf untuk perangkat dan kernel .
Dukungan Kleaf untuk perangkat dan kernel
Tabel berikut mencantumkan dukungan Kleaf untuk masing-masing kernel perangkat. Untuk perangkat yang tidak tercantum, harap hubungi produsen perangkat.
Perangkat | Cabang repo | Dukungan Kleaf | dukungan build/build.sh |
---|---|---|---|
Kernel Umum Android db845c Perangkat Virtual (x86_64, arm64) Perangkat Virtual (i686, lengan) Rockpi4 | 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 | ❌ | ✅ |
Kernel Umum Android | umum-android13-5.10 umum-android13-5.15 | ✅ | ✅ (resmi) 1 |
Kernel Umum Android | umum-android14-5.15 umum-android14-6.1 common-android-mainline | ✅ | ❌ |
db845c | umum-android13-5.10 | ❌ | ✅ |
db845c | umum-android13-5.15 | ✅ | ✅ (resmi) 1 |
db845c | umum-android14-5.15 umum-android14-6.1 common-android-mainline | ✅ | ❌ |
Perangkat Virtual (x86_64, arm64) | umum-android13-5.10 umum-android13-5.15 | ✅ (resmi) 1 | ⚠️ (tidak terawat) 2 |
Perangkat Virtual (x86_64, arm64) | umum-android14-5.15 umum-android14-6.1 common-android-mainline | ✅ | ❌ |
Perangkat Virtual (i686, lengan) | umum-android13-5.10 umum-android13-5.15 | ❌ | ✅ |
Perangkat Virtual (i686, lengan) | umum-android14-5.15 umum-android14-6.1 common-android-mainline | ✅ | ❌ |
Rockpi4 | umum-android13-5.10 umum-android13-5.15 | ❌ | ✅ |
Rockpi4 | umum-android14-5.15 umum-android14-6.1 common-android-mainline | ✅ | ❌ |
Mendaki960 | mendakiy-linaro-android-4.14 mendakiy-linaro-android-4.19 umum-android12-5.4 umum-android13-5.10 | ❌ | ✅ |
modul fips140 | umum-android12-5.10 umum-android13-5.10 umum-android13-5.15 | ❌ | ✅ |
modul fips140 | umum-android14-5.15 | ✅ | ❌ |
1 "Resmi" berarti ini adalah cara resmi untuk membangun kernel, meskipun cara alternatif juga dapat digunakan untuk membangun kernel. 2 "Unmaintained" berarti membangun kernel dengan metode ini seharusnya berhasil, tetapi metode build tidak diuji secara terus-menerus. Ini mungkin berhenti membangun di masa depan. Gunakan cara "resmi" untuk membangun sebagai gantinya. |
Menjalankan kernel
Ada beberapa cara untuk menjalankan kernel yang dibuat khusus. Berikut ini adalah cara yang diketahui cocok untuk berbagai skenario pengembangan.
Menyematkan ke build gambar Android
Salin Image.lz4-dtb
ke lokasi biner kernel masing-masing di dalam pohon AOSP dan buat ulang image boot.
Alternatifnya, tentukan variabel TARGET_PREBUILT_KERNEL
saat menggunakan make bootimage
(atau baris perintah make
lainnya yang membuat image boot). Variabel ini didukung oleh semua perangkat karena diatur melalui device/common/populate-new-device.sh
. Misalnya:
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 pembuatan dan boot image boot.
Untuk mem-boot kernel tanpa mem-flash:
adb reboot bootloader
fastboot boot Image.lz4-dtb
Dengan menggunakan metode ini, kernel sebenarnya tidak di-flash, dan tidak akan bertahan selama reboot.
Menyesuaikan build kernel
Untuk menyesuaikan build kernel untuk build Kleaf, lihat dokumentasi Kleaf .
Untuk build/build.sh
, proses dan hasil build dapat dipengaruhi oleh variabel lingkungan. Sebagian besar bersifat opsional dan setiap cabang kernel harus dilengkapi dengan konfigurasi default yang tepat. Yang paling sering digunakan tercantum di sini. Untuk daftar lengkap (dan terkini), lihat build/build.sh
.
Variabel lingkungan | Keterangan | Contoh |
---|---|---|
BUILD_CONFIG | File konfigurasi build dari tempat Anda menginisialisasi lingkungan build. Lokasi harus ditentukan relatif terhadap direktori root Repo. Defaultnya adalah build.config .Wajib untuk kernel umum. | BUILD_CONFIG=common/build.config.gki.aarch64 |
CC | Timpa kompiler yang akan digunakan. Kembali ke kompiler default yang ditentukan oleh build.config . | CC=clang |
DIST_DIR | Direktori output dasar untuk distribusi kernel. | DIST_DIR=/path/to/my/dist |
OUT_DIR | Direktori output dasar untuk kernel build. | 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 bekerja pada suatu fitur, atau jika Anda memerlukan opsi yang ditetapkan untuk tujuan pengembangan, Anda dapat mencapai fleksibilitas itu dengan mempertahankan modifikasi lokal atau salinan konfigurasi build.
Tetapkan variabel POST_DEFCONFIG_CMDS ke pernyataan yang dievaluasi tepat setelah langkah make defconfig
biasa dilakukan. Karena file build.config
bersumber dari lingkungan build, fungsi yang didefinisikan di build.config
dapat dipanggil sebagai bagian dari perintah post-defconfig.
Contoh umum adalah menonaktifkan pengoptimalan waktu tautan (LTO) untuk kernel crosshatch selama pengembangan. Meskipun LTO bermanfaat untuk kernel yang dirilis, biaya overhead pada waktu pembuatan dapat menjadi signifikan. Cuplikan berikut ditambahkan ke build.config
lokal menonaktifkan LTO secara terus-menerus saat 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 gambar sistem.
Versi kernel dari pohon AOSP
Pohon AOSP berisi versi kernel prebuilt. 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 log git, dapatkan dari image sistem, seperti yang dijelaskan di bawah ini.
Versi kernel dari citra sistem
Untuk menentukan versi kernel yang digunakan dalam image sistem, jalankan perintah berikut terhadap file kernel:
file kernel
Untuk file Image.lz4-dtb
, jalankan:
grep -a 'Linux version' Image.lz4-dtb
Membuat Gambar Boot
Dimungkinkan untuk membangun citra boot menggunakan lingkungan kernel build.
Membuat Boot Image untuk Perangkat dengan init_boot
Untuk perangkat dengan partisi init_boot
, citra boot dibuat bersama dengan kernel. Gambar initramfs
tidak disematkan di gambar boot.
Misalnya, dengan Kleaf, Anda dapat membuat boot image GKI dengan:
tools/bazel run //common:kernel_aarch64_dist -- --dist_dir=$DIST_DIR
Dengan build/build.sh
, Anda dapat membuat citra boot GKI dengan:
BUILD_CONFIG=common/build.config.gki.aarch64 build/build.sh
Gambar boot GKI terletak di $DIST_DIR .
Membuat Boot Image untuk Perangkat tanpa init_boot
Untuk perangkat tanpa partisi init_boot
, Anda memerlukan biner ramdisk, yang dapat Anda peroleh dengan mengunduh citra boot GKI dan membongkarnya. Gambar booting GKI apa pun dari rilis Android terkait akan berfungsi.
tools/mkbootimg/unpack_bootimg.py --boot_img=boot-5.4-gz.img
mv $KERNEL_ROOT/out/ramdisk gki-ramdisk.lz4
Folder target adalah direktori tingkat atas dari pohon kernel (direktori kerja saat ini).
Jika Anda mengembangkan dengan master AOSP, Anda dapat mengunduh artefak build ramdisk-recovery.img
dari build aosp_arm64 di ci.android.com dan menggunakannya sebagai biner ramdisk Anda.
Ketika Anda memiliki biner ramdisk dan telah menyalinnya ke gki-ramdisk.lz4
di direktori root build kernel, Anda dapat membuat image 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 itu terletak di direktori artefak $KERNEL_ROOT/out/$KERNEL_VERSION/dist
.
Gambar boot terletak di out/<kernel branch>/dist/boot.img
.