รองรับ 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 (ไม่ใช้)
- ข้อมูลเมตา 0
- อุปกรณ์บล็อกจริง
system_b
- ข้อมูลเมตา 0 (ไม่ใช้)
- ข้อมูลเมตา 1
- foo_bกลุ่ม
- พาร์ติชันเชิงตรรกะ (ไดนามิก)
system_b
- พาร์ติชันเชิงตรรกะ (ไดนามิก)
product_services_b
- พาร์ติชันอื่นๆ ที่อัปเดตโดย Foo
- พาร์ติชันเชิงตรรกะ (ไดนามิก)
- แถบกลุ่ม_ข
- พาร์ติชันเชิงตรรกะ (ไดนามิก)
vendor_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 ในอุปกรณ์ ไม่รองรับการแมปพาร์ติชันแบบไดนามิกก่อนการอัปเดต 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 ได้รับการอัปเดตให้สามารถทำงานร่วมกับ พาร์ติชันแบบไดนามิก ขอบเขตของพาร์ติชันต้นทางไม่เคยครอบคลุม ในพาร์ติชันจริงเป้าหมายได้
อัปเดตขั้นตอนโดยใช้แพ็กเกจการอัปเดตปกติ
- เริ่มต้นข้อมูลเมตาของพาร์ติชัน
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
เป็นขั้นตอนหลังการติดตั้งและ
ปฏิเสธการอัปเดต