Android 10 รองรับ พาร์ติชันแบบไดนามิก ซึ่งเป็นระบบการแบ่งพาร์ติชันในพื้นที่ผู้ใช้ ที่สามารถสร้าง ปรับขนาด และลบพาร์ติชันระหว่างการอัปเดตผ่านอากาศ (OTA)
หน้านี้อธิบายวิธีที่ไคลเอ็นต์ OTA ปรับขนาดพาร์ติชันแบบไดนามิกระหว่างการอัปเดตสำหรับอุปกรณ์ A/B ที่เปิดตัวโดยไม่รองรับพาร์ติชันแบบไดนามิก และวิธีที่ไคลเอ็นต์ OTA อัปเกรดเป็น Android 10
ฉากหลัง
ระหว่างการอัปเดตอุปกรณ์ A/B เพื่อรองรับพาร์ติชันแบบไดนามิก ระบบจะเก็บรักษาตารางพาร์ติชัน GUID (GPT) ในอุปกรณ์ไว้ ดังนั้นอุปกรณ์จึงไม่มีพาร์ติชัน super ระบบจะจัดเก็บข้อมูลเมตาไว้ที่
system_a และ system_b แต่คุณปรับแต่งได้โดยเปลี่ยน BOARD_SUPER_PARTITION_METADATA_DEVICE
อุปกรณ์บล็อกแต่ละรายการมีสล็อตข้อมูลเมตา 2 ช่อง โดยจะใช้สล็อตข้อมูลเมตาเพียง 1 ช่องในอุปกรณ์บล็อกแต่ละรายการ เช่น ข้อมูลเมตา 0 ที่
system_a และข้อมูลเมตา 1 ที่ system_b
จะสอดคล้องกับพาร์ติชันที่สล็อต A และ B ตามลำดับ ใน
รันไทม์ ไม่สำคัญว่าระบบจะอัปเดตสล็อตใด
ในหน้านี้ เราจะเรียกสล็อตข้อมูลเมตาว่าข้อมูลเมตา S
(แหล่งที่มา) และข้อมูลเมตา T (เป้าหมาย) ในทำนองเดียวกัน เราจะเรียกพาร์ติชันว่า system_s, vendor_t, และอื่นๆ
ดูข้อมูลเพิ่มเติมเกี่ยวกับ การกำหนดค่าระบบบิลด์ ได้ที่ การอัปเกรดอุปกรณ์
ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีที่พาร์ติชันเป็นของ การอัปเดต กลุ่ม ได้ที่ การเปลี่ยนแปลงการกำหนดค่าบอร์ดสำหรับอุปกรณ์ใหม่
ตัวอย่างข้อมูลเมตาในอุปกรณ์มีดังนี้
- อุปกรณ์บล็อกทางกายภาพ
system_a- ข้อมูลเมตา 0
- กลุ่ม
foo_a- พาร์ติชันเชิงตรรกะ (แบบไดนามิก)
system_a - พาร์ติชันเชิงตรรกะ (แบบไดนามิก)
product_services_a - พาร์ติชันอื่นๆ ที่อัปเดตโดย Foo
- พาร์ติชันเชิงตรรกะ (แบบไดนามิก)
- กลุ่ม
bar_a- พาร์ติชันเชิงตรรกะ (แบบไดนามิก)
vendor_a - พาร์ติชันเชิงตรรกะ (แบบไดนามิก)
product_a - พาร์ติชันอื่นๆ ที่อัปเดตโดย Bar
- พาร์ติชันเชิงตรรกะ (แบบไดนามิก)
- กลุ่ม
- ข้อมูลเมตา 1 (ไม่ได้ใช้)
- ข้อมูลเมตา 0
- อุปกรณ์บล็อกทางกายภาพ
system_b- ข้อมูลเมตา 0 (ไม่ได้ใช้)
- ข้อมูลเมตา 1
- กลุ่ม foo_b
- พาร์ติชันเชิงตรรกะ (แบบไดนามิก)
system_b - พาร์ติชันเชิงตรรกะ (แบบไดนามิก)
product_services_b - พาร์ติชันอื่นๆ ที่อัปเดตโดย Foo
- พาร์ติชันเชิงตรรกะ (แบบไดนามิก)
- กลุ่ม bar_b
- พาร์ติชันเชิงตรรกะ (แบบไดนามิก)
vendor_b - พาร์ติชันเชิงตรรกะ (แบบไดนามิก)
product_b - พาร์ติชันอื่นๆ ที่อัปเดตโดย Bar
- พาร์ติชันเชิงตรรกะ (แบบไดนามิก)
- กลุ่ม foo_b
คุณสามารถใช้เครื่องมือ lpdump ใน
system/extras/partition_tools เพื่อดัมพ์ข้อมูลเมตาใน
อุปกรณ์ เช่น
lpdump --slot 0 /dev/block/by-name/system_alpdump --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 จากข้อมูลเมตา S (ข้อมูลเมตาต้นทาง)
เช่น หากข้อมูลเมตา S ใช้ [
system_s,vendor_s,product_s] เป็นอุปกรณ์บล็อก ข้อมูลเมตาใหม่ M จะใช้ [system_t,vendor_t,product_t] เป็นอุปกรณ์บล็อก ระบบจะทิ้งกลุ่มและพาร์ติชันทั้งหมดใน M -
เพิ่มกลุ่มและพาร์ติชันเป้าหมายตามฟิลด์
dynamic_partition_metadataในไฟล์ Manifest ของการอัปเดต คุณดูขนาดของแต่ละพาร์ติชันได้ในnew_partition_info - เขียน M ลงในข้อมูลเมตา T
- แมปพาร์ติชันที่เพิ่มในตัวแมปอุปกรณ์เป็นแบบเขียนได้
-
สร้างข้อมูลเมตาใหม่ M จากข้อมูลเมตา S (ข้อมูลเมตาต้นทาง)
เช่น หากข้อมูลเมตา 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 แบบเต็ม
ระบบจะสร้างแพ็กเกจ 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 เป็นขั้นตอนหลังการติดตั้งและปฏิเสธการอัปเดต