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