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

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

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

พื้นหลัง

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

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

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

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

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

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

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

  • ข้อมูลเมตา 0
    • กลุ่ม foo_a
      • system_a พาร์ติชัน_a
      • พาร์ติชัน product_services_a
      • พาร์ติชั่นอื่น ๆ อัพเดตโดย Foo
    • กลุ่ม bar_a
      • vendor_a จำหน่ายพาร์ติชัน_a
      • product_a พาร์ติชัน_a
      • พาร์ติชั่นอื่น ๆ อัพเดตโดย Bar
    • กลุ่ม foo_b (ที่เหลือจากการอัปเกรดครั้งก่อน)
    • กลุ่ม bar_b (ที่เหลือจากการอัปเกรดครั้งก่อน)
  • ข้อมูลเมตา 1
    • กลุ่ม foo_a (ที่เหลือจากการอัปเกรดครั้งก่อน)
    • กลุ่ม bar_a (ที่เหลือจากการอัปเกรดครั้งก่อน)
    • กลุ่ม foo_b
      • system_b พาร์ติชัน_b
      • พาร์ติชัน product_services_b
      • พาร์ติชั่นอื่น ๆ อัพเดตโดย Foo
    • กลุ่ม bar_b
      • vendor_b จำหน่ายพาร์ติชัน_b
      • product_b พาร์ติชัน_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. โหลดขอบเขตสำหรับพาร์ติชันไดนามิกต้นทางจาก Metadata S โดยให้ M เป็นข้อมูลเมตาที่โหลด
    2. ลบกลุ่มเป้าหมายและพาร์ติชัน (เช่น foo_t , bar_t ) ออกจาก M เพื่อให้ M มีเฉพาะพาร์ติชันและกลุ่มที่มีส่วนต่อท้าย _s
    3. เพิ่มกลุ่มเป้าหมายและพาร์ติชันตามฟิลด์ dynamic_partition_metadata ในรายการอัพเดต
      ขนาดของแต่ละพาร์ติชันสามารถพบได้ใน new_partition_info
    4. เขียน M ถึง Metadata T
    5. แมปพาร์ติชั่นที่เพิ่มเข้ามาบนตัวทำแผนที่อุปกรณ์ว่าสามารถเขียนได้
  2. ใช้การอัปเดตบนอุปกรณ์บล็อก
    1. หากจำเป็น ให้แมปพาร์ติชั่นต้นทางบนตัวทำแผนที่อุปกรณ์เป็นแบบอ่านอย่างเดียว นี่เป็นสิ่งจำเป็นสำหรับไซด์โหลดเนื่องจากพาร์ติชันต้นทางไม่ได้ถูกแมปก่อนการอัปเดต
    2. ใช้การอัปเดตแบบเต็มหรือเดลต้ากับอุปกรณ์บล็อกทั้งหมดที่ช่องเป้าหมาย
    3. ติดตั้งพาร์ติชันเพื่อรันสคริปต์หลังการติดตั้ง จากนั้นยกเลิกการต่อเชื่อมพาร์ติชัน
  3. ยกเลิกการแมปพาร์ติชันเป้าหมาย

ก่อนและหลังการอัพเดต คุณสมบัติระบบต่อไปนี้ควรมีค่าตามลำดับ:

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

เพิ่มกลุ่มและพาร์ติชั่นลงในรายการอัพเดต

เมื่อดำเนินการอัพเดต OTA บนอุปกรณ์ A/B ที่มีพาร์ติชั่นไดนามิก หรืออุปกรณ์ A/B ที่เพิ่มการรองรับพาร์ติชั่นไดนามิก คุณจะต้องเพิ่มกลุ่มและพาร์ติชั่นลงในรายการอัพเดท ตัวอย่างด้านล่างแสดงข้อมูลเพิ่มเติมเกี่ยวกับรายการอัปเดตเพื่อรองรับพาร์ติชันแบบไดนามิก ดู 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;
}