OTA สำหรับอุปกรณ์ A/B ที่มีพาร์ติชันแบบไดนามิก

รองรับ Android 10 พาร์ติชันแบบไดนามิก ซึ่งเป็นการแบ่งพาร์ติชันพื้นที่ผู้ใช้ ระบบที่สร้าง ปรับขนาด และทำลายพาร์ติชันได้ในระหว่างการอัปเดตผ่านอากาศ (OTA)

หน้านี้อธิบายวิธีปรับขนาดพาร์ติชันแบบไดนามิกระหว่างการอัปเดตสำหรับอุปกรณ์ A/B ที่ เปิดตัวพร้อมการรองรับพาร์ติชันแบบไดนามิกสำหรับอุปกรณ์ที่ใช้ Android 9 และ ด้านล่าง

ฉากหลัง

มีพาร์ติชัน super 1 พาร์ติชันในอุปกรณ์ พาร์ติชันนี้ไม่มีส่วนต่อท้ายของสล็อต อุปกรณ์บล็อกจะต้องมีอยู่ ที่มีรายการ blk_device สำหรับ /misc ใน fstab เช่น หากไฟล์ fstab แสดงรายการดังนี้

/dev/block/bootdevice/by-name/misc    /misc    # Other fields

ต้องมีอุปกรณ์ที่บล็อกสำหรับ super อยู่ใน /dev/block/bootdevice/by-name/super แต่ พาร์ติชัน super ไม่จำเป็นต้องระบุไว้ในรายการ fstab ไฟล์

ในพาร์ติชัน super มีสล็อตข้อมูลเมตา 2 ช่อง โดยหมายเลข 0 และ 1 ซึ่งสอดคล้องกับสล็อต A/B สำหรับพาร์ติชัน ในหน้านี้ ช่องข้อมูลเมตาจะเรียกว่า Metadata S (แหล่งที่มา) และ Metadata T (เป้าหมาย) ในทำนองเดียวกัน พาร์ติชันจะเรียกว่า system_s vendor_t และอื่นๆ

ก่อนการอัปเกรด ข้อมูลเมตา S จะมีข้อมูลสำหรับ พาร์ติชันแบบไดนามิกที่ใช้อยู่ (โดยทั่วไปคือ system_s, vendor_s, product_s และอื่นๆ) ระบบจะอ่านส่วนขยายของพาร์ติชันเหล่านี้ระหว่างการอัปเดต จึงลบไม่ได้

พาร์ติชันเป็นของกลุ่มอัปเดต ดูรายละเอียดได้ในการใช้พาร์ติชันแบบไดนามิก

ตัวอย่างข้อมูลเมตาในอุปกรณ์มีดังนี้

  • ข้อมูลเมตา 0
    • กลุ่ม foo_a
      • พาร์ติชัน system_a
      • พาร์ติชัน product_services_a
      • พาร์ติชันอื่นๆ ที่อัปเดตโดย Foo
    • กลุ่ม bar_a
      • พาร์ติชัน vendor_a
      • พาร์ติชัน product_a
      • พาร์ติชันอื่นๆ ที่อัปเดตโดย Bar
    • กลุ่ม foo_b (ที่เหลือจากการอัปเกรดก่อนหน้า)
    • กลุ่ม bar_b (ที่เหลือจากการอัปเกรดก่อนหน้า)
  • ข้อมูลเมตา 1
    • กลุ่ม foo_a (เหลือจากการอัปเกรดครั้งก่อน)
    • กลุ่ม bar_a (เหลือจากการอัปเกรดครั้งก่อน)
    • กลุ่ม foo_b
      • พาร์ติชัน system_b
      • พาร์ติชัน product_services_b
      • พาร์ติชันอื่นๆ ที่อัปเดตโดย Foo
    • กลุ่ม bar_b
      • พาร์ติชัน vendor_b
      • พาร์ติชัน product_b
      • พาร์ติชันอื่นๆ ที่อัปเดตโดย Bar

คุณสามารถใช้เครื่องมือ lpdump (ซอร์สโค้ดในส่วน system/extras/partition_tools) เพื่อถ่ายโอนข้อมูลเมตา อุปกรณ์ของคุณ เช่น

lpdump --slot 0 /dev/block/bootdevice/by-name/super
lpdump --slot 1 /dev/block/bootdevice/by-name/super

อัปเดตขั้นตอน

  1. เริ่มต้นข้อมูลเมตาของพาร์ติชัน super
    1. โหลดขอบเขตสําหรับพาร์ติชันแบบไดนามิกของแหล่งที่มาจากข้อมูลเมตา โดย M คือข้อมูลเมตาที่โหลด
    2. นํากลุ่มเป้าหมายและพาร์ติชันออก (เช่น foo_t, bar_t) จาก M เพื่อให้ M มี เฉพาะพาร์ติชันและกลุ่มที่ลงท้ายด้วย _s
    3. เพิ่มกลุ่มเป้าหมายและพาร์ติชันตามช่อง dynamic_partition_metadata ในไฟล์ Manifest อัปเดต
      ดูขนาดของแต่ละพาร์ติชันได้ใน new_partition_info
    4. เขียน M ไปยัง T ข้อมูลเมตา
    5. แมปพาร์ติชันที่เพิ่มบนตัวแมปอุปกรณ์ว่าเขียนได้
  2. ใช้การอัปเดตในอุปกรณ์ที่บล็อก
    1. หากจำเป็น ให้แมปพาร์ติชันต้นทางในโปรแกรมแมปอุปกรณ์เป็นแบบอ่านอย่างเดียว ซึ่งจำเป็นสำหรับไซด์โหลดเนื่องจากซอร์ส ไม่ได้แมปพาร์ติชันก่อนการอัปเดต
    2. ใช้การอัปเดตเต็มรูปแบบหรือแบบเดลต้ากับอุปกรณ์ที่บล็อกทั้งหมดตามเป้า
    3. ใส่ค่าพาร์ติชันเพื่อเรียกใช้สคริปต์หลังการติดตั้ง แล้วถอดพาร์ติชันออก
  3. ยกเลิกการแมปพาร์ติชันเป้าหมาย

ก่อนและหลังการอัปเดต พร็อพเพอร์ตี้ระบบต่อไปนี้ควรมีค่าตามลำดับ

ro.boot.dynamic_partitions=true
ro.boot.dynamic_partitions_retrofit=true

เพิ่มกลุ่มและพาร์ติชันลงในไฟล์ Manifest ของการอัปเดต

เมื่อทำการอัปเดต OTA ในอุปกรณ์ A/B ที่มีพาร์ติชันแบบไดนามิก หรืออุปกรณ์ A/B ที่เพิ่มการรองรับพาร์ติชันแบบไดนามิก คุณจะต้องเพิ่มกลุ่มและพาร์ติชันลงในไฟล์ Manifest ของการอัปเดต ข้อมูลโค้ดด้านล่างแสดงข้อมูลเพิ่มเติมเกี่ยวกับไฟล์ Manifest การอัปเดตเพื่อรองรับพาร์ติชันแบบไดนามิก ดูเอกสารประกอบโดยละเอียดเกี่ยวกับแต่ละช่องได้ที่ update_metadata.proto

message DeltaArchiveManifest {
    optional DynamicPartitionMetadata dynamic_partition_metadata;
}

message DynamicPartitionMetadata {
    repeated DynamicPartitionGroup groups;
}

message DynamicPartitionGroup {
    required string name;
    optional uint64 size; // maximum size of group
    repeated string partition_names;
}