หน้านี้มีรายละเอียดขั้นตอนการสร้าง เคอร์เนล แบบกำหนดเองสำหรับอุปกรณ์ Android คำแนะนำเหล่านี้จะแนะนำคุณตลอดกระบวนการเลือกซอร์สที่ถูกต้อง สร้างเคอร์เนล และฝังผลลัพธ์ลงในอิมเมจระบบที่สร้างจาก Android Open Source Project (AOSP)
คุณสามารถรับแหล่งเคอร์เนลล่าสุดได้โดยใช้ Repo ; สร้างโดยไม่ต้องกำหนดค่าเพิ่มเติมโดยเรียกใช้ build/build.sh
จากรูทของการชำระเงินต้นทางของคุณ
ดาวน์โหลดแหล่งที่มาและเครื่องมือสร้าง
สำหรับเคอร์เนลล่าสุด ให้ใช้ repo
เพื่อดาวน์โหลดซอร์ส เชนเครื่องมือ และสร้างสคริปต์ เคอร์เนลบางตัว (เช่น เคอร์เนล Pixel 3) ต้องการแหล่งที่มาจากที่เก็บ git หลายแห่ง ในขณะที่เคอร์เนลอื่น ๆ (เช่น เคอร์เนลทั่วไป) ต้องการเพียงซอร์สเดียว การใช้วิธี repo
ทำให้แน่ใจว่ามีการตั้งค่าไดเร็กทอรีต้นทางที่ถูกต้อง
ดาวน์โหลดแหล่งที่มาสำหรับสาขาที่เหมาะสม:
mkdir android-kernel && cd android-kernel
repo init -u https://android.googlesource.com/kernel/manifest -b BRANCH
repo sync
ตารางต่อไปนี้แสดงชื่อ BRANCH สำหรับเมล็ดที่ใช้ได้ด้วยวิธีนี้
อุปกรณ์ | เส้นทางไบนารีในทรี AOSP | สาขาซื้อคืน |
---|---|---|
Pixel 7 (เสือดำ) Pixel 7 Pro (เสือชีต้า) | อุปกรณ์/google/pantah-เคอร์เนล | android-gs-pantah-5.10-android13-qpr1 |
Pixel 6a (บลูเจย์) | อุปกรณ์/google/bluejay-เคอร์เนล | android-gs-bluejay-5.10-android13-qpr1 |
Pixel 6 (นกขมิ้น) Pixel 6 Pro (เรเวน) | อุปกรณ์/google/raviole-เคอร์เนล | android-gs-raviole-5.10-android13-qpr1 |
Pixel 5a (แบบแท่ง) Pixel 5 (ครีบแดง) Pixel 4a (5G) (หนาม) | อุปกรณ์/google/redbull-เคอร์เนล | android-msm-redbull-4.19-android13-qpr1.1 |
Pixel 4a (ปลาแสงอาทิตย์) | device/google/sunfish-kernel | android-msm-sunfish-4.14-android13-qpr1.1 |
Pixel 4 (ไฟ) Pixel 4 XL (ปะการัง) | อุปกรณ์/google/coral-kernel | android-msm-ปะการัง-4.14-android13 |
Pixel 3a (ซาร์โก) Pixel 3a XL (โบนิโต) | อุปกรณ์/google/bonito-kernel | android-msm-bonito-4.9-android12L |
Pixel 3 (เส้นสีน้ำเงิน) Pixel 3 XL (ครอสแฮทช์) | อุปกรณ์/google/crosshatch-เคอร์เนล | android-msm-crosshatch-4.9-android12.dll |
พิกเซล 2 (ตาล) Pixel 2 XL (ไทเม็น) | อุปกรณ์/google/wahoo-เคอร์เนล | android-msm-wahoo-4.4-android10-qpr3.1 |
พิกเซล (ปลาเซลฟิช) Pixel XL (มาร์ลิน) | อุปกรณ์/google/marlin-เคอร์เนล | android-msm-marlin-3.18-pie-qpr2.dll |
ไฮคีย์960 | อุปกรณ์/linaro/hikey-เคอร์เนล | ไต่เขา-linaro-หุ่นยนต์-4.14 ไต่เขา-linaro-หุ่นยนต์-4.19 สามัญ-android12-5.4 ทั่วไป-android13-5.10 |
บีเกิ้ลx15 | อุปกรณ์/ti/beagle_x15-เคอร์เนล | omap-beagle-x15-android-4.14 omap-beagle-x15-android-4.19 |
เคอร์เนลทั่วไปของ Android | ไม่มีข้อมูล | สามัญ-android-4.4 สามัญ-android-4.9 สามัญ-android-4.14 สามัญ-android-4.19 ทั่วไป-android-4.19-เสถียร สามัญ-android11-5.4 สามัญ-android12-5.4 ทั่วไป-android12-5.10 ทั่วไป-android13-5.10 ทั่วไป-android13-5.15 ทั่วไป-android14-5.15 สามัญ-android14-6.1 ทั่วไป android-mainline |
สร้างเคอร์เนล
จากนั้นสร้างเคอร์เนลด้วยสิ่งนี้:
build/build.sh
เคอร์เนลไบนารี โมดูล และอิมเมจที่เกี่ยวข้องอยู่ในไดเร็กทอรี out/ BRANCH /dist
สร้างด้วย Bazel (Kleaf)
Android 13 แนะนำการสร้างเคอร์เนลด้วย Bazel แทนที่ build/build.sh
หากต้องการสร้างเคอร์เนล GKI สำหรับสถาปัตยกรรม aarch64 ให้ตรวจสอบสาขา Android Common Kernel ที่ไม่เก่ากว่า Android 13 จากนั้นเรียกใช้คำสั่งต่อไปนี้:
tools/bazel build //common:kernel_aarch64_dist
หากต้องการสร้างการแจกจ่าย ให้เรียกใช้:
tools/bazel run //common:kernel_aarch64_dist -- --dist_dir=$DIST_DIR
หลังจากนั้นเคอร์เนลไบนารี โมดูล และอิมเมจที่เกี่ยวข้องจะอยู่ใน $DIST_DIR
หากไม่ได้ระบุ --dist_dir
ให้ดูผลลัพธ์ของคำสั่งสำหรับตำแหน่งของสิ่งประดิษฐ์ สำหรับรายละเอียด โปรดดู เอกสารประกอบเกี่ยวกับ AOSP
สร้างโมดูลผู้ขายสำหรับอุปกรณ์เสมือน
Android 11 เปิดตัว GKI ซึ่งแยกเคอร์เนลออกเป็นอิมเมจเคอร์เนลที่ดูแลโดย Google และโมดูลที่ดูแลโดยผู้ขาย ซึ่งสร้างขึ้นแยกกัน
ตัวอย่างนี้แสดงการกำหนดค่าอิมเมจเคอร์เนล:
BUILD_CONFIG=common/build.config.gki.x86_64 build/build.sh
ตัวอย่างนี้แสดงการกำหนดค่าโมดูล (Cuttlefish และ Emulator):
BUILD_CONFIG=common-modules/virtual-device/build.config.cuttlefish.x86_64 build/build.sh
ใน Android 12 Cuttlefish และ Goldfish มาบรรจบกัน ดังนั้นพวกมันจึงใช้เคอร์เนลเดียวกัน: virtual_device
หากต้องการสร้างโมดูลของเคอร์เนลนั้น ให้ใช้การกำหนดค่าบิลด์นี้:
BUILD_CONFIG=common-modules/virtual-device/build.config.virtual_device.x86_64 build/build.sh
Android 13 แนะนำการสร้างเคอร์เนลด้วย Bazel (Kleaf) แทนที่ build.sh
ในการสร้างโมดูลของ virtual_device
ให้รัน:
tools/bazel build //common-modules/virtual-device:virtual_device_x86_64_dist
หากต้องการสร้างการแจกจ่าย ให้เรียกใช้:
tools/bazel run //common-modules/virtual-device:virtual_device_x86_64_dist -- --dist_dir=$DIST_DIR
สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับการสร้างเมล็ด Android ด้วย Bazel โปรดดู Kleaf - สร้างเมล็ด Android ด้วย Bazel
สำหรับรายละเอียดเกี่ยวกับการรองรับ Kleaf สำหรับแต่ละสถาปัตยกรรม โปรดดู ที่การรองรับ Kleaf สำหรับอุปกรณ์และเคอร์เนล
Kleaf รองรับอุปกรณ์และเคอร์เนล
ตารางต่อไปนี้แสดงรายการการสนับสนุน Kleaf สำหรับเคอร์เนลอุปกรณ์แต่ละรายการ สำหรับอุปกรณ์ที่ไม่อยู่ในรายการ โปรดติดต่อผู้ผลิตอุปกรณ์
อุปกรณ์ | สาขาซื้อคืน | การสนับสนุน Kleaf | รองรับ build/build.sh |
---|---|---|---|
เคอร์เนลทั่วไปของ Android db845c อุปกรณ์เสมือน (x86_64, arm64) อุปกรณ์เสมือน (i686, แขน) ร็อคปี4 | สามัญ-android-4.4 สามัญ-android-4.9 สามัญ-android-4.14 สามัญ-android-4.19 ทั่วไป-android-4.19-เสถียร สามัญ-android11-5.4 สามัญ-android12-5.4 ทั่วไป-android12-5.10 | ❌ | ✅ |
เคอร์เนลทั่วไปของ Android | ทั่วไป-android13-5.10 ทั่วไป-android13-5.15 | ✅ | ✅(เป็นทางการ) 1 |
เคอร์เนลทั่วไปของ Android | ทั่วไป-android14-5.15 สามัญ-android14-6.1 ทั่วไป android-mainline | ✅ | ❌ |
db845c | ทั่วไป-android13-5.10 | ❌ | ✅ |
db845c | ทั่วไป-android13-5.15 | ✅ | ✅(เป็นทางการ) 1 |
db845c | ทั่วไป-android14-5.15 สามัญ-android14-6.1 ทั่วไป android-mainline | ✅ | ❌ |
อุปกรณ์เสมือน (x86_64, arm64) | ทั่วไป-android13-5.10 ทั่วไป-android13-5.15 | ✅(เป็นทางการ) 1 | ⚠️ (ไม่มีการบำรุงรักษา) 2 |
อุปกรณ์เสมือน (x86_64, arm64) | ทั่วไป-android14-5.15 สามัญ-android14-6.1 ทั่วไป android-mainline | ✅ | ❌ |
อุปกรณ์เสมือน (i686, แขน) | ทั่วไป-android13-5.10 ทั่วไป-android13-5.15 | ❌ | ✅ |
อุปกรณ์เสมือน (i686, แขน) | ทั่วไป-android14-5.15 สามัญ-android14-6.1 ทั่วไป android-mainline | ✅ | ❌ |
ร็อคปี4 | ทั่วไป-android13-5.10 ทั่วไป-android13-5.15 | ❌ | ✅ |
ร็อคปี4 | ทั่วไป-android14-5.15 สามัญ-android14-6.1 ทั่วไป android-mainline | ✅ | ❌ |
ไฮคีย์960 | ไต่เขา-linaro-หุ่นยนต์-4.14 ไต่เขา-linaro-หุ่นยนต์-4.19 สามัญ-android12-5.4 ทั่วไป-android13-5.10 | ❌ | ✅ |
โมดูล fips140 | ทั่วไป-android12-5.10 ทั่วไป-android13-5.10 ทั่วไป-android13-5.15 | ❌ | ✅ |
โมดูล fips140 | ทั่วไป-android14-5.15 | ✅ | ❌ |
1 "เป็นทางการ" หมายความว่านี่เป็นวิธีอย่างเป็นทางการในการสร้างเคอร์เนล แม้ว่าวิธีอื่นอาจใช้ในการสร้างเคอร์เนลได้เช่นกัน 2 "ไม่ได้รับการบำรุงรักษา" หมายความว่าการสร้างเคอร์เนลด้วยวิธีนี้ควรใช้งานได้ แต่วิธีการสร้างไม่ได้รับการทดสอบอย่างต่อเนื่อง มันอาจจะหยุดสร้างในอนาคต ใช้วิธีสร้างแบบ "ทางการ" แทน |
เรียกใช้เคอร์เนล
มีหลายวิธีในการเรียกใช้เคอร์เนลที่สร้างขึ้นเอง ต่อไปนี้เป็นวิธีที่ทราบกันดีว่าเหมาะสำหรับสถานการณ์การพัฒนาต่างๆ
การฝังลงในการสร้างอิมเมจของ Android
คัดลอก Image.lz4-dtb
ไปยังตำแหน่งไบนารีของเคอร์เนลที่เกี่ยวข้องภายในทรี AOSP และสร้างอิมเมจสำหรับบูตใหม่
อีกทางหนึ่ง กำหนดตัวแปร TARGET_PREBUILT_KERNEL
ขณะใช้ make bootimage
(หรือบรรทัดคำสั่ง make
อื่นๆ ที่สร้าง boot image) ตัวแปรนี้รองรับโดยอุปกรณ์ทั้งหมดเมื่อตั้งค่าผ่าน device/common/populate-new-device.sh
ตัวอย่างเช่น:
export TARGET_PREBUILT_KERNEL=DIST_DIR/Image.lz4-dtb
เคอร์เนลที่กะพริบและบูตด้วย fastboot
อุปกรณ์ล่าสุดมีส่วนขยาย bootloader เพื่อปรับปรุงกระบวนการสร้างและบูตอิมเมจสำหรับบูต
ในการบู๊ตเคอร์เนลโดยไม่กระพริบ:
adb reboot bootloader
fastboot boot Image.lz4-dtb
เมื่อใช้วิธีนี้ เคอร์เนลจะไม่ถูกแฟลช และจะไม่คงอยู่ตลอดการรีบูต
ปรับแต่งการสร้างเคอร์เนล
หากต้องการปรับแต่งการสร้างเคอร์เนลสำหรับรุ่น Kleaf โปรดดู ที่เอกสารประกอบ ของ Kleaf
สำหรับ build/build.sh
กระบวนการสร้างและผลลัพธ์สามารถได้รับอิทธิพลจากตัวแปรสภาพแวดล้อม ส่วนใหญ่เป็นทางเลือกและแต่ละสาขาของเคอร์เนลควรมาพร้อมกับการกำหนดค่าเริ่มต้นที่เหมาะสม รายการที่ใช้บ่อยที่สุดแสดงไว้ที่นี่ สำหรับรายการที่สมบูรณ์ (และเป็นปัจจุบัน) โปรดดูที่ build/build.sh
ตัวแปรสภาพแวดล้อม | คำอธิบาย | ตัวอย่าง |
---|---|---|
BUILD_CONFIG | สร้างไฟล์คอนฟิกจากตำแหน่งที่คุณเริ่มต้นสภาพแวดล้อมบิลด์ ต้องกำหนดตำแหน่งที่สัมพันธ์กับไดเร็กทอรีรูทของ Repo เริ่มต้นเป็น build.config จำเป็นสำหรับเมล็ดทั่วไป | BUILD_CONFIG=common/build.config.gki.aarch64 |
CC | แทนที่คอมไพเลอร์ที่จะใช้ ถอยกลับไปสู่คอมไพเลอร์เริ่มต้นที่กำหนดโดย build.config | CC=clang |
DIST_DIR | ไดเร็กทอรีเอาต์พุตพื้นฐานสำหรับการกระจายเคอร์เนล | DIST_DIR=/path/to/my/dist |
OUT_DIR | ไดเร็กทอรีเอาต์พุตพื้นฐานสำหรับการสร้างเคอร์เนล | OUT_DIR=/path/to/my/out |
SKIP_DEFCONFIG | ข้าม make defconfig | SKIP_DEFCONFIG=1 |
SKIP_MRPROPER | ข้าม make mrproper | SKIP_MRPROPER=1 |
การกำหนดค่าเคอร์เนลแบบกำหนดเองสำหรับบิลด์ในเครื่อง
หากคุณจำเป็นต้องเปลี่ยนตัวเลือกการกำหนดค่าเคอร์เนลเป็นประจำ เช่น เมื่อทำงานกับคุณลักษณะ หรือหากคุณต้องการตั้งค่าตัวเลือกเพื่อวัตถุประสงค์ในการพัฒนา คุณสามารถบรรลุความยืดหยุ่นดังกล่าวได้โดยการบำรุงรักษาการปรับเปลี่ยนในเครื่องหรือคัดลอกการกำหนดค่าบิลด์
ตั้งค่าตัวแปร POST_DEFCONFIG_CMDS เป็นคำสั่งที่ได้รับการประเมินทันทีหลังจากขั้นตอน make defconfig
ตามปกติเสร็จสิ้น เนื่องจากไฟล์ build.config
มาจากสภาพแวดล้อมของ build ฟังก์ชันที่กำหนดใน build.config
สามารถถูกเรียกเป็นส่วนหนึ่งของคำสั่ง post-defconfig
ตัวอย่างทั่วไปคือการปิดใช้งานการเพิ่มประสิทธิภาพเวลาลิงก์ (LTO) สำหรับเมล็ดครอสแฮทช์ระหว่างการพัฒนา แม้ว่า LTO จะเป็นประโยชน์สำหรับเคอร์เนลที่เผยแพร่ แต่ค่าโสหุ้ยในขณะสร้างอาจมีนัยสำคัญ ข้อมูลโค้ดต่อไปนี้ที่เพิ่มไปยัง build.config
ในเครื่องจะปิดใช้งาน LTO อย่างต่อเนื่องเมื่อใช้ 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)
}
การระบุเวอร์ชันของเคอร์เนล
คุณสามารถระบุเวอร์ชันที่ถูกต้องในการสร้างได้จากสองแหล่ง: แผนผัง AOSP และอิมเมจระบบ
เวอร์ชันเคอร์เนลจากทรี AOSP
ต้นไม้ AOSP มีเวอร์ชันเคอร์เนลที่สร้างไว้ล่วงหน้า บันทึก git เปิดเผยเวอร์ชันที่ถูกต้องซึ่งเป็นส่วนหนึ่งของข้อความยืนยัน:
cd $AOSP/device/VENDOR/NAME
git log --max-count=1
ถ้าเวอร์ชันเคอร์เนลไม่อยู่ในบันทึก git ให้ดาวน์โหลดจากอิมเมจระบบตามที่อธิบายด้านล่าง
เวอร์ชันเคอร์เนลจากอิมเมจระบบ
หากต้องการตรวจสอบเวอร์ชันเคอร์เนลที่ใช้ในอิมเมจระบบ ให้รันคำสั่งต่อไปนี้กับไฟล์เคอร์เนล:
file kernel
สำหรับไฟล์ Image.lz4-dtb
ให้รัน:
grep -a 'Linux version' Image.lz4-dtb
สร้างอิมเมจสำหรับบูต
เป็นไปได้ที่จะสร้างอิมเมจสำหรับบูตโดยใช้สภาพแวดล้อมการสร้างเคอร์เนล
สร้าง Boot Image สำหรับอุปกรณ์ด้วย init_boot
สำหรับอุปกรณ์ที่มี พาร์ติชัน init_boot
อิมเมจสำหรับบูตจะถูกสร้างขึ้นพร้อมกับเคอร์เนล อิมเมจ initramfs
ไม่ได้ฝังอยู่ในอิมเมจสำหรับบูต
ตัวอย่างเช่น ด้วย Kleaf คุณสามารถสร้างอิมเมจสำหรับบูต GKI ด้วย:
tools/bazel run //common:kernel_aarch64_dist -- --dist_dir=$DIST_DIR
ด้วย build/build.sh
คุณสามารถสร้างอิมเมจสำหรับบูต GKI ด้วย:
BUILD_CONFIG=common/build.config.gki.aarch64 build/build.sh
อิมเมจสำหรับบูต GKI อยู่ใน $DIST_DIR
สร้าง Boot Image สำหรับอุปกรณ์ที่ไม่มี init_boot
สำหรับอุปกรณ์ที่ไม่มี พาร์ติ init_boot
คุณต้องมีไบนารี ramdisk ซึ่งคุณสามารถรับได้โดย ดาวน์โหลดอิมเมจสำหรับบูต GKI และคลายแพ็ก อิมเมจสำหรับบูต GKI ใดๆ จากรุ่น Android ที่เกี่ยวข้องจะใช้งานได้
tools/mkbootimg/unpack_bootimg.py --boot_img=boot-5.4-gz.img
mv $KERNEL_ROOT/out/ramdisk gki-ramdisk.lz4
โฟลเดอร์เป้าหมายคือไดเร็กทอรีระดับบนสุดของเคอร์เนลทรี (ไดเร็กทอรีการทำงานปัจจุบัน)
หากคุณกำลังพัฒนาด้วย AOSP master คุณสามารถดาวน์โหลด ramdisk-recovery.img
build artifact จาก aosp_arm64 build บน ci.android.com และใช้เป็นไบนารี ramdisk ของคุณ
เมื่อคุณมีไบนารี ramdisk และคัดลอกไปยัง gki-ramdisk.lz4
ในไดเร็กทอรีรากของบิลด์เคอร์เนล คุณสามารถสร้างอิมเมจสำหรับบูตโดยดำเนินการ:
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
หากคุณกำลังทำงานกับสถาปัตยกรรมที่ใช้ x86 ให้แทนที่ Image
ด้วย bzImage
และ aarch64
ด้วย 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
ไฟล์นั้นอยู่ในไดเร็กทอรีสิ่งประดิษฐ์ $KERNEL_ROOT/out/$KERNEL_VERSION/dist
อิมเมจสำหรับบูตอยู่ที่ out/<kernel branch>/dist/boot.img