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