Halaman ini menjelaskan proses pembuatan kernel untuk perangkat Android. Ini memandu Anda melalui proses memilih alat yang tepat sumber, membangun {i>kernel<i}, dan menyematkan hasilnya ke dalam {i>image<i} sistem dibangun dari Proyek Open Source Android (AOSP).
Anda bisa memperoleh sumber {i>kernel<i}
yang lebih baru dengan menggunakan
Repo; membangunnya tanpa
konfigurasi dengan menjalankan build/build.sh
dari root
sumber pembayaran.
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 git
repositori, sementara yang lain (misalnya, {i>
kernel<i} umum) hanya memerlukan
sumber. Menggunakan pendekatan repo
akan memastikan sumber yang benar
penyiapan direktori.
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 daftar cabang repo (BRANCH) yang dapat digunakan dengan cabang sebelumnya perintah `repo init`, lihat Cabang kernel dan sistem build-nya.
Untuk mengetahui detail tentang cara mendownload dan mengompilasi kernel untuk perangkat Pixel, lihat Membangun Kernel Pixel.
Membangun kernel
Membangun dengan Bazel (Kleaf)
Android 13 memperkenalkan kernel build dengan Bazel.
Untuk membangun {i>kernel<i} GKI pada arsitektur aarch64, lihat cabang Kernel Umum Android tidak lebih awal dari Android 13 dan 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 {i>kernel<i}, modul, dan {i>image<i} terkait terletak di
Direktori $DIST_DIR
. Jika --dist_dir
tidak ditentukan, lihat output
dari perintah untuk
lokasi artefak. Untuk mengetahui detailnya, lihat
dokumentasi tentang AOSP.
Membangun aplikasi dengan build.sh (lama)
Untuk cabang yang berada di atau di bawah Android 12, ATAU cabang tanpa Kleaf:
build/build.sh
Biner {i>kernel<i}, modul, dan {i>image<i} terkait terletak di
Direktori out/BRANCH/dist
.
Membangun modul vendor untuk perangkat virtual
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 membangun kernel Android dengan Bazel, lihat. Kleaf - Membangun Kernel Android dengan Bazel.
Untuk mengetahui detail tentang dukungan Kleaf untuk arsitektur individual, lihat Dukungan Kleaf untuk perangkat dan kernel.
Membangun modul vendor untuk perangkat virtual dengan build.sh (lama)
Di Android 12, Sotong dan Ikan Mas berkumpul, sehingga keduanya berbagi
{i>kernel<i} yang sama: virtual_device
. Untuk membangun modul kernel tersebut, gunakan build ini
konfigurasi:
BUILD_CONFIG=common-modules/virtual-device/build.config.virtual_device.x86_64 build/build.sh
Android 11 diperkenalkan GKI, yang memisahkan {i>kernel<i} ke dalam gambar {i>kernel<i} yang dipelihara Google dan modul yang dikelola vendor, yang dibangun 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 ini adalah cara yang telah diketahui dan cocok untuk berbagai skenario pengembangan.
Menyematkan ke build image Android
Salin Image.lz4-dtb
ke lokasi biner kernel masing-masing
dalam pohon AOSP dan
build ulang image booting.
Atau, tentukan TARGET_PREBUILT_KERNEL
variabel saat menggunakan make bootimage
(atau
command line make
yang membangun image booting). Variabel ini adalah
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 melakukan booting kernel dengan fastboot
Perangkat terbaru memiliki ekstensi {i>bootloader<i} untuk menyederhanakan proses membuat dan melakukan {i> booting image<i}.
Untuk mem-booting kernel tanpa melakukan flash:
adb reboot bootloader
fastboot boot Image.lz4-dtb
Dengan metode ini, {i>kernel<i} tidak benar-benar di-flash, dan tidak setelah melakukan {i>reboot<i}.
Menjalankan kernel di Cuttlefish
Anda dapat menjalankan {i>kernel<i} di arsitektur pilihan Anda di Perangkat sotong.
Untuk mem-booting perangkat Cuttlefish dengan set kernel tertentu
artefak, jalankan perintah cvd start
dengan artefak kernel target sebagai
parameter. Contoh perintah berikut menggunakan artefak kernel untuk target arm64 dari
Manifes kernel common-android14-6.1
.
cvd start \
-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 informasi selengkapnya, lihat Mengembangkan kernel pada 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
berdasarkan variabel lingkungan.
Sebagian besar bersifat opsional dan setiap
cabang {i>kernel<i} harus dilengkapi dengan
konfigurasi default-nya. 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 melakukan inisialisasi lingkungan build.
Lokasi harus ditentukan relatif terhadap root Repo
saat ini. Default-nya adalah build.config .Wajib untuk kernel umum. |
BUILD_CONFIG=common/build.config.gki.aarch64 |
CC |
Ganti compiler yang akan digunakan. Turun kembali ke default
compiler 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 |
Lewati make defconfig |
SKIP_DEFCONFIG=1 |
SKIP_MRPROPER |
Lewati 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 {i>kernel<i}. 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 mengganti opsi konfigurasi {i>kernel<i} secara teratur, misalnya, saat mengerjakan fitur, atau jika Anda memerlukan opsi untuk ditetapkan untuk pengembangan Anda dapat mencapai fleksibilitas tersebut dengan mempertahankan atau menyalin konfigurasi build.
Tetapkan variabel POST_DEFCONFIG_CMDS ke pernyataan yang
dievaluasi tepat setelah langkah make defconfig
yang biasa adalah
selesai. Karena sumber file build.config
ke dalam build
fungsi yang ditentukan dalam build.config
dapat dipanggil
sebagai bagian dari
perintah {i>post-defconfig<i}.
Contoh umumnya adalah menonaktifkan pengoptimalan waktu link (LTO) untuk crosshatch
{i>kernel<i} selama pengembangan. Meskipun LTO bermanfaat
untuk {i>kernel<i} yang dirilis,
overhead pada waktu build bisa menjadi signifikan. Cuplikan berikut ditambahkan
ke build.config
lokal akan terus menonaktifkan LTO
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 tepat untuk dibangun dari dua sumber: hierarki AOSP dan image sistem.
Versi kernel dari hierarki AOSP
Pohon AOSP berisi versi kernel bawaan. Git log menampilkan versi yang benar sebagai bagian dari pesan commit:
cd $AOSP/device/VENDOR/NAME
git log --max-count=1
Jika versi kernel tidak tercantum di log git, dapatkan dari sistem seperti yang dijelaskan di bawah ini.
Versi kernel dari image sistem
Untuk menentukan versi kernel yang digunakan dalam image sistem, jalankan perintah berikut terhadap file {i>kernel<i}:
file kernel
Untuk file Image.lz4-dtb
, jalankan:
grep -a 'Linux version' Image.lz4-dtb
Membuat boot image
Anda bisa membangun image boot menggunakan lingkungan build kernel.
Membuat boot image untuk perangkat dengan init_boot
Untuk perangkat dengan
partisi init_boot
,
image {i>boot<i} dibangun
bersama dengan {i>kernel<i}. Gambar initramfs
tidak disematkan
di image booting.
Misalnya, dengan Kleaf, Anda dapat membangun image booting GKI dengan:
tools/bazel run //common:kernel_aarch64_dist -- --dist_dir=$DIST_DIR
Dengan build/build.sh
(lama), Anda dapat membangun boot image GKI dengan:
BUILD_CONFIG=common/build.config.gki.aarch64 build/build.sh
Image booting GKI terletak di $DIST_DIR.
Membuat boot image untuk perangkat tanpa init_boot (lama)
Untuk perangkat tanpa
partisi init_boot
,
Anda membutuhkan biner {i>ramdisk<i},
yang dapat Anda peroleh dengan
mendownload image booting GKI
dan mengekstraknya. 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 {i>kernel<i} (direktori direktori kerja).
Jika Anda mengembangkan dengan aplikasi utama AOSP, Anda dapat mendownload
Artefak build ramdisk-recovery.img
dari build AOSP_arm64
ci.android.com dan gunakan sebagai biner ramdisk Anda.
Saat Anda memiliki biner ramdisk dan telah menyalinnya ke gki-ramdisk.lz4
di root
build kernel tersebut, Anda bisa menghasilkan image booting 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 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
.
Image booting terletak di out/<kernel branch>/dist/boot.img
.