ใช้งาน Bootconfig ใน Android 12

ใน 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 แตกต่างจากรูปแบบของบรรทัดคำสั่งเคอร์เนลที่ใช้ใน Android 11 และเวอร์ชันก่อนหน้าเพียงเล็กน้อย อย่างไรก็ตาม ความแตกต่างต่อไปนี้มีความสำคัญต่อการใช้งาน

  • ต้องคั่นพารามิเตอร์ด้วยลำดับอักขระหลีกขึ้นบรรทัดใหม่ \n ไม่ใช่ช่องว่าง

ตัวอย่าง Bootloader

ดูตัวอย่าง Bootloader ได้ที่การใช้งาน Bootloader อ้างอิงของ Cuttlefish U-boot โดยการคอมมิต 2 รายการในการอ้างอิงแสดงไว้ด้านล่าง รายการแรกจะอัปเกรดการรองรับเวอร์ชันส่วนหัวของการบูตเป็นเวอร์ชันล่าสุด ในตัวอย่างนี้ การคอมมิตแรกจะอัปเดต (หรืออัปเกรด) การรองรับเวอร์ชันเป็นเวอร์ชันถัดไป ซึ่งก็คือ v4 ส่วนรายการที่ 2 จะทำ 2 สิ่ง ได้แก่ เพิ่มการจัดการ bootconfig และแสดงการเพิ่มพารามิเตอร์ในรันไทม์

ตัวอย่างบิลด์

ดูตัวอย่างบิลด์ที่แสดงการเปลี่ยนแปลง mkbootimg เพื่อสร้าง vendor_boot.img ด้วยส่วนหัวของการบูตของผู้ให้บริการเวอร์ชัน 4 ได้ที่ mkbootimg changes for bootconfig ดูการเปลี่ยนแปลงของ Cuttlefish เพื่อทำสิ่งต่อไปนี้

การใช้งาน

พาร์ทเนอร์ต้องเพิ่มการรองรับลงใน Bootloader และย้ายพารามิเตอร์ androidboot.* ในเวลาบิลด์จากบรรทัดคำสั่งเคอร์เนลไปยังไฟล์ bootconfig วิธีที่ดีที่สุดในการใช้การเปลี่ยนแปลงนี้คือการดำเนินการทีละน้อย ดูข้อมูลเกี่ยวกับการทำตามกระบวนการทีละน้อยได้ที่ส่วน การใช้งานและการตรวจสอบทีละน้อย

หากมีการเปลี่ยนแปลงที่ค้นหาพารามิเตอร์ androidboot.* ในไฟล์ /proc/cmdline ให้ชี้ไปที่ไฟล์ /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 คล้ายกับที่สร้างบรรทัดคำสั่งเคอร์เนลจาก 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 ไบต์ parameters size
  • ขนาด 4 ไบต์ parameters checksum
  • สตริง Magic bootconfig ขนาด 12 ไบต์ (#BOOTCONFIG\n)

พารามิเตอร์มาจาก 2 แหล่งที่มา ได้แก่ พารามิเตอร์ที่ทราบในเวลาบิลด์ และพารามิเตอร์ที่ไม่ทราบในเวลาบิลด์ คุณต้องเพิ่มพารามิเตอร์ที่ไม่ทราบ

ระบบจะแพ็กพารามิเตอร์ที่ทราบในเวลาบิลด์ไว้ที่ส่วนท้ายของอิมเมจ vendor_boot ในส่วน bootconfig ขนาดของส่วนจะจัดเก็บไว้ (เป็นไบต์) ในช่อง vendor_bootconfig_size ของส่วนหัวของการบูตของผู้ให้บริการ

พารามิเตอร์ที่ไม่ทราบในเวลาบิลด์จะทราบเฉพาะในรันไทม์ใน Bootloader คุณต้องเพิ่มพารามิเตอร์เหล่านี้ที่ส่วนท้ายของส่วนพารามิเตอร์ bootconfig ก่อนที่จะใช้ส่วนท้าย bootconfig

หากต้องการเพิ่มพารามิเตอร์หลังจากใช้ส่วนท้าย bootconfig แล้ว ให้เขียนทับส่วนท้ายและใช้ส่วนท้ายอีกครั้ง

การใช้งานและการตรวจสอบทีละน้อย

ใช้ฟีเจอร์ bootconfig ทีละน้อยโดยทำตามกระบวนการที่ระบุไว้ในส่วนนี้ ปล่อยพารามิเตอร์บรรทัดคำสั่งเคอร์เนลไว้ตามเดิมขณะเพิ่มพารามิเตอร์ bootconfig

ขั้นตอนสำหรับการใช้งานทีละน้อยพร้อมการตรวจสอบมีดังนี้

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