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 (ไม่ได้ใช้)
- ข้อมูลเมตา 0
-
system_b
อุปกรณ์บล็อกทางกายภาพ- ข้อมูลเมตา 0 (ไม่ได้ใช้)
- ข้อมูลเมตา 1
- กลุ่ม foo_b
-
system_b
ติชันแบบลอจิคัล (ไดนามิก) - พาร์ติชันโลจิคัล (ไดนามิก)
product_services_b
- พาร์ติชั่นอื่น ๆ อัพเดตโดย Foo
-
- กลุ่ม bar_b
-
vendor_b
พาร์ติชันแบบลอจิคัล (ไดนามิก)_b -
product_b
พาร์ติชันแบบโลจิคัล (ไดนามิก) - พาร์ติชั่นอื่น ๆ อัพเดตโดย Bar
-
- กลุ่ม foo_b
คุณสามารถใช้เครื่องมือ 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 จะได้รับการอัปเดตให้ทำงานกับพาร์ติชันไดนามิก ขอบเขตสำหรับพาร์ติชันต้นทางจะไม่ขยายข้ามฟิสิคัลพาร์ติชันเป้าหมาย
อัปเดตโฟลว์โดยใช้แพ็คเกจอัปเดตปกติ
- เริ่มต้นข้อมูลเมตาของพาร์
super
ชันซุปเปอร์- สร้างข้อมูลเมตา M ใหม่จาก Metadata S (ข้อมูลเมตาต้นทาง) ตัวอย่างเช่น หาก Metadata S ใช้ [
system_s
,vendor_s
,product_s
] เป็นอุปกรณ์บล็อก ดังนั้น metadata ใหม่ M จะใช้ [system_t
,vendor_t
,product_t
] เป็นอุปกรณ์บล็อก กลุ่มและพาร์ติชันทั้งหมดจะถูกละทิ้งใน M - เพิ่มกลุ่มเป้าหมายและพาร์ติชันตามฟิลด์
dynamic_partition_metadata
ในรายการอัพเดต ขนาดของแต่ละพาร์ติชันสามารถพบได้ในnew_partition_info
- เขียน M ถึง Metadata T
- แมปพาร์ติชั่นที่เพิ่มเข้ามาบนตัวทำแผนที่อุปกรณ์ว่าสามารถเขียนได้
- สร้างข้อมูลเมตา M ใหม่จาก Metadata S (ข้อมูลเมตาต้นทาง) ตัวอย่างเช่น หาก Metadata S ใช้ [
- ใช้การอัปเดตบนอุปกรณ์บล็อก
- หากจำเป็น ให้แมปพาร์ติชั่นต้นทางบนตัวทำแผนที่อุปกรณ์เป็นแบบอ่านอย่างเดียว นี่เป็นสิ่งจำเป็นสำหรับไซด์โหลดเนื่องจากพาร์ติชันต้นทางไม่ได้ถูกแมปก่อนการอัปเดต
- ใช้การอัปเดตแบบเต็มหรือเดลต้ากับอุปกรณ์บล็อกทั้งหมดที่ช่องเป้าหมาย
- ติดตั้งพาร์ติชันเพื่อรันสคริปต์หลังการติดตั้ง จากนั้นยกเลิกการต่อเชื่อมพาร์ติชัน
- ยกเลิกการแมปพาร์ติชันเป้าหมาย
อัปเดตโฟลว์โดยใช้แพ็คเกจอัปเดตชุดติดตั้งเพิ่มเติม
หากใช้แพ็คเกจการอัปเดตชุดติดตั้งเพิ่มเติมบนอุปกรณ์ที่เปิดใช้งานพาร์ติชันแบบไดนามิกแล้ว ไคลเอนต์ 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
เป็นขั้นตอนหลังการติดตั้งและปฏิเสธการอัปเดต