ใช้งาน 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 แตกต่างจากรูปแบบของ 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 เพื่อทำสิ่งต่อไปนี้

การใช้งาน

พาร์ทเนอร์ต้องเพิ่มการรองรับลงใน 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

แผนภาพเลย์เอาต์การจัดสรรหน่วยความจำของ bootconfig

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

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

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