ใน Android 12 ฟีเจอร์ bootconfig จะแทนที่ตัวเลือก androidboot.* ของบรรทัดคำสั่งเคอร์เนลที่ใช้ใน Android 11 และเวอร์ชันก่อนหน้า ฟีเจอร์ bootconfig เป็นกลไกสำหรับส่งรายละเอียดการกำหนดค่าจากบิลด์และ Bootloader ไปยัง Android 12
ฟีเจอร์นี้ช่วยให้แยกพารามิเตอร์การกำหนดค่าสำหรับพื้นที่ผู้ใช้ Android ออกจากพารามิเตอร์สำหรับเคอร์เนลได้ การย้ายพารามิเตอร์ androidboot.* ของเคอร์เนลที่มีความยาวไปยังไฟล์ bootconfig จะสร้างพื้นที่ในบรรทัดคำสั่งเคอร์เนลและทำให้พร้อมสำหรับการขยายในอนาคต
ทั้งเคอร์เนลและพื้นที่ผู้ใช้ Android ต้องรองรับ bootconfig
- เวอร์ชันแรกที่รองรับ: Android 12
- เวอร์ชันเคอร์เนลแรกที่รองรับ: เคอร์เนล 12-5.4.xx
ใช้ฟีเจอร์ bootconfig สำหรับอุปกรณ์ ใหม่ ที่เปิดตัวด้วยเคอร์เนลเวอร์ชัน 12-5.10.xx คุณไม่จำเป็นต้องใช้ฟีเจอร์นี้หากกำลังอัปเกรดอุปกรณ์
ตัวอย่างและซอร์ส
เมื่อดูตัวอย่างและซอร์สโค้ดในส่วนนี้ โปรดทราบว่ารูปแบบของโค้ด bootconfig แตกต่างจากรูปแบบของบรรทัดคำสั่งเคอร์เนลที่ใช้ใน Android 11 และเวอร์ชันก่อนหน้าเพียงเล็กน้อย
อย่างไรก็ตาม ความแตกต่างต่อไปนี้มีความสำคัญต่อการใช้งาน
- ต้องคั่นพารามิเตอร์ด้วยลำดับอักขระหลีกขึ้นบรรทัดใหม่
\nไม่ใช่ช่องว่าง
ตัวอย่าง Bootloader
ดูตัวอย่าง Bootloader ได้ที่การใช้งาน Bootloader อ้างอิงของ Cuttlefish U-boot โดยการคอมมิต 2 รายการในการอ้างอิงแสดงไว้ด้านล่าง รายการแรกจะอัปเกรดการรองรับเวอร์ชันส่วนหัวของการบูตเป็นเวอร์ชันล่าสุด ในตัวอย่างนี้ การคอมมิตแรกจะอัปเดต (หรืออัปเกรด) การรองรับเวอร์ชันเป็นเวอร์ชันถัดไป ซึ่งก็คือ v4 ส่วนรายการที่ 2 จะทำ 2 สิ่ง ได้แก่ เพิ่มการจัดการ bootconfig และแสดงการเพิ่มพารามิเตอร์ในรันไทม์
- อัปเกรดการรองรับเวอร์ชันส่วนหัวของการบูตเป็นเวอร์ชัน v4 ล่าสุด เวอร์ชัน
- เพิ่มการจัดการ bootconfig handling.
ตัวอย่างบิลด์
ดูตัวอย่างบิลด์ที่แสดงการเปลี่ยนแปลง mkbootimg เพื่อสร้าง
vendor_boot.img ด้วยส่วนหัวของการบูตของผู้ให้บริการเวอร์ชัน 4 ได้ที่ mkbootimg changes for
bootconfig
ดูการเปลี่ยนแปลงของ Cuttlefish เพื่อทำสิ่งต่อไปนี้
- ใช้ (หรืออัปเกรดเป็น) ส่วนหัวของการบูตของผู้ให้บริการเวอร์ชัน 4
- เพิ่ม bootconfig ลงในบรรทัดคำสั่งเคอร์เนลและย้ายพารามิเตอร์ที่เลือกไปยัง bootconfig
การใช้งาน
พาร์ทเนอร์ต้องเพิ่มการรองรับลงใน Bootloader และย้ายพารามิเตอร์ androidboot.* ในเวลาบิลด์จากบรรทัดคำสั่งเคอร์เนลไปยังไฟล์ bootconfig วิธีที่ดีที่สุดในการใช้การเปลี่ยนแปลงนี้คือการดำเนินการทีละน้อย ดูข้อมูลเกี่ยวกับการทำตามกระบวนการทีละน้อยได้ที่ส่วน
การใช้งานและการตรวจสอบทีละน้อย
หากมีการเปลี่ยนแปลงที่ค้นหาพารามิเตอร์ androidboot.* ในไฟล์ /proc/cmdline ให้ชี้ไปที่ไฟล์ /proc/bootconfig แทน ระบบจะตั้งค่าพร็อพเพอร์ตี้ ro.boot.* ด้วยค่า bootconfig ใหม่ ดังนั้นคุณจึงไม่จำเป็นต้องทำการเปลี่ยนแปลงโค้ดที่ใช้พร็อพเพอร์ตี้เหล่านั้น
การเปลี่ยนแปลงบิลด์
ขั้นแรก ให้อัปเกรดเวอร์ชันส่วนหัวของการบูตเป็นเวอร์ชัน 4 โดยทำดังนี้
- BOARD_BOOT_HEADER_VERSION := 3
+ BOARD_BOOT_HEADER_VERSION := 4
เพิ่มพารามิเตอร์บรรทัดคำสั่งเคอร์เนล bootconfig ซึ่งจะทำให้เคอร์เนลมองหาส่วน bootconfig
BOARD_KERNEL_CMDLINE += bootconfig
ระบบจะสร้างพารามิเตอร์ bootconfig จากพารามิเตอร์ในตัวแปร BOARD_BOOTCONFIG คล้ายกับที่สร้างบรรทัดคำสั่งเคอร์เนลจาก BOARD\_KERNEL\_CMDLINE
คุณสามารถย้ายพารามิเตอร์ androidboot.* ได้ตามที่แสดงด้านล่าง
- BOARD_KERNEL_CMDLINE += androidboot..selinux=enforcing
+ BOARD_BOOTCONFIG += androidboot..selinux=enforcing
การเปลี่ยนแปลง Bootloader
Bootloader จะตั้งค่า initramfs ก่อนที่จะข้ามไปยังเคอร์เนล การกำหนดค่าการบูตของ เคอร์เนล
จะค้นหาส่วน bootconfig และมองหาส่วนดังกล่าวที่ส่วนท้ายของ
initramfs, พร้อมกับส่วนท้ายที่คาดไว้
Bootloader จะรับข้อมูลเลย์เอาต์ vendor_boot.img จากส่วนหัวของอิมเมจบูตของผู้ให้บริการ
รูปที่ 1 การจัดสรรหน่วยความจำ bootconfig ของ Android 12
Bootloader จะสร้างส่วน bootconfig ในหน่วยความจำ ส่วน bootconfig มีการจัดสรรหน่วยความจำสำหรับรายการต่อไปนี้
- พารามิเตอร์
- ขนาด 4 ไบต์
parameters size - ขนาด 4 ไบต์
parameters checksum - สตริง Magic bootconfig ขนาด 12 ไบต์ (
#BOOTCONFIG\n)
พารามิเตอร์มาจาก 2 แหล่งที่มา ได้แก่ พารามิเตอร์ที่ทราบในเวลาบิลด์ และพารามิเตอร์ที่ไม่ทราบในเวลาบิลด์ คุณต้องเพิ่มพารามิเตอร์ที่ไม่ทราบ
ระบบจะแพ็กพารามิเตอร์ที่ทราบในเวลาบิลด์ไว้ที่ส่วนท้ายของอิมเมจ vendor_boot ในส่วน bootconfig ขนาดของส่วนจะจัดเก็บไว้ (เป็นไบต์) ในช่อง vendor_bootconfig_size ของส่วนหัวของการบูตของผู้ให้บริการ
พารามิเตอร์ที่ไม่ทราบในเวลาบิลด์จะทราบเฉพาะในรันไทม์ใน Bootloader คุณต้องเพิ่มพารามิเตอร์เหล่านี้ที่ส่วนท้ายของส่วนพารามิเตอร์ bootconfig ก่อนที่จะใช้ส่วนท้าย bootconfig
หากต้องการเพิ่มพารามิเตอร์หลังจากใช้ส่วนท้าย bootconfig แล้ว ให้เขียนทับส่วนท้ายและใช้ส่วนท้ายอีกครั้ง
การใช้งานและการตรวจสอบทีละน้อย
ใช้ฟีเจอร์ bootconfig ทีละน้อยโดยทำตามกระบวนการที่ระบุไว้ในส่วนนี้ ปล่อยพารามิเตอร์บรรทัดคำสั่งเคอร์เนลไว้ตามเดิมขณะเพิ่มพารามิเตอร์ bootconfig
ขั้นตอนสำหรับการใช้งานทีละน้อยพร้อมการตรวจสอบมีดังนี้
- ทำการเปลี่ยนแปลง Bootloader และบิลด์ แล้วทำดังนี้
- ใช้ตัวแปร
BOARD_BOOTCONFIGเพื่อเพิ่มพารามิเตอร์ bootconfig ใหม่ - เก็บพารามิเตอร์บรรทัดคำสั่งเคอร์เนลไว้ตามเดิม เพื่อให้อุปกรณ์บูตได้อย่างถูกต้องต่อไป ซึ่งจะช่วยให้การแก้ไขข้อบกพร่องและการตรวจสอบง่ายขึ้นมาก
- ใช้ตัวแปร
- ตรวจสอบ งานของคุณโดยดูเนื้อหาของ
/proc/bootconfigตรวจสอบว่าคุณเห็นพารามิเตอร์ที่เพิ่มใหม่หลังจากที่อุปกรณ์บูตแล้ว - ย้าย พารามิเตอร์
androidboot.*จากบรรทัดคำสั่งเคอร์เนลไปยัง bootconfig โดยใช้ตัวแปรBOARD_BOOTCONFIGและ Bootloader - ตรวจสอบ ว่าพารามิเตอร์แต่ละรายการอยู่ใน
/proc/bootconfig_และ_ ไม่อยู่ใน/proc/cmdlineหากตรวจสอบได้ แสดงว่าการใช้งานสำเร็จ
ข้อควรพิจารณาในการอัปเกรดและดาวน์เกรด OTA
คุณควรระมัดระวังเป็นพิเศษเมื่อจัดการการอัปเกรดและดาวน์เกรด OTA ระหว่าง Android เวอร์ชันต่างๆ หรือเคอร์เนลเวอร์ชันต่างๆ
Android 12 เป็นเวอร์ชันแรกที่รองรับ bootconfig หากดาวน์เกรดเป็นเวอร์ชันก่อนหน้านั้น คุณต้องใช้พารามิเตอร์บรรทัดคำสั่งเคอร์เนลแทน bootconfig
เคอร์เนลเวอร์ชัน 12-5.4 ขึ้นไปรองรับ bootconfig หากดาวน์เกรดเป็นเวอร์ชันก่อนหน้านั้น(รวมถึง 11-5.4) คุณต้องใช้พารามิเตอร์บรรทัดคำสั่งเคอร์เนล
การอัปเกรดจาก Android 11 และเวอร์ชันก่อนหน้าเป็น Android 12 ขึ้นไปจะยังคงใช้พารามิเตอร์บรรทัดคำสั่งเคอร์เนลได้ เช่นเดียวกับการอัปเกรดเคอร์เนลเวอร์ชัน
การแก้ปัญหา
เมื่อทำขั้นตอนตรวจสอบ หากไม่เห็นพารามิเตอร์ที่คาดไว้ใน /proc/bootconfig ให้ตรวจสอบบันทึกของเคอร์เนลใน logcat จะมีรายการบันทึกสำหรับ bootconfig เสมอหากเคอร์เนลรองรับ
ตัวอย่างเอาต์พุตบันทึก
$ adb logcat | grep bootconfig
02-24 17:00:07.610 0 0 I Load bootconfig: 128 bytes 9 nodes
หากเห็นบันทึกข้อผิดพลาดที่แสดงขึ้น แสดงว่าเกิดปัญหาในการโหลด bootconfig หากต้องการดูข้อผิดพลาดประเภทต่างๆ ให้ดู init/main.c