ในอุปกรณ์ที่ไม่ใช่ A/B รูปภาพการกู้คืนควรมีข้อมูลจาก Device Tree Blob (DTB) หรือ Advanced Configuration and Power Interface (ACPI) ที่ซ้อนทับ เมื่ออุปกรณ์ดังกล่าว บูตเข้าสู่การกู้คืน Bootloader จะโหลดรูปภาพซ้อนทับที่ เข้ากันได้กับรูปภาพการกู้คืน อุปกรณ์ที่รองรับการอัปเดต A/B (ราบรื่น)ควรใช้การกู้คืนเป็นบูตแทน พาร์ติชันการกู้คืนแยกต่างหาก (ดูรายละเอียดได้ที่การใช้การอัปเดต A/B)
ตัวเลือกในการรวม DTBO/ACPIO การกู้คืนเป็นส่วนหนึ่งของอิมเมจการบูต/การกู้คืน จะแตกต่างกันไปในแต่ละรุ่นของ Android
รุ่น | รูปแบบการอัปเดต | การปฏิบัติตามข้อกำหนดของ GKI | เวอร์ชันส่วนหัวของการบูต (อุปกรณ์ที่เปิดตัว) | เวอร์ชันส่วนหัวของการบูต (การอัปเกรดอุปกรณ์) | ต้องมีอิมเมจการกู้คืนเฉพาะ |
---|---|---|---|---|---|
11 | A/B, Virtual A/B |
ใช่ | 3* | ไม่มี | ไม่ |
A/B, Virtual A/B |
ไม่ | 2, 3 | 0, 1, 2, 3 | ไม่ | |
non-A/B | ใช่ | 3 | ไม่มี | ใช่ | |
non-A/B | ไม่ | 2, 3 | 0, 1, 2, 3 | ใช่ | |
10 (Q) | A/B | ไม่มี | 2 | 0, 1, 2 | ไม่ |
non-A/B | ไม่มี | 2 | 0, 1, 2 | ใช่ | |
9 (P) | A/B | ไม่มี | 1 | 0, 1 | ไม่ |
non-A/B | ไม่มี | 1 | 0, 1 | ใช่ | |
8 (O) | A/B | ไม่มี | N/A (ถือเป็น 0) | N/A (ถือเป็น 0) | ไม่ |
non-A/B | ไม่มี | N/A (ถือเป็น 0) | N/A (ถือเป็น 0) | ใช่ |
* อุปกรณ์ A/B ที่ใช้ Android 11 ขึ้นไปและใช้ Generic Kernel Image (GKI) ต้องใช้ เวอร์ชันส่วนหัวของการบูตหลัก 3 เพื่อให้ เข้ากันได้กับพาร์ติชันการบูตของผู้ให้บริการ
ประเด็นสำคัญ
อุปกรณ์ A/B ไม่จำเป็นต้องระบุรูปภาพการกู้คืนเนื่องจากการอัปเดต A/B ใช้พาร์ติชัน 2 ชุด (รวมถึง
boot
และdtbo
) และสลับไปมาระหว่างการอัปเดต จึงไม่จำเป็นต้องใช้รูปภาพการกู้คืน อุปกรณ์ A/B ยังคงใช้รูปภาพการกู้คืนเฉพาะได้อุปกรณ์ที่ไม่ใช่ A/B ที่เปิดตัวด้วย Android 11 ขึ้นไป และใช้ส่วนหัวของบูตเวอร์ชัน 3 ต้องระบุส่วนหัวของบูต เวอร์ชัน 2 สำหรับรูปภาพการกู้คืนแยกกันอย่างชัดเจน เช่น
BOARD_RECOVERY_MKBOOTIMG_ARGS := --header_version 2
สำหรับสถาปัตยกรรมที่ไม่รองรับ Device Tree อิมเมจการกู้คืนจะ รวมอิมเมจ ACPIO แทนอิมเมจ DTBO ได้
เกี่ยวกับความล้มเหลวของ OTA และรูปภาพการกู้คืน
อิมเมจการกู้คืน ควรมีข้อมูลครบถ้วนและไม่ขึ้นอยู่กับอิมเมจอื่นๆ เพื่อป้องกันไม่ให้การอัปเดตผ่านอากาศ (OTA) ล้มเหลวในอุปกรณ์ที่ไม่ใช่ A/B ในระหว่างการอัปเดต OTA หากเกิดปัญหาหลังจากอัปเดตรูปภาพซ้อนทับแล้ว (แต่ก่อนที่จะ อัปเดตทั้งหมดเสร็จสมบูรณ์) อุปกรณ์จะพยายามบูตเข้าสู่โหมดการกู้คืนเพื่อ อัปเดต OTA ให้เสร็จสมบูรณ์ อย่างไรก็ตาม เนื่องจากมีการอัปเดตพาร์ติชันซ้อนทับแล้ว จึงอาจเกิดความไม่ตรงกันกับรูปภาพการกู้คืน (ซึ่งยังไม่ได้อัปเดต)
หากต้องการป้องกันไม่ให้การกู้คืนขึ้นอยู่กับพาร์ติชัน DTBO/ACPIO ระหว่างการ อัปเดต อุปกรณ์ที่ไม่ใช่ A/B ที่ใช้ Android 9 ขึ้นไป จะระบุรูปภาพ DTBO/ACPIO ของการกู้คืนที่มีข้อมูลจากรูปภาพ การซ้อนทับเป็นส่วนแยกต่างหากในรูปแบบรูปภาพการบูตได้ (ต้องใช้ส่วนหัวการบูต เวอร์ชัน 1 หรือ 2)
การเปลี่ยนแปลงอิมเมจบูต
หากต้องการอนุญาตให้รูปภาพการกู้คืนมี DTBO หรือ ACPIO การกู้คืนในอุปกรณ์ที่ไม่ใช่ A/B ที่ใช้ Android 9 ขึ้นไป ให้อัปเดตโครงสร้างรูปภาพการบูต ดังนี้
ส่วนอิมเมจบูต | จำนวนหน้า |
---|---|
ส่วนหัวของการบูต (1 หน้า) | 1 |
เคอร์เนล (l หน้า) | l = (kernel_size + page_size -
1) / page_size |
Ramdisk (m หน้า) | m = (ramdisk_size + page_size -
1) / page_size |
Bootloader ระยะที่ 2 (n หน้า) | n = (second_size + page_size -
1) / page_size |
DTBO หรือ ACPIO (ในหน้าเว็บ) ของการกู้คืน | o = (recovery_[dtbo|acpio]_size + page_size -
1) / page_size |
ดูรายละเอียดเกี่ยวกับmkbootimg
อาร์กิวเมนต์ของเครื่องมือสำหรับการระบุเวอร์ชันส่วนหัวของรูปภาพสำหรับบูตและเส้นทางของรูปภาพซ้อนทับได้ที่การกำหนดเวอร์ชันส่วนหัวของรูปภาพสำหรับบูต
ใช้ DTBO
อุปกรณ์ที่ไม่ใช่ A/B ที่ใช้ Android 9 ขึ้นไปจะสามารถป้อนข้อมูลในส่วน
recovery_dtbo
ของอิมเมจการกู้คืนได้ หากต้องการรวมรูปภาพ recovery_dtbo
ไว้ใน recovery.img
ในอุปกรณ์ BoardConfig.mk
ให้ทำดังนี้
ตั้งค่า
BOARD_INCLUDE_RECOVERY_DTBO
เป็นtrue
BOARD_INCLUDE_RECOVERY_DTBO := true
ขยายตัวแปร
BOARD_MKBOOTIMG_ARGS
เพื่อระบุส่วนหัวของรูปภาพการบูต เวอร์ชัน:BOARD_MKBOOTIMG_ARGS := --ramdisk_offset $(BOARD_RAMDISK_OFFSET) --tags_offset $(BOARD_KERNEL_TAGS_OFFSET) --header_version $(BOARD_BOOTIMG_HEADER_VERSION)
ตรวจสอบว่าได้ตั้งค่าตัวแปร
BOARD_PREBUILT_DTBOIMAGE
เป็นเส้นทางของรูปภาพ DTBO ระบบบิลด์ของ Android ใช้ตัวแปรเพื่อตั้งค่าอาร์กิวเมนต์recovery_dtbo
ของเครื่องมือmkbootimg
ในระหว่างการสร้างอิมเมจ การกู้คืน
หากตั้งค่าตัวแปร BOARD_INCLUDE_RECOVERY_DTBO
, BOARD_MKBOOTIMG_ARGS
และ BOARD_PREBUILT_DTBOIMAGE
อย่างถูกต้อง ระบบบิลด์ Android จะรวม DTBO ที่ระบุโดยตัวแปร BOARD_PREBUILT_DTBOIMAGE
ไว้ใน recovery.img
ใช้ ACPIO
อุปกรณ์ที่ไม่ใช่ A/B ที่ใช้ Android 9 ขึ้นไปสามารถใช้
รูปภาพซ้อนทับ ACPIO (แทนรูปภาพ DTBO) และสามารถป้อนข้อมูลในส่วน
recovery_acpio
(แทนส่วน recovery_dtbo
) ของ
อิมเมจการกู้คืน หากต้องการใส่recovery_acpio
รูปภาพในrecovery.img
ให้ทำดังนี้ใน
อุปกรณ์ BoardConfig.mk
ตั้งค่า
BOARD_INCLUDE_RECOVERY_ACPIO
เป็นtrue
BOARD_INCLUDE_RECOVERY_ACPIO := true
ขยายตัวแปร
BOARD_MKBOOTIMG_ARGS
เพื่อระบุส่วนหัวของรูปภาพการบูต เวอร์ชัน ตัวแปรต้องมากกว่าหรือเท่ากับ 1 เพื่อรองรับการกู้คืน ACPIOBOARD_MKBOOTIMG_ARGS += --header_version $(BOARD_BOOTIMG_HEADER_VERSION)
ตรวจสอบว่าได้ตั้งค่าตัวแปร
BOARD_RECOVERY_ACPIO
เป็นเส้นทางของรูปภาพ ACPIO ระบบบิลด์ Android ใช้ตัวแปรเพื่อตั้งค่าอาร์กิวเมนต์recovery_acpio
ของเครื่องมือmkbootimg
ในระหว่างการสร้างอิมเมจการกู้คืน
หากตั้งค่าตัวแปร BOARD_INCLUDE_RECOVERY_ACPIO
, BOARD_MKBOOTIMG_ARGS
และ BOARD_RECOVERY_ACPIO
อย่างถูกต้อง ระบบบิลด์ Android จะรวม ACPIO ที่ระบุโดยตัวแปร BOARD_RECOVERY_ACPIO
ไว้ใน recovery.img