การกู้คืนรูปภาพ

บนอุปกรณ์ที่ไม่ใช่ A/B อิมเมจการกู้คืนควรมีข้อมูลจาก อิมเมจโอเวอร์เลย์แผนผังอุปกรณ์ (DTB) หรือ Advanced Configuration and Power Interface (ACPI) เมื่ออุปกรณ์ดังกล่าวบู๊ตเข้าสู่การกู้คืน บูตโหลดเดอร์จะสามารถโหลดอิมเมจโอเวอร์เลย์ที่เข้ากันได้กับอิมเมจการกู้คืน อุปกรณ์ที่รองรับ การอัปเดต A/B (ไร้รอยต่อ) ควรใช้การกู้คืนขณะบู๊ตแทนพาร์ติชั่นการกู้คืนแยกต่างหาก (สำหรับรายละเอียด โปรดดูที่ การใช้การอัปเดต A/B )

ตัวเลือกสำหรับการรวมการกู้คืน DTBO/ACPIO เป็นส่วนหนึ่งของอิมเมจสำหรับบูต/การกู้คืนจะแตกต่างกันไปใน Android รุ่นต่างๆ

ปล่อย อัปเดตโครงร่าง การปฏิบัติตาม GKI เวอร์ชันส่วนหัวการบูต (อุปกรณ์เปิดตัว) เวอร์ชันส่วนหัวการบูต (อัปเกรดอุปกรณ์) จำเป็นต้องมีอิมเมจการกู้คืนเฉพาะ
11 เอ/บี,
A/B เสมือน
ใช่ 3 * ไม่มี เลขที่
เอ/บี,
A/B เสมือน
เลขที่ 2, 3 0, 1, 2, 3 เลขที่
ไม่ใช่ A/B ใช่ 3 ไม่มี ใช่
ไม่ใช่ A/B เลขที่ 2, 3 0, 1, 2, 3 ใช่
10 (ถาม) เอ/บี ไม่มี 2 0, 1, 2 เลขที่
ไม่ใช่ A/B ไม่มี 2 0, 1, 2 ใช่
9 (ป) เอ/บี ไม่มี 1 0, 1 เลขที่
ไม่ใช่ A/B ไม่มี 1 0, 1 ใช่
8 (โอ) เอ/บี ไม่มี ไม่มี (ถือว่า 0) ไม่มี (ถือว่า 0) เลขที่
ไม่ใช่ A/B ไม่มี ไม่มี (ถือว่า 0) ไม่มี (ถือว่า 0) ใช่

* อุปกรณ์ A/B ที่ใช้ Android 11 หรือสูงกว่าและใช้ Generic Kernel Image (GKI) ต้องใช้ ส่วนหัวการบูตหลักเวอร์ชัน 3 เพื่อให้เข้ากันได้กับ พาร์ติชันสำหรับเริ่มระบบของผู้จำหน่าย

ประเด็นสำคัญ:

  • อุปกรณ์ A/B ไม่จำเป็นต้องระบุอิมเมจการกู้คืนเนื่องจากการอัพเดต A/B ใช้พาร์ติชั่นสองชุด (รวมถึง boot และ dtbo ) และสลับระหว่างพาร์ติชั่นเหล่านั้นในระหว่างการอัพเดต ทำให้ไม่จำเป็นต้องใช้อิมเมจการกู้คืน หากต้องการ อุปกรณ์ A/B ยังคงสามารถใช้อิมเมจการกู้คืนเฉพาะได้

  • อุปกรณ์ที่ไม่ใช่ A/B ที่เปิดตัวด้วย Android 11 หรือสูงกว่าและใช้ส่วนหัวสำหรับบูตเวอร์ชัน 3 จะต้องระบุ เวอร์ชันส่วนหัวสำหรับบูตเป็น 2 อย่างชัดเจนสำหรับอิมเมจการกู้คืนแยกกัน ตัวอย่างเช่น:

    BOARD_RECOVERY_MKBOOTIMG_ARGS := --header_version 2
    
  • สำหรับสถาปัตยกรรมที่ไม่รองรับโครงสร้างอุปกรณ์ อิมเมจการกู้คืนสามารถรวมอิมเมจ ACPIO แทนอิมเมจ DTBO

เกี่ยวกับความล้มเหลวของ OTA และอิมเมจการกู้คืน

เพื่อป้องกันความล้มเหลวแบบ over-the-air (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 หน้า) ม. = ( ramdisk_size + page_size - 1) / page_size
bootloader ขั้นที่สอง (n หน้า) n = ( second_size + page_size - 1) / page_size
การกู้คืน DTBO หรือ ACPIO (o หน้า) o = ( recovery_[dtbo|acpio]_size + page_size - 1) / page_size

สำหรับรายละเอียดเกี่ยวกับอาร์กิวเมนต์ของเครื่องมือ mkbootimg สำหรับการระบุเวอร์ชันของส่วนหัวของอิมเมจสำหรับบูตและพาธของอิมเมจโอเวอร์เลย์ โปรดดูที่ การกำหนดเวอร์ชันของส่วนหัวของอิมเมจสำหรับบูต

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

อุปกรณ์ที่ไม่ใช่ A/B ที่ใช้เวอร์ชัน 9 ขึ้นไปสามารถเติมส่วน recovery_dtbo ของอิมเมจการกู้คืนได้ หากต้องการรวมอิมเมจ recovery_dtbo ใน recovery.img ในอุปกรณ์ BoardConfig.mk :

  • ตั้งค่า config 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 build จะรวม DTBO ที่ระบุโดยตัวแปร BOARD_PREBUILT_DTBOIMAGE ใน recovery.img

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

อุปกรณ์ที่ไม่ใช่ A/B ที่ใช้ Android 9 ขึ้นไปสามารถใช้อิมเมจซ้อนทับ ACPIO (แทนอิมเมจ DTBO) และสามารถเติมข้อมูลส่วน recovery_acpio (แทนส่วน recovery_dtbo ) ของอิมเมจการกู้คืนได้ หากต้องการรวมอิมเมจ recovery_acpio ใน recovery.img ในอุปกรณ์ BoardConfig.mk :

  • ตั้งค่า config BOARD_INCLUDE_RECOVERY_ACPIO เป็น true :

    BOARD_INCLUDE_RECOVERY_ACPIO := true
    
  • ขยายตัวแปร BOARD_MKBOOTIMG_ARGS เพื่อระบุเวอร์ชันส่วนหัวของอิมเมจสำหรับบูต ตัวแปรต้องมากกว่าหรือเท่ากับ 1 เพื่อรองรับการกู้คืน ACPIO

    BOARD_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 build จะรวม ACPIO ที่ระบุโดยตัวแปร BOARD_RECOVERY_ACPIO ใน recovery.img