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

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

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

พื้นหลัง

ในระหว่างการอัปเดตอุปกรณ์ A/B เพื่อรองรับพาร์ติชันแบบไดนามิก ตารางพาร์ติชัน GUID (GPT) บนอุปกรณ์จะยังคงอยู่ ดังนั้นจึงไม่มีพาร์ติชัน super บนอุปกรณ์ ข้อมูลเมตาถูกเก็บไว้ที่ system_a และ system_b แต่สามารถปรับแต่งได้โดยการเปลี่ยน BOARD_SUPER_PARTITION_METADATA_DEVICE

ในแต่ละอุปกรณ์บล็อกจะมีช่องข้อมูลเมตาสองช่อง มีการใช้ช่องข้อมูลเมตาเพียงช่องเดียวในแต่ละอุปกรณ์บล็อก ตัวอย่างเช่น ข้อมูลเมตา 0 ที่ system_a และข้อมูลเมตา 1 ที่ system_b สอดคล้องกับพาร์ติชันที่สล็อต A และ B ตามลำดับ ณ รันไทม์ ไม่สำคัญว่าช่องใดจะถูกอัปเดต

ในหน้านี้ ช่องข้อมูลเมตาเรียกว่า Metadata S (แหล่งที่มา) และ Metadata T (เป้าหมาย) ในทำนองเดียวกัน พาร์ติชันถูกอ้างถึงเป็น system_s , vendor_t และอื่นๆ

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับ การกำหนดค่าระบบ build โปรดดูที่ การอัพเกรดอุปกรณ์

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

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

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

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

lpdump --slot 0 /dev/block/by-name/system_a
lpdump --slot 1 /dev/block/by-name/system_b

ติดตั้งการอัปเดตเพิ่มเติม

บนอุปกรณ์ที่ใช้ Android 9 และต่ำกว่า ไคลเอนต์ OTA บนอุปกรณ์ไม่รองรับการแมปพาร์ติชันแบบไดนามิกก่อนการอัปเดต ชุดแพตช์เพิ่มเติมถูกสร้างขึ้นเพื่อให้สามารถใช้การแมปกับฟิสิคัลพาร์ติชันที่มีอยู่ได้โดยตรง

ตัวสร้าง OTA จะสร้างไฟล์ super.img สุดท้ายที่มีเนื้อหาของพาร์ติชั่นไดนามิกทั้งหมด จากนั้นแยกรูปภาพออกเป็นหลายอิมเมจที่ตรงกับขนาดของอุปกรณ์บล็อกทางกายภาพที่สอดคล้องกับระบบ ผู้จำหน่าย และอื่นๆ อิมเมจเหล่านี้มีชื่อว่า super_system.img , super_vendor.img และอื่นๆ ไคลเอ็นต์ OTA จะใช้อิมเมจเหล่านี้กับฟิสิคัลพาร์ติชัน แทนที่จะใช้อิมเมจสำหรับพาร์ติชันโลจิคัล (ไดนามิก)

เนื่องจากไคลเอ็นต์ OTA ไม่ทราบวิธีการแมปพาร์ติชันแบบไดนามิก ขั้นตอนหลังการติดตั้งทั้งหมดจึงถูกปิดใช้งานโดยอัตโนมัติสำหรับพาร์ติชันเหล่านี้เมื่อมีการสร้างแพ็คเกจการอัปเดต ดู การกำหนดค่าหลังการติดตั้ง สำหรับรายละเอียดเพิ่มเติม

ขั้นตอนการอัปเดตจะเหมือนกับใน Android 9

ก่อนการอัพเดต:

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

หลังการอัปเดต:

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

การอัปเดตในอนาคตหลังการติดตั้งเพิ่มเติม

หลังจากการอัพเดตชุดติดตั้งเพิ่มเติม ไคลเอนต์ OTA จะได้รับการอัปเดตให้ทำงานกับพาร์ติชันไดนามิก ขอบเขตสำหรับพาร์ติชันต้นทางจะไม่ขยายข้ามฟิสิคัลพาร์ติชันเป้าหมาย

อัปเดตโฟลว์โดยใช้แพ็คเกจอัปเดตปกติ

  1. เริ่มต้นข้อมูลเมตาของพาร์ super ชันซุปเปอร์
    1. สร้างข้อมูลเมตา M ใหม่จาก Metadata S (ข้อมูลเมตาต้นทาง) ตัวอย่างเช่น หาก Metadata S ใช้ [ system_s , vendor_s , product_s ] เป็นอุปกรณ์บล็อก ดังนั้น metadata ใหม่ M จะใช้ [ system_t , vendor_t , product_t ] เป็นอุปกรณ์บล็อก กลุ่มและพาร์ติชันทั้งหมดจะถูกละทิ้งใน M
    2. เพิ่มกลุ่มเป้าหมายและพาร์ติชันตามฟิลด์ dynamic_partition_metadata ในรายการอัพเดต ขนาดของแต่ละพาร์ติชันสามารถพบได้ใน new_partition_info
    3. เขียน M ถึง Metadata T
    4. แมปพาร์ติชั่นที่เพิ่มเข้ามาบนตัวทำแผนที่อุปกรณ์ว่าสามารถเขียนได้
  2. ใช้การอัปเดตบนอุปกรณ์บล็อก
    1. หากจำเป็น ให้แมปพาร์ติชั่นต้นทางบนตัวทำแผนที่อุปกรณ์เป็นแบบอ่านอย่างเดียว นี่เป็นสิ่งจำเป็นสำหรับไซด์โหลดเนื่องจากพาร์ติชันต้นทางไม่ได้ถูกแมปก่อนการอัปเดต
    2. ใช้การอัปเดตแบบเต็มหรือเดลต้ากับอุปกรณ์บล็อกทั้งหมดที่ช่องเป้าหมาย
    3. ติดตั้งพาร์ติชันเพื่อรันสคริปต์หลังการติดตั้ง จากนั้นยกเลิกการต่อเชื่อมพาร์ติชัน
  3. ยกเลิกการแมปพาร์ติชันเป้าหมาย

อัปเดตโฟลว์โดยใช้แพ็คเกจอัปเดตชุดติดตั้งเพิ่มเติม

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

ตัวอย่างเช่น สมมติสิ่งต่อไปนี้:

  • ช่อง A เป็นช่องที่ใช้งานอยู่
  • system_a มีข้อมูลเมตาที่ใช้งานอยู่ที่ช่อง 0
  • system_a , vendor_a และ product_a ถูกใช้เป็นอุปกรณ์บล็อก

เมื่อไคลเอ็นต์ OTA ได้รับแพ็คเกจการอัปเดตชุดติดตั้งเพิ่มเติม จะใช้ super_system.img บนฟิสิคัล system_b , super_vendor.img บนฟิสิคัล vendor_b และ super_product.img บนฟิสิคัล product_b อุปกรณ์บล็อกฟิสิคัล system_b มีข้อมูลเมตาที่ถูกต้องเพื่อแมปโลจิคัล system_b , vendor_b และ product_b ในเวลาบูต

สร้างแพ็คเกจการอัพเดต

OTA ที่เพิ่มขึ้น

เมื่อสร้าง OTA ส่วนเพิ่มสำหรับอุปกรณ์ติดตั้งเพิ่มเติม การอัปเดตจะขึ้นอยู่กับว่าบิลด์พื้นฐานกำหนด PRODUCT_USE_DYNAMIC_PARTITIONS และ PRODUCT_RETROFIT_DYNAMIC_PARTITIONS หรือไม่

  • ถ้ารุ่นฐาน ไม่ได้ กำหนดตัวแปร นี่คือการปรับปรุงการเพิ่มเติม แพคเกจการอัปเดตประกอบด้วยไฟล์ super.img แยก และปิดใช้งานขั้นตอนหลังการติดตั้ง
  • หากบิลด์ฐาน กำหนด ตัวแปร จะเหมือนกับการอัพเดตทั่วไปที่มีพาร์ติชันไดนามิก แพคเกจการอัปเดตประกอบด้วยรูปภาพสำหรับพาร์ติชันแบบลอจิคัล (ไดนามิก) สามารถเปิดใช้งานขั้นตอนหลังการติดตั้งได้

โอตะเต็มรูปแบบ

มีการสร้างแพ็คเกจ OTA แบบเต็มสองแพ็คเกจสำหรับอุปกรณ์ติดตั้งเพิ่มเติม

  • $(PRODUCT)-ota-retrofit-$(TAG).zip จะมีการแบ่ง super.img เสมอ และปิดใช้งานขั้นตอนหลังการติดตั้งสำหรับการปรับปรุงการอัพเดต
    • มันถูกสร้างขึ้นด้วยอาร์กิวเมนต์เพิ่มเติม --retrofit_dynamic_partitions ไปยังสคริปต์ ota_from_target_files
    • สามารถใช้ได้กับทุกบิลด์
  • $(PRODUCT)-ota-$(TAG).zip มีรูปภาพลอจิคัลสำหรับการอัปเดตในอนาคต
    • ใช้สิ่งนี้กับบิลด์ที่เปิดใช้งานพาร์ติชันไดนามิกเท่านั้น ดูรายละเอียดด้านล่างเกี่ยวกับการบังคับใช้สิ่งนี้

ปฏิเสธการอัปเดตแบบไม่ติดตั้งเพิ่มเติมในเวอร์ชันเก่า

ใช้แพ็คเกจ OTA แบบเต็มปกติกับบิลด์ที่เปิดใช้งานพาร์ติชันไดนามิกเท่านั้น หากเซิร์ฟเวอร์ OTA ได้รับการกำหนดค่าไม่ถูกต้องและพุชแพ็คเกจเหล่านี้ไปยังอุปกรณ์ที่ใช้ Android 9 หรือต่ำกว่า อุปกรณ์จะไม่สามารถบู๊ตได้ ไคลเอนต์ OTA บน Android 9 และต่ำกว่าไม่สามารถบอกความแตกต่างระหว่างแพ็คเกจดัดแปลง OTA และแพ็คเกจ OTA แบบเต็มปกติได้ ดังนั้นไคลเอนต์จะไม่ปฏิเสธแพ็คเกจแบบเต็ม

เพื่อป้องกันไม่ให้อุปกรณ์ยอมรับแพ็คเกจ OTA แบบเต็ม คุณสามารถกำหนดให้มีขั้นตอนหลังการติดตั้งเพื่อตรวจสอบการกำหนดค่าอุปกรณ์ที่มีอยู่ ตัวอย่างเช่น:

device/ device_name /dynamic_partitions/check_dynamic_partitions

#!/system/bin/sh
DP_PROPERTY_NAME="ro.boot.dynamic_partitions"
DP_RETROFIT_PROPERTY_NAME="ro.boot.dynamic_partitions_retrofit"

DP_PROPERTY=$(getprop ${DP_PROPERTY_NAME})
DP_RETROFIT_PROPERTY=$(getprop ${DP_RETROFIT_PROPERTY_NAME})

if [ "${DP_PROPERTY}" != "true" ] || [ "${DP_RETROFIT_PROPERTY}" != "true" ] ; then
    echo "Error: applied non-retrofit update on build without dynamic" \
         "partitions."
    echo "${DP_PROPERTY_NAME}=${DP_PROPERTY}"
    echo "${DP_RETROFIT_PROPERTY_NAME}=${DP_RETROFIT_PROPERTY}"
    exit 1
fi

device/ device_name /dynamic_partitions/Android.mk

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE:= check_dynamic_partitions
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_CLASS := EXECUTABLES
LOCAL_SRC_FILES := check_dynamic_partitions
LOCAL_PRODUCT_MODULE := true
include $(BUILD_PREBUILT)

device/ device_name /device.mk

PRODUCT_PACKAGES += check_dynamic_partitions

# OPTIONAL=false so that the error in check_dynamic_partitions will be
# propagated to OTA client.
AB_OTA_POSTINSTALL_CONFIG += \
    RUN_POSTINSTALL_product=true \
    POSTINSTALL_PATH_product=bin/check_dynamic_partitions \
    FILESYSTEM_TYPE_product=ext4 \
    POSTINSTALL_OPTIONAL_product=false \

เมื่อใช้แพ็คเกจ OTA ปกติบนอุปกรณ์ที่ไม่ได้เปิดใช้งานพาร์ติชันแบบไดนามิก ไคลเอนต์ OTA จะเรียกใช้ check_dynamic_partitions เป็นขั้นตอนหลังการติดตั้งและปฏิเสธการอัปเดต