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