การนำ Bootconfig ไปใช้ใน Android 12

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

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

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

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

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

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

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

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

ตัวอย่าง Bootloader

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

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

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

การดำเนินการ

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

หากคุณมีการเปลี่ยนแปลงที่ค้นหา proc / / cmdline ไฟล์ androidboot.* พารามิเตอร์ชี้ไปยังไฟล์ / proc / bootconfig แทน ro.boot.* คุณสมบัติถูกกำหนดด้วยใหม่ bootconfig ค่าเพื่อให้คุณไม่จำเป็นต้องมีการเปลี่ยนแปลงทำให้รหัสโดยใช้คุณสมบัติเหล่านั้น

สร้างการเปลี่ยนแปลง

ขั้นแรก ให้ uprev เวอร์ชันส่วนหัวสำหรับบูตของคุณเป็นเวอร์ชัน 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, กับรถพ่วงที่คาดว่า

bootloader ได้รับ vendor_boot.img ข้อมูลรูปแบบจากส่วนหัวของภาพบูตผู้ขาย

Diagram of bootconfig memory allocation layout

รูปที่ 1 Android จัดสรรหน่วยความจำ 12 bootconfig

bootloader สร้างส่วน bootconfig ในหน่วยความจำ ส่วน bootconfig ประกอบด้วยการจัดสรรหน่วยความจำสำหรับสิ่งต่อไปนี้:

  • พารามิเตอร์
  • B 4 ขนาด parameters size
  • 4 B ขนาด parameters checksum
  • 12 B สตริง bootconfig มายากล ( #BOOTCONFIG\n )

พารามิเตอร์มาจากสองแหล่ง: พารามิเตอร์ที่รู้จักในเวลาสร้าง และพารามิเตอร์ที่ไม่รู้จักในเวลาสร้าง ต้องเพิ่มพารามิเตอร์ที่ไม่รู้จัก

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

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

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

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

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

นี่คือขั้นตอนสำหรับการใช้งานที่เพิ่มขึ้นโดยมีการตรวจสอบความถูกต้อง:

  1. ทำให้ bootloader และสร้างการเปลี่ยนแปลงแล้วทำต่อไปนี้:
    1. ใช้ BOARD_BOOTCONFIG ตัวแปรเพิ่มพารามิเตอร์ bootconfig ใหม่
    2. รักษาพารามิเตอร์ cmdline ของเคอร์เนลตามที่เป็นอยู่ เพื่อให้อุปกรณ์สามารถบู๊ตได้อย่างถูกต้อง ทำให้การดีบักและการตรวจสอบทำได้ง่ายขึ้นมาก
  2. ตรวจสอบการทำงานของคุณโดยการตรวจสอบเนื้อหาของ /proc/bootconfig ตรวจสอบว่าคุณเห็นพารามิเตอร์ที่เพิ่มใหม่หลังจากที่อุปกรณ์บูตแล้ว
  3. ย้าย androidboot.* พารามิเตอร์จาก cmdline เคอร์เนลจะ bootconfig ใช้ BOARD_BOOTCONFIG ตัวแปรและบูต
  4. ตรวจสอบว่าแต่ละพารามิเตอร์ที่มีอยู่ใน /proc/bootconfig และว่าพวกเขาจะไม่ได้อยู่ใน /proc/cmdline หากคุณสามารถยืนยันได้ แสดงว่าการใช้งานของคุณสำเร็จ

ข้อควรพิจารณาในการอัพเกรดและดาวน์เกรด OTA

เมื่อคุณจัดการการอัปเกรด OTA และดาวน์เกรดระหว่าง Android เวอร์ชันต่างๆ หรือเวอร์ชันเคอร์เนลต่างๆ ควรใช้ความระมัดระวังเป็นพิเศษ

Android 12 เป็นเวอร์ชันแรกที่รองรับ bootconfig หากดาวน์เกรดเป็นเวอร์ชันก่อนหน้านั้น ต้องใช้พารามิเตอร์เคอร์เนล cmdline แทน bootconfig

เคอร์เนลเวอร์ชัน 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