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

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

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

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

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

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

  • ระบบอุปกรณ์บล็อกกายภาพ system_a
    • ข้อมูลเมตา 0
      • กลุ่ม foo_a
        • โลจิคัล (ไดนามิก) พาร์ติชัน system_a
        • โลจิคัลพาร์ติชัน (ไดนามิก) product_services_a
        • พาร์ติชั่นอื่นๆ ที่อัพเดตโดย Foo
      • กลุ่ม bar_a
        • โลจิคัล (ไดนามิก) พาร์ติชัน vendor_a
        • โลจิคัลพาร์ติชัน (ไดนามิก) product_a
        • พาร์ติชั่นอื่นที่อัพเดตโดยBar
    • ข้อมูลเมตา 1 (ไม่ได้ใช้)
  • ระบบอุปกรณ์บล็อกกายภาพ system_b
    • ข้อมูลเมตา 0 (ไม่ได้ใช้)
    • ข้อมูลเมตา 1
      • กลุ่ม 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/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 จากข้อมูลเมตา S (ข้อมูลเมตาต้นทาง) ตัวอย่างเช่น หากข้อมูลเมตา S ใช้ [ system_s , vendor_s , product_s ] เป็นอุปกรณ์บล็อก เมตาดาต้าใหม่ 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 . แบบเต็ม

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

  • $(PRODUCT)-ota-retrofit-$(TAG).zip จะมี split 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 เป็นขั้นตอนหลังการติดตั้งและปฏิเสธการอัปเดต