Halaman ini menjelaskan proses pembuatan kernel kustom kernels untuk perangkat Android. Petunjuk ini memandu Anda melalui proses memilih sumber yang tepat, membuat kernel, dan menyematkan hasilnya ke dalam image sistem yang dibuat dari Android Open Source Project (AOSP).
Mendownload sumber dan alat build
Untuk kernel terbaru, gunakan repo
untuk mendownload sumber, toolchain, dan skrip build.
Beberapa kernel (misalnya, kernel Pixel 3) memerlukan sumber dari beberapa repositori git
sedangkan yang lain (misalnya, kernel umum) hanya memerlukan satu sumber. Menggunakan pendekatan repo memastikan penyiapan direktori sumber
yang benar.
Download sumber untuk cabang yang sesuai:
mkdir android-kernel && cd android-kernel
repo init -u https://android.googlesource.com/kernel/manifest -b BRANCH
repo sync
Untuk mengetahui daftar cabang repo (BRANCH) yang dapat digunakan dengan perintah `repo init` sebelumnya, lihat Cabang kernel dan sistem build-nya.
Untuk mengetahui detail tentang cara mendownload dan mengompilasi kernel untuk perangkat Pixel, lihat Membuat Kernel Pixel.
Membuat kernel
Membuat dengan Bazel (Kleaf)
Android 13 memperkenalkan pembuatan kernel dengan Bazel.
Untuk membuat distribusi untuk kernel GKI untuk arsitektur aarch64, checkout cabang Kernel Umum Android yang tidak lebih awal dari Android 13, dan lalu jalankan perintah berikut:
tools/bazel run //common:kernel_aarch64_dist [-- --destdir=$DIST_DIR]
Setelah itu, biner kernel, modul, dan image yang sesuai akan berada di direktori $DIST_DIR. Jika --destdir tidak ditentukan, lihat output perintah untuk mengetahui lokasi artefak. Untuk mengetahui detailnya, lihat
dokumentasi di AOSP.
Membuat dengan build.sh (lama)
Untuk cabang di atau di bawah Android 12, ATAU cabang tanpa Kleaf:
build/build.sh
Biner kernel, modul, dan image yang sesuai berada di
out/BRANCH/dist direktori.
Membuat modul vendor untuk perangkat virtual
Android 13 memperkenalkan pembuatan kernel dengan
Bazel (Kleaf), yang menggantikan build.sh.
Untuk membuat distribusi untuk modul virtual_device, jalankan:
tools/bazel run //common-modules/virtual-device:virtual_device_x86_64_dist [-- --destdir=$DIST_DIR]
Untuk mengetahui detail selengkapnya tentang cara membuat kernel Android dengan Bazel, lihat. Kleaf - Membuat Kernel Android dengan Bazel.
Untuk mengetahui detail tentang dukungan Kleaf untuk setiap arsitektur, lihat Dukungan Kleaf untuk perangkat dan kernel.
Membuat modul vendor untuk perangkat virtual dengan build.sh (lama)
Di Android 12, Cuttlefish dan Goldfish digabungkan, sehingga keduanya menggunakan kernel yang sama: virtual_device. Untuk membuat modul kernel tersebut, gunakan konfigurasi build ini:
BUILD_CONFIG=common-modules/virtual-device/build.config.virtual_device.x86_64 build/build.sh
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 image 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
Menjalankan kernel
Ada beberapa cara untuk menjalankan kernel yang dibuat secara kustom. Berikut adalah cara yang diketahui dan sesuai untuk berbagai skenario pengembangan.
Menyematkan ke dalam build image Android
Salin Image.lz4-dtb ke lokasi program biner kernel yang sesuai dalam tree AOSP dan buat ulang boot image.
Atau, tentukan variabel TARGET_PREBUILT_KERNEL
saat menggunakan make bootimage (atau command line
make lainnya yang membuat image booting). Variabel ini
didukung oleh semua perangkat karena disiapkan melalui
device/common/populate-new-device.sh. Contoh:
export TARGET_PREBUILT_KERNEL=DIST_DIR/Image.lz4-dtb
Mem-flash dan mem-boot kernel dengan fastboot
Perangkat terbaru memiliki ekstensi bootloader untuk menyederhanakan proses pembuatan dan booting image booting.
Untuk mem-boot kernel tanpa mem-flash:
adb reboot bootloaderfastboot boot Image.lz4-dtb
Dengan metode ini, kernel tidak benar-benar di-flash, dan tidak akan dipertahankan saat reboot.
Menjalankan kernel di Cuttlefish
Anda dapat menjalankan kernel dalam arsitektur pilihan Anda di perangkat Cuttlefish.
Untuk mem-boot perangkat Cuttlefish dengan kumpulan artefak kernel
tertentu, jalankan perintah cvd create dengan artefak kernel target sebagai
parameter. Perintah contoh berikut menggunakan artefak kernel untuk target arm64 dari
common-android14-6.1 manifes kernel.
cvd create \-kernel_path=/$PATH/$TO/common-android14-6.1/out/android14-6.1/dist/Image \-initramfs_path=/$PATH/$TO/common-android14-6.1/out/android14-6.1/dist/initramfs.img
Untuk mengetahui informasi selengkapnya, lihat Mengembangkan kernel di Cuttlefish.
Menyesuaikan build kernel
Untuk menyesuaikan build kernel untuk build Kleaf, lihat dokumentasi Kleaf.
Menyesuaikan build kernel dengan build.sh (lama)
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 terbaru), lihat build/build.sh.
| Variabel lingkungan | Deskripsi | Contoh |
|---|---|---|
BUILD_CONFIG |
File konfigurasi build dari tempat Anda menginisialisasi lingkungan build.
Lokasi harus ditentukan relatif terhadap direktori root Repo
directory. Default-nya adalah build.config.Wajib untuk kernel umum. |
BUILD_CONFIG=common/build.config.gki.aarch64 |
CC |
Mengganti compiler yang akan digunakan. Kembali ke compiler 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 build kernel. | OUT_DIR=/path/to/my/out |
SKIP_DEFCONFIG |
Melewati make defconfig |
SKIP_DEFCONFIG=1 |
SKIP_MRPROPER |
Melewati make mrproper |
SKIP_MRPROPER=1 |
Konfigurasi kernel kustom untuk build lokal
Di Android 14 dan yang lebih baru, Anda dapat menggunakan fragmen defconfig untuk menyesuaikan konfigurasi kernel. Lihat dokumentasi Kleaf tentang fragmen defconfig.
Konfigurasi kernel kustom untuk build lokal dengan konfigurasi build (lama)
Di Android 13 dan yang lebih lama, lihat hal berikut.
Jika Anda perlu beralih opsi konfigurasi kernel secara rutin, misalnya, saat mengerjakan fitur, atau jika Anda memerlukan opsi untuk ditetapkan untuk tujuan pengembangan, Anda dapat mencapai fleksibilitas tersebut dengan mempertahankan modifikasi lokal atau salinan konfigurasi build.
Tetapkan variabel POST_DEFCONFIG_CMDS ke pernyataan yang dievaluasi tepat setelah langkah make defconfig biasa selesai. Karena file build.config bersumber ke lingkungan build
fungsi yang ditentukan dalam build.config dapat dipanggil
sebagai bagian dari perintah post-defconfig.
Contoh umumnya adalah menonaktifkan pengoptimalan waktu link (LTO) untuk kernel crosshatch
selama pengembangan. Meskipun LTO bermanfaat untuk kernel yang dirilis,
overhead pada waktu build dapat signifikan. Cuplikan berikut yang ditambahkan
ke build.config lokal akan 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: tree AOSP dan image sistem.
Versi kernel dari tree AOSP
Tree AOSP berisi versi kernel yang telah dibuat sebelumnya. Log git menampilkan versi yang benar sebagai bagian dari pesan commit:
cd $AOSP/device/VENDOR/NAMEgit log --max-count=1
Jika versi kernel tidak tercantum dalam log git, dapatkan dari image sistem, seperti yang dijelaskan di bawah.
Versi kernel dari image 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 image booting
Anda dapat membuat image booting menggunakan lingkungan build kernel.
Membuat image booting untuk perangkat dengan init_boot
Untuk perangkat dengan
partisi init_boot,
image booting dibuat bersama dengan kernel. Image initramfs tidak disematkan dalam boot image.
Misalnya, dengan Kleaf, Anda dapat membuat image booting GKI dengan:
tools/bazel run //common:kernel_aarch64_dist [-- --destdir=$DIST_DIR]
Dengan build/build.sh (lama), Anda dapat membuat image booting GKI dengan:
BUILD_CONFIG=common/build.config.gki.aarch64 build/build.sh
Image booting GKI berada di $DIST_DIR.
Membuat image booting untuk perangkat tanpa init_boot (lama)
Untuk perangkat tanpa
partisi init_boot,
Anda memerlukan biner ramdisk, yang dapat Anda peroleh dengan
mendownload image booting GKI
dan mengekstraknya. boot image GKI 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 tree kernel (direktori kerja saat ini ).
Jika Anda mengembangkan dengan cabang rilis AOSP terbaru, Anda dapat mendownload
ramdisk-recovery.img artefak build dari build aosp_arm64 di
ci.android.com dan menggunakannya sebagai biner ramdisk.
Jika Anda memiliki program biner ramdisk dan telah menyalinnya ke gki-ramdisk.lz4 di direktori root build kernel, Anda dapat membuat boot image dengan menjalankan:
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 menggunakan 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 tersebut berada di direktori artefak
$KERNEL_ROOT/out/$KERNEL_VERSION/dist.
Boot image berada di out/<kernel branch>/dist/boot.img.