ใช้งาน Bootconfig ใน Android 12

ใน Android 12 ฟีเจอร์ bootconfig จะแทนที่androidboot.*ตัวเลือก cmdline ของเคอร์เนลที่ใช้กับ Android 11 และต่ำกว่า ฟีเจอร์ bootconfig เป็นกลไกในการส่งรายละเอียดการกําหนดค่าจากบิลด์และบูตโหลดเดอร์ไปยัง Android 12

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

ทั้งเคอร์เนลและพื้นที่ผู้ใช้ Android ต้องรองรับ bootconfig

  • รุ่นแรกที่รองรับนี้: Android 12
  • เวอร์ชันเคอร์เนลแรกที่รองรับเคอร์เนล 12-5.4.xx

ใช้ฟีเจอร์ Bootconfig สำหรับอุปกรณ์ใหม่ที่เปิดตัวด้วย 12-5.10.xx เวอร์ชันเคอร์เนล โดยไม่จำเป็นต้องใช้หากอัปเกรดอุปกรณ์

ตัวอย่างและแหล่งที่มา

ขณะที่คุณดูตัวอย่างและซอร์สโค้ดในส่วนนี้ โปรดทราบว่ารูปแบบ ของโค้ด bootconfig แตกต่างจากรูปแบบของ kernel cmdline ที่ใช้ใน Android 11 และต่ำกว่า อย่างไรก็ตาม ความแตกต่างต่อไปนี้มีความสำคัญต่อการใช้งานของคุณ

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

ตัวอย่าง Bootloader

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

ตัวอย่างการสร้าง

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

การใช้งาน

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

หากคุณมีการเปลี่ยนแปลงที่ค้นหาไฟล์ /proc/cmdline สำหรับ androidboot.* ให้ชี้ไปยังไฟล์ /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

Bootloader ตั้งค่า initramfs ก่อนข้ามไปยังเคอร์เนล เคอร์เนล การกำหนดค่าการเปิดเครื่อง ค้นหาส่วน Bootconfig และดูว่าอยู่ตรงท้ายสุดของ initramfs, กับตัวอย่างที่คาดไว้

บูตโหลดเดอร์จะได้รับข้อมูลเลย์เอาต์ vendor_boot.img จากส่วนหัวของภาพบูตของผู้ให้บริการ

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

รูปที่ 1 การจัดสรรหน่วยความจำ Bootconfig ของ Android 12

บูตโหลดเดอร์จะสร้างส่วน 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. ทําการเปลี่ยนแปลงในบูตโหลดเดอร์และบิลด์ จากนั้นทําดังนี้
    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 การสนับสนุน หากดาวน์เกรดเป็นเวอร์ชันก่อนหน้านั้น คุณต้องใช้พารามิเตอร์ cmdline ของเคอร์เนลแทน bootconfig

Kernel เวอร์ชัน 12-5.4 ขึ้นไปรองรับ Bootconfig หากจะดาวน์เกรดเป็นเวอร์ชันก่อนหน้า (รวมถึง 11-5.4) ต้องใช้พารามิเตอร์ cmdline ของเคอร์เนล

การอัปเกรดจาก Android 11 และเวอร์ชันที่ต่ำกว่าเป็น Android 12 ขึ้นไปจะใช้พารามิเตอร์ 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