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

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

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

ฉากหลัง

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

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

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

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

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

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

  • อุปกรณ์บล็อกจริง 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
      • แถบกลุ่ม_ข
        • พาร์ติชันเชิงตรรกะ (ไดนามิก) 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 ในอุปกรณ์ ไม่รองรับการแมปพาร์ติชันแบบไดนามิกก่อนการอัปเดต CANNOT TRANSLATE สร้างชุดแพตช์เพิ่มเติมเพื่อให้ใช้การแมปได้ เข้ากับพาร์ติชันทางกายภาพที่มีอยู่โดยตรง

โปรแกรมสร้าง 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 ในการอัปเดต ไฟล์ Manifest ดูขนาดของแต่ละพาร์ติชันได้ใน new_partition_info
    3. เขียน M ไปยังข้อมูลเมตา 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 ที่สมบูรณ์ 2 แพ็กเกจสำหรับอุปกรณ์เสริม

  • $(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เป็นขั้นตอนหลังการติดตั้งและ ปฏิเสธการอัปเดต