ใช้งาน Bootconfig ใน Android 12

ใน 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 ดูการเปลี่ยนแปลงของหมึกกระดองเพื่อทำสิ่งต่อไปนี้

การใช้งาน

พาร์ทเนอร์ต้องเพิ่มการรองรับไปยัง 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 จากส่วนหัวอิมเมจบูทของผู้ให้บริการ

แผนภาพการจัดสรรหน่วยความจำ Bootconfig

รูปที่ 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

ขั้นตอนการติดตั้งใช้งานแบบค่อยเป็นค่อยไปพร้อมการตรวจสอบมีดังนี้

  1. สร้าง Bootloader และบิลด์การเปลี่ยนแปลง จากนั้นดำเนินการต่อไปนี้
    1. ใช้ตัวแปร BOARD_BOOTCONFIG เพื่อเพิ่มพารามิเตอร์ Bootconfig ใหม่
    2. ใช้พารามิเตอร์ Kernel cmdline ตามที่เป็นอยู่เพื่อให้อุปกรณ์บูตได้อย่างถูกต้องต่อไป ซึ่งจะทำให้การแก้ไขข้อบกพร่องและการตรวจสอบ ง่ายขึ้นมาก
  2. ยืนยันงานโดยตรวจสอบเนื้อหาของ /proc/bootconfig ตรวจสอบว่าคุณเห็นพารามิเตอร์ที่เพิ่มเข้ามาใหม่หลังจากอุปกรณ์เปิดเครื่องแล้ว
  3. ย้ายพารามิเตอร์ androidboot.* จาก kernel cmdline ไปยัง Bootconfig โดยใช้ตัวแปร BOARD_BOOTCONFIG และ Bootloader
  4. ตรวจสอบว่าพารามิเตอร์แต่ละรายการมีอยู่ใน /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