อิมเมจการกู้คืน

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

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

รุ่น อัปเดตรูปแบบ การปฏิบัติตามข้อกำหนดของ GKI เวอร์ชันส่วนหัวของบูต (อุปกรณ์ที่เปิดใช้งาน) เวอร์ชันส่วนหัวเปิดเครื่อง (การอัปเกรดอุปกรณ์) ต้องมีอิมเมจการกู้คืนเฉพาะ
11 A/B,
A/B เสมือนจริง
ใช่ 3* ไม่มี ไม่
A/B,
A/B เสมือนจริง
ไม่ 2, 3 0, 1, 2, 3 ไม่
ไม่ใช่ A/B ใช่ 3 ไม่มี ใช่
ไม่ใช่ A/B ไม่ 2, 3 0, 1, 2, 3 ใช่
10 (Q) อัลฟา/เบต้า ไม่มี 2 0, 1, 2 ไม่
ไม่ใช่ A/B ไม่มี 2 0, 1, 2 ใช่
9 (P) A/B ไม่มี 1 0, 1 ไม่
ไม่ใช่ A/B ไม่มี 1 0, 1 ใช่
8 (โอ) A/B ไม่มี ไม่มี (ถือว่า 0) ไม่มี (ถือว่า 0) ไม่
ไม่ใช่ A/B ไม่มี ไม่มี (ถือว่า 0) ไม่มี (ถือว่า 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 ให้เสร็จสมบูรณ์ อย่างไรก็ตาม เนื่องจากพาร์ติชันการวางซ้อนได้รับการอัปเดตแล้ว จึงอาจเกิดความไม่ตรงกันกับรูปภาพการกู้คืน (ซึ่งยังไม่ได้อัปเดต)

อุปกรณ์ที่ไม่ใช่ A/B ที่ใช้ Android 9 ขึ้นไปสามารถระบุอิมเมจ DTBO/ACPIO สำหรับการกู้คืนที่มีข้อมูลจากรูปภาพซ้อนทับเป็นส่วนแยกต่างหากในรูปแบบอิมเมจการเปิดเครื่อง (ต้องใช้ส่วนหัวการเปิดเครื่อง 1 หรือ 2) เพื่อไม่ให้การกู้คืนขึ้นอยู่กับพาร์ติชัน DTBO/ACPIO ในระหว่างการอัปเดต

การเปลี่ยนแปลงอิมเมจการเปิดเครื่อง

หากต้องการให้อิมเมจการกู้คืนมี 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
บูตโหลดเดอร์ระยะที่ 2 (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 ที่ใช้ 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 เพื่อรองรับการกู้คืน 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 จะรวม ACPIO ที่ระบุโดยตัวแปร BOARD_RECOVERY_ACPIO ใน recovery.img