ใน Android 12 ฟีเจอร์ bootconfig จะแทนที่ตัวเลือก androidboot.*
kernel cmdline ที่ใช้กับ Android 11 และต่ำกว่า ฟีเจอร์ bootconfig เป็นกลไกในการส่งรายละเอียดการกำหนดค่าจากบิลด์และ bootloader ไปยัง Android 12
คุณลักษณะนี้มีวิธีแยกพารามิเตอร์การกำหนดค่าสำหรับพื้นที่ผู้ใช้ Android ออกจากพารามิเตอร์สำหรับเคอร์เนล การย้ายพารามิเตอร์เคอร์เนล androidboot.*
ที่มีความยาวไปยังไฟล์ bootconfig จะสร้างพื้นที่บนเคอร์เนล cmdline และทำให้พร้อมสำหรับการขยายในอนาคตได้ง่าย
ทั้งเคอร์เนลและพื้นที่ผู้ใช้ Android ต้องรองรับ bootconfig
- รุ่นแรกที่รองรับ: Android 12
- เคอร์เนลเวอร์ชันแรกที่รองรับ: เคอร์เนล 12-5.4.xx
ใช้คุณสมบัติ bootconfig สำหรับอุปกรณ์ ใหม่ ที่เปิดตัวด้วยเคอร์เนลเวอร์ชัน 12-5.10.xx คุณไม่จำเป็นต้องติดตั้งหากคุณกำลังอัปเกรดอุปกรณ์
ตัวอย่างและที่มา
เมื่อคุณดูตัวอย่างและซอร์สโค้ดในส่วนนี้ โปรดทราบว่ารูปแบบของโค้ด bootconfig
จะแตกต่างจากรูปแบบของเคอร์เนล cmdline ที่ใช้ใน Android 11 และต่ำกว่าเพียงเล็กน้อยเท่านั้น อย่างไรก็ตาม ข้อแตกต่างต่อไปนี้มีความสำคัญต่อการใช้งานของคุณ:
- พารามิเตอร์ต้องคั่นด้วยลำดับการขึ้นบรรทัดใหม่
\n
ไม่ใช่ช่องว่าง
ตัวอย่างโปรแกรมโหลดบูต
สำหรับตัวอย่าง bootloader โปรดดูการใช้งาน bootloader อ้างอิง Cuttlefish U-boot ความมุ่งมั่นสองประการในการอ้างอิงแสดงอยู่ด้านล่าง การอัปเดตครั้งแรกจะสนับสนุนเวอร์ชันส่วนหัวของการบูตเป็นเวอร์ชันล่าสุด ในตัวอย่าง การคอมมิตครั้งแรก (หรือการปรับปรุง) เวอร์ชันจะรองรับเวอร์ชันถัดไป v4 ประการที่สองทำสองสิ่ง มันเพิ่มการจัดการ bootconfig และสาธิตการเพิ่มพารามิเตอร์ที่รันไทม์:
สร้างตัวอย่าง
สำหรับตัวอย่างบิลด์ที่แสดงการเปลี่ยนแปลง mkbootimg
เพื่อสร้าง vendor_boot.img
ด้วยส่วนหัวการบูตของผู้ขาย v4 โปรดดู mkbootimg changes for bootconfig
ดูการเปลี่ยนแปลงของปลาหมึกเพื่อทำสิ่งต่อไปนี้:
- ใช้ (หรืออัปเดตเป็น) เวอร์ชันส่วนหัวการบูตของผู้ขาย v4
- เพิ่ม
bootconfig to the kernel cmdline and move selected parameters to bootconfig
การนำไปปฏิบัติ
พันธมิตรต้องเพิ่มการรองรับให้กับ bootloaders และย้ายพารามิเตอร์ androidboot.*
ตามเวลา build จากเคอร์เนล cmdline ไปยังไฟล์ bootconfig วิธีที่ดีที่สุดในการใช้การเปลี่ยนแปลงนี้คือดำเนินการทีละน้อย ดูส่วน การใช้งานและการตรวจสอบ ส่วนเพิ่มสำหรับข้อมูลเกี่ยวกับการติดตามกระบวนการส่วนเพิ่ม
หากคุณมีการเปลี่ยนแปลงที่ค้นหาไฟล์ /proc/cmdline เพื่อหาพารามิเตอร์ androidboot.*
ให้ชี้ไปที่ไฟล์ /proc/bootconfig แทน คุณสมบัติ ro.boot.*
ได้รับการตั้งค่าด้วยค่า bootconfig
ใหม่ ดังนั้นคุณไม่จำเป็นต้องทำการเปลี่ยนแปลงโค้ดโดยใช้คุณสมบัติเหล่านั้น
สร้างการเปลี่ยนแปลง
ขั้นแรก ให้อัปเดตเวอร์ชันส่วนหัวสำหรับบูตของคุณเป็นเวอร์ชัน 4:
- BOARD_BOOT_HEADER_VERSION := 3
+ BOARD_BOOT_HEADER_VERSION := 4
เพิ่มพารามิเตอร์ cmdline เคอร์เนล bootconfig
สิ่งนี้ทำให้เคอร์เนลมองหาส่วน bootconfig:
BOARD_KERNEL_CMDLINE += bootconfig
พารามิเตอร์ bootconfig ถูกสร้างขึ้นจากพารามิเตอร์ในตัวแปร BOARD_BOOTCONFIG
เหมือนกับเคอร์เนล cmdline ที่ถูกสร้างขึ้นจาก BOARD\_KERNEL\_CMDLINE
พารามิเตอร์ androidboot.*
ใดๆ สามารถย้ายได้ตามที่เป็นอยู่ คล้ายกับตัวอย่างต่อไปนี้:
- BOARD_KERNEL_CMDLINE += androidboot..selinux=enforcing
+ BOARD_BOOTCONFIG += androidboot..selinux=enforcing
การเปลี่ยนแปลงบูตโหลดเดอร์
bootloader จะตั้งค่า initramfs
ก่อนที่จะข้ามไปที่เคอร์เนล การกำหนดค่าการบูตเคอร์เนล จะค้นหาส่วน bootconfig และดูว่าส่วนนั้นอยู่ที่ส่วนท้ายสุดของ initramfs,
พร้อมด้วยตัวอย่างที่คาดไว้
bootloader รับข้อมูลโครงร่าง vendor_boot.img
จากส่วนหัวอิมเมจสำหรับบูตของผู้จำหน่าย
รูปที่ 1 การจัดสรรหน่วยความจำ bootconfig ของ Android 12
bootloader สร้างส่วน bootconfig ในหน่วยความจำ ส่วน bootconfig มีการจัดสรรหน่วยความจำสำหรับสิ่งต่อไปนี้:
- พารามิเตอร์
- 4 B ขนาด
parameters size
-
parameters checksum
ขนาด 4 B - สตริงเวทย์มนตร์ bootconfig 12 B (
#BOOTCONFIG\n
)
พารามิเตอร์มาจากสองแหล่ง: พารามิเตอร์ที่ทราบ ณ เวลาที่สร้าง และพารามิเตอร์ที่ไม่ทราบ ณ เวลาที่สร้าง ต้องเพิ่มพารามิเตอร์ที่ไม่รู้จัก
พารามิเตอร์ที่ทราบในขณะสร้างจะถูกบรรจุไว้ที่ส่วนท้ายของอิมเมจ vendor_boot
ในส่วน bootconfig ขนาดของส่วนจะถูกจัดเก็บ (เป็นไบต์) ในฟิลด์ส่วนหัวการบูตของผู้ขาย vendor_bootconfig_size
พารามิเตอร์ที่ไม่รู้จักในขณะสร้างจะทราบเฉพาะที่รันไทม์ใน bootloader เท่านั้น ต้องเพิ่มสิ่งเหล่านี้ที่ส่วนท้ายของส่วนพารามิเตอร์ bootconfig ก่อนที่จะใช้ตัวอย่าง bootconfig
หากคุณต้องการเพิ่มพารามิเตอร์ใดๆ หลังจากที่ใช้ตัวอย่าง bootconfig แล้ว ให้เขียนทับตัวอย่างและนำไปใช้ใหม่
การใช้งานและการตรวจสอบความถูกต้องที่เพิ่มขึ้น
ใช้คุณลักษณะ bootconfig แบบค่อยเป็นค่อยไปโดยปฏิบัติตามกระบวนการที่ให้ไว้ในส่วนนี้ ปล่อยให้พารามิเตอร์เคอร์เนล cmdline ไม่ถูกแตะต้องในขณะที่เพิ่มพารามิเตอร์ bootconfig
ต่อไปนี้เป็นขั้นตอนสำหรับการใช้งานแบบเพิ่มหน่วยพร้อมการตรวจสอบความถูกต้อง:
- ทำการ เปลี่ยนแปลง bootloader และ build จากนั้นดำเนินการดังต่อไปนี้:
- ใช้ตัวแปร
BOARD_BOOTCONFIG
เพื่อเพิ่มพารามิเตอร์ bootconfig ใหม่ - รักษาพารามิเตอร์เคอร์เนล cmdline ในลักษณะที่เป็นอยู่ เพื่อให้อุปกรณ์สามารถบู๊ตได้อย่างถูกต้องต่อไป ทำให้การดีบักและการตรวจสอบความถูกต้องง่ายขึ้นมาก
- ใช้ตัวแปร
- ตรวจสอบ งานของคุณโดยตรวจสอบเนื้อหาของ
/proc/bootconfig
ตรวจสอบว่าคุณเห็นพารามิเตอร์ที่เพิ่มใหม่หลังจากที่อุปกรณ์บู๊ตแล้ว - ย้าย พารามิเตอร์
androidboot.*
จากเคอร์เนล cmdline ไปที่ bootconfig โดยใช้ตัวแปรBOARD_BOOTCONFIG
และ bootloader - ตรวจสอบ ว่าพารามิเตอร์แต่ละตัวมีอยู่ใน
/proc/bootconfig
และ ไม่ได้ อยู่ใน/proc/cmdline
หากคุณสามารถยืนยันสิ่งนี้ได้ แสดงว่าการใช้งานของคุณสำเร็จ
ข้อควรพิจารณาในการอัปเกรดและดาวน์เกรด OTA
เมื่อคุณจัดการการอัปเกรดและดาวน์เกรด OTA ระหว่าง Android เวอร์ชันต่างๆ หรือเคอร์เนลเวอร์ชันต่างๆ ควรใช้ความระมัดระวังเป็นพิเศษ
Android 12 เป็นเวอร์ชันแรกที่รองรับ bootconfig หากดาวน์เกรดเป็นเวอร์ชันก่อนหน้านั้น ต้องใช้พารามิเตอร์เคอร์เนล cmdline แทน bootconfig
เคอร์เนลเวอร์ชัน 12-5.4 และใหม่กว่ารองรับ bootconfig หากดาวน์เกรดเป็นเวอร์ชันก่อนหน้านั้น (รวมถึง 11-5.4) จะต้องใช้พารามิเตอร์เคอร์เนล cmdline
การอัปเกรดจาก Android 11 ขึ้นไปเป็น Android 12 ขึ้นไปจะสามารถใช้พารามิเตอร์ cmdline ของเคอร์เนลต่อไปได้ เช่นเดียวกับการอัพเกรดเวอร์ชันเคอร์เนล
การแก้ไขปัญหา
เมื่อคุณดำเนินการขั้นตอน การตรวจสอบ หากคุณไม่เห็นพารามิเตอร์ที่คาดหวังใน /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