หากต้องการใช้ A/B เสมือนในอุปกรณ์เครื่องใหม่หรือติดตั้งอุปกรณ์ที่เปิดตัวไปแล้ว คุณ ต้องทำการเปลี่ยนแปลงโค้ดเฉพาะอุปกรณ์
สร้างแฟล็ก
อุปกรณ์ที่ใช้ A/B เสมือนต้องกำหนดค่าเป็นอุปกรณ์ A/B และต้องเปิดตัวด้วย พาร์ติชัน แบบไดนามิก
สำหรับอุปกรณ์ที่เปิดตัวพร้อมกับ A/B เสมือน ให้ตั้งค่าอุปกรณ์ให้รับค่าการกำหนดค่าพื้นฐานของอุปกรณ์ A/B เสมือน
$(call inherit-product, \
$(SRC_TARGET_DIR)/product/virtual_ab_ota.mk)
อุปกรณ์ที่เปิดตัวพร้อมกับ A/B เสมือนจะต้องการขนาดบอร์ดเพียงครึ่งเดียวสำหรับ BOARD_SUPER_PARTITION_SIZE
เนื่องจากช่อง B จะไม่อยู่ใน Super อีกต่อไป กล่าวคือ BOARD_SUPER_PARTITION_SIZE
ต้องมากกว่าหรือเท่ากับ sum(ขนาดของกลุ่มการอัปเดต) + ค่าใช้จ่ายเพิ่มเติม ซึ่งในทางกลับกันต้องมากกว่าหรือเท่ากับ sum(ขนาดของพาร์ติชัน) + ค่าใช้จ่ายเพิ่มเติม
สำหรับ Android 13 ขึ้นไป หากต้องการเปิดใช้สแนปชอตที่บีบอัด ด้วย Virtual A/B ให้รับค่าการกำหนดค่าพื้นฐานต่อไปนี้
$(call inherit-product, $(SRC_TARGET_DIR)/product/generic_ramdisk.mk)
$(call inherit-product, \
$(SRC_TARGET_DIR)/product/virtual_ab_ota/vabc_features.mk)
ซึ่งจะเปิดใช้สแนปชอตของพื้นที่ผู้ใช้ด้วย Virtual A/B ขณะใช้วิธีการบีบอัดแบบไม่มีการดำเนินการ
จากนั้นคุณจะกำหนดค่าวิธีการบีบอัดเป็นวิธีใดวิธีหนึ่งที่zstd
รองรับlz4
ได้ สำหรับ Android 15
คุณจะปรับแต่งการบีบอัดให้ตรงกับความต้องการของอุปกรณ์ได้มากยิ่งขึ้น ดูข้อมูลเพิ่มเติมได้ที่การปรับแต่งการบีบอัด
PRODUCT_VIRTUAL_AB_COMPRESSION_METHOD := lz4
PRODUCT_VIRTUAL_AB_COMPRESSION_FACTOR := 65536
สำหรับ Android 12 หากต้องการเปิดใช้ภาพรวมที่บีบอัดด้วย Virtual A/B ให้รับค่าการกำหนดค่าพื้นฐานต่อไปนี้
$(call inherit-product, $(SRC_TARGET_DIR)/product/generic_ramdisk.mk)
$(call inherit-product, \
$(SRC_TARGET_DIR)/product/virtual_ab_ota/compression.mk)
การบีบอัด XOR
สำหรับอุปกรณ์ที่อัปเกรดเป็น Android 13 ขึ้นไป ระบบจะไม่ได้เปิดใช้ฟีเจอร์การบีบอัด XOR โดยค่าเริ่มต้น
หากต้องการเปิดใช้การบีบอัด XOR ให้เพิ่มข้อมูลต่อไปนี้ลงในไฟล์ .mk
ของอุปกรณ์
PRODUCT_VENDOR_PROPERTIES += ro.virtual_ab.compression.xor.enabled=true
การบีบอัด XOR จะเปิดใช้โดยค่าเริ่มต้นสำหรับอุปกรณ์ที่รับค่ามาจาก
android_t_baseline.mk
การผสานพื้นที่ของผู้ใช้
ใน Virtual A/B เวอร์ชันใหม่ (Android T ขึ้นไป) กระบวนการผสานรวมสแนปชอต จะเกิดขึ้นในพื้นที่ผู้ใช้ทั้งหมด การเปลี่ยนแปลงนี้เกิดขึ้นได้ด้วย snapuserd และ dm-user อุปกรณ์ที่เปิดตัวด้วย Android 13 ขึ้นไปจะเปิดใช้การผสาน userspace โดยค่าเริ่มต้น และสำหรับอุปกรณ์รุ่นเก่าที่อัปเกรด คุณสามารถตั้งค่าพร็อพเพอร์ตี้นี้ได้โดยใช้คำสั่งต่อไปนี้
PRODUCT_VENDOR_PROPERTIES += ro.virtual_ab.userspace.snapshots.enabled=true
HAL การควบคุมการบูต
HAL การควบคุมการบูต มีอินเทอร์เฟซสำหรับไคลเอ็นต์ OTA เพื่อควบคุมสล็อตการบูต Virtual A/B ต้องมีการอัปเกรดเวอร์ชันย่อยของ HAL การควบคุมการบูตเนื่องจากต้องใช้ API เพิ่มเติม เพื่อให้มั่นใจว่า Bootloader ได้รับการปกป้องในระหว่างการแฟลชหรือการรีเซ็ตเป็นค่าเริ่มต้น ดู IBootControl.hal และ types.hal สำหรับคำจำกัดความ HAL เวอร์ชันล่าสุด
// hardware/interfaces/boot/1.1/types.hal
enum MergeStatus : uint8_t {
NONE, UNKNOWN, SNAPSHOTTED, MERGING, CANCELLED };
// hardware/interfaces/boot/1.1/IBootControl.hal
package android.hardware.boot@1.1;
interface IBootControl extends @1.0::IBootControl {
setSnapshotMergeStatus(MergeStatus status)
generates (bool success);
getSnapshotMergeStatus()
generates (MergeStatus status);
}
// Recommended implementation
Return<bool> BootControl::setSnapshotMergeStatus(MergeStatus v) {
// Write value to persistent storage
// e.g. misc partition (using libbootloader_message)
// bootloader rejects wipe when status is SNAPSHOTTED
// or MERGING
}
การเปลี่ยนแปลง Fstab
ความสมบูรณ์ของพาร์ติชันข้อมูลเมตาเป็นสิ่งจำเป็นสำหรับกระบวนการบูต
โดยเฉพาะอย่างยิ่งหลังจากใช้การอัปเดต OTA ดังนั้น ต้องตรวจสอบพาร์ติชันข้อมูลเมตาก่อนที่ first_stage_init
จะเมานต์ หากต้องการให้เป็นเช่นนี้ ให้เพิ่ม
check
fs_mgr flag ในรายการสำหรับ /metadata
ตัวอย่าง
มีดังนี้
/dev/block/by-name/metadata /metadata ext4 noatime,nosuid,nodev,discard,sync wait,formattable,first_stage_mount,check
ข้อกำหนดของเคอร์เนล
หากต้องการเปิดใช้การเก็บภาพสแนปชอต ให้ตั้งค่า CONFIG_DM_SNAPSHOT
เป็น true
สำหรับอุปกรณ์ที่ใช้ F2FS ให้ใส่ Flag f2fs: export FS_NOCOW_FL flag to user ในแพตช์เคอร์เนลเพื่อแก้ไขการปักหมุดไฟล์ รวมแพตช์เคอร์เนล f2fs: support aligned pinned file ด้วย
Virtual A/B อาศัยฟีเจอร์ที่เพิ่มในเคอร์เนลเวอร์ชัน 4.3 ซึ่งก็คือบิตสถานะล้น
ในเป้าหมาย snapshot
และ snapshot-merge
อุปกรณ์ทั้งหมดที่เปิดตัว
ด้วย Android 9 ขึ้นไปควรมีเคอร์เนลเวอร์ชัน 4.4 ขึ้นไปอยู่แล้ว
หากต้องการเปิดใช้สแนปชอตที่บีบอัด เวอร์ชันเคอร์เนลขั้นต่ำที่รองรับคือ 4.19
ตั้งค่า CONFIG_DM_USER=m
หรือ CONFIG_DM_USER=y
หากใช้แบบแรก (โมดูล)
ต้องโหลดโมดูลใน Ramdisk ระยะแรก ซึ่งทำได้โดย
เพิ่มบรรทัดต่อไปนี้ลงใน Makefile ของอุปกรณ์
BOARD_GENERIC_RAMDISK_KERNEL_MODULES_LOAD := dm-user.ko
การเปลี่ยนแปลงเครื่องมือ Fastboot
Android 11 ทำการเปลี่ยนแปลงโปรโตคอล fastboot ดังนี้
getvar snapshot-update-status
— แสดงค่าที่ HAL ของ boot control สื่อสารกับ Bootloader ดังนี้- หากสถานะเป็น
MERGING
บูตโหลดเดอร์ต้องแสดงผลmerging
- หากสถานะเป็น
SNAPSHOTTED
บูตโหลดเดอร์ต้องแสดงผลsnapshotted
- ไม่เช่นนั้น Bootloader ต้องแสดงผล
none
- หากสถานะเป็น
snapshot-update merge
— ดำเนินการผสานให้เสร็จสมบูรณ์ โดยจะบูตไปยัง recovery/fastbootd หากจำเป็น คำสั่งนี้จะใช้ได้ก็ต่อเมื่อsnapshot-update-status
เป็นmerging
เท่านั้น และรองรับใน fastbootd เท่านั้นsnapshot-update cancel
— ตั้งค่าสถานะการผสานของ HAL การควบคุมการบูตเป็นCANCELLED
คำสั่งนี้ใช้ไม่ได้เมื่ออุปกรณ์ล็อกอยู่erase
หรือwipe
-erase
หรือwipe
ของmetadata
,userdata
หรือ พาร์ติชันที่มีสถานะการผสานสำหรับ HAL การควบคุมการบูตควรตรวจสอบ สถานะการผสานสแนปชอต หากสถานะเป็นMERGING
หรือSNAPSHOTTED
อุปกรณ์ควรยกเลิกการดำเนินการset_active
— คำสั่งset_active
ที่เปลี่ยนสล็อตที่ใช้งานอยู่ ควรตรวจสอบสถานะการผสานรวมสแนปชอต หากสถานะเป็นMERGING
อุปกรณ์ควรยกเลิกการดำเนินการ คุณเปลี่ยนช่องได้อย่างปลอดภัยในสถานะSNAPSHOTTED
การเปลี่ยนแปลงเหล่านี้ออกแบบมาเพื่อป้องกันไม่ให้อุปกรณ์บูตไม่ได้โดยไม่ตั้งใจ
แต่ก็อาจรบกวนเครื่องมืออัตโนมัติได้ เมื่อใช้คำสั่งเป็น
คอมโพเนนต์ของการแฟลชพาร์ติชันทั้งหมด เช่น การเรียกใช้ fastboot flashall
ขอแนะนำให้ใช้ขั้นตอนต่อไปนี้
- คำค้นหา
getvar snapshot-update-status
- หาก
merging
หรือsnapshotted
ให้ส่งปัญหาsnapshot-update cancel
- ดำเนินการตามขั้นตอนการแฟลช
ลดข้อกำหนดด้านพื้นที่เก็บข้อมูล
อุปกรณ์ที่ไม่ได้จัดสรรพื้นที่เก็บข้อมูล A/B แบบเต็มใน Super และคาดว่าจะใช้ /data
ตามความจำเป็น ขอแนะนำให้ใช้เครื่องมือการแมปบล็อก เครื่องมือการแมปบล็อกจะช่วยให้การจัดสรรบล็อกสอดคล้องกันระหว่างบิลด์
จึงลดการเขียนที่ไม่จำเป็นไปยังสแนปชอต ซึ่งมีการบันทึกไว้ในส่วนการลดขนาด OTA
อัลกอริทึมการบีบอัด OTA
คุณสามารถปรับแต่งแพ็กเกจ OTA ให้เหมาะกับเมตริกประสิทธิภาพต่างๆ ได้ Android มีวิธีการบีบอัดที่รองรับหลายวิธี (lz4
, zstd
และ none
) ซึ่งมีข้อดีข้อเสียที่แตกต่างกันระหว่างเวลาในการติดตั้ง การใช้พื้นที่ COW เวลาในการบูต และเวลาในการผสานรวมสแนปชอต
ตัวเลือกเริ่มต้นที่เปิดใช้สำหรับ Virtual Ab ที่มีการบีบอัดคือ lz4
compression method
การปรับแต่งการบีบอัด
คุณปรับแต่งอัลกอริทึมการบีบอัดเพิ่มเติมได้ 2 วิธี ดังนี้
(ระดับการบีบอัด) (ปริมาณการบีบอัดที่ได้โดยแลกกับความเร็ว) และ (ปัจจัยการบีบอัด) (ขนาดหน้าต่างที่บีบอัดได้สูงสุด)
ระดับการบีบอัดใช้ได้กับอัลกอริทึมบางอย่าง เช่น zstd
และ
การเปลี่ยนระดับจะทำให้เกิดการแลกเปลี่ยนระหว่างความเร็วและอัตราส่วนการบีบอัด
ปัจจัยการบีบอัดอธิบายขนาดหน้าต่างการบีบอัดสูงสุดที่ใช้ระหว่างการติดตั้ง OTA
ค่าเริ่มต้นตั้งไว้ที่ 64k แต่สามารถลบล้างได้โดยการปรับแต่ง
พารามิเตอร์บิลด์ PRODUCT_VIRTUAL_AB_COMPRESSION_FACTOR
รองรับ
ปัจจัยการบีบอัด 4k, 8k, 16k, 32k, 64k, 128k และ 256k
PRODUCT_VIRTUAL_AB_COMPRESSION_FACTOR := 65536
OTA แบบเพิ่มทีละรายการใน Pixel 8 Pro
เวลาในการติดตั้งโดยไม่มีระยะหลังการติดตั้ง | การใช้งานพื้นที่ COW | เวลาเปิดเครื่องหลัง OTA | เวลาผสานสแนปชอต | |
---|---|---|---|---|
lz4 | 18 นาที 15 วินาที | 2.5 GB | 32.7 วินาที | 98.6 วินาที |
zstd | 24 นาที 49 วินาที | 2.05 GB | 36.3 วินาที | 133.2 วินาที |
ไม่มี | 16 นาที 42 วินาที | 4.76 GB | 28.7 วินาที | 76.6 วินาที |
OTA แบบเต็มใน Pixel 8 Pro
เวลาในการติดตั้งโดยไม่มีระยะหลังการติดตั้ง | การใช้งานพื้นที่ COW | เวลาเปิดเครื่องหลัง OTA | เวลาผสานสแนปชอต | |
---|---|---|---|---|
lz4 | 15 นาที 11 วินาที | 4.16 GB | 17.6 วินาที | 82.2 วินาที |
zstd | 16 นาที 19 วินาที | 3.46 GB | 21.0 วินาที | 106.3 วินาที |
ไม่มี | 13 นาที 33 วินาที | 6.39 GB | 18.5 วินาที | 92.5 วินาที |