หากต้องการใช้ A/B เสมือนในอุปกรณ์ใหม่ หรือเพื่อปรับอุปกรณ์ที่เปิดตัวแล้วให้ทันสมัย คุณจะต้องทําการเปลี่ยนแปลงโค้ดเฉพาะอุปกรณ์
สร้าง Flag
อุปกรณ์ที่ใช้ 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 หากต้องการเปิดใช้ภาพรวมที่บีบอัดด้วย 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 ขึ้นไปจะเปิดใช้การผสานพื้นที่ผู้ใช้โดยค่าเริ่มต้น และสำหรับอุปกรณ์รุ่นเก่าที่อัปเกรด คุณสามารถตั้งค่าพร็อพเพอร์ตี้นี้ได้ด้วยสิ่งต่อไปนี้
PRODUCT_VENDOR_PROPERTIES += ro.virtual_ab.userspace.snapshots.enabled=true
HAL การควบคุมการบูต
การควบคุมการบูต (HAL) มีอินเทอร์เฟซสำหรับไคลเอ็นต์ OTA เพื่อควบคุมช่องการบูต A/B เสมือนต้องใช้การอัปเกรด HAL การควบคุมการบูตเป็นเวอร์ชันย่อย เนื่องจากต้องใช้ API เพิ่มเติมเพื่อให้มั่นใจว่า Bootloader ได้รับการป้องกันระหว่างการแฟลชหรือรีเซ็ตเป็นค่าเริ่มต้น ดูคำจำกัดความ HAL เวอร์ชันล่าสุดได้จาก IBootControl.hal และ types.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 ลงในรายการสำหรับ /metadata
ตัวอย่างมีดังนี้
/dev/block/by-name/metadata /metadata ext4 noatime,nosuid,nodev,discard,sync wait,formattable,first_stage_mount,check
ข้อกำหนดเกี่ยวกับเคอร์เนล
หากต้องการเปิดใช้การเก็บสแนปชอต ให้ตั้งค่า CONFIG_DM_SNAPSHOT
เป็น true
สำหรับอุปกรณ์ที่ใช้ F2FS ให้รวมการแก้ไขเคอร์เนล f2fs: export FS_NOCOW_FL to user เพื่อแก้ไขการปักหมุดไฟล์ ใส่แพตช์เคอร์เนล f2fs: support aligned pinned file ด้วย
A/B เสมือนอาศัยฟีเจอร์ที่เพิ่มเข้ามาในเคอร์เนลเวอร์ชัน 4.3 ซึ่งก็คือบิตสถานะที่ล้นในเป้าหมาย snapshot
และ snapshot-merge
อุปกรณ์ทั้งหมดที่เปิดตัวพร้อมกับ Android 9 ขึ้นไปควรมีเคอร์เนลเวอร์ชัน 4.4 ขึ้นไปอยู่แล้ว
หากต้องการเปิดใช้ภาพรวมแบบบีบอัด เวอร์ชันเคอร์เนลขั้นต่ำที่รองรับคือ 4.19
ตั้งค่า CONFIG_DM_USER=m
หรือ CONFIG_DM_USER=y
หากใช้ตัวเลือกแรก (โมดูล) จะต้องโหลดโมดูลในแรมดิสก์ระยะที่ 1 ซึ่งทำได้โดยเพิ่มบรรทัดต่อไปนี้ลงใน Makefile ของอุปกรณ์
BOARD_GENERIC_RAMDISK_KERNEL_MODULES_LOAD := dm-user.ko
การเปลี่ยนแปลงเครื่องมือ Fastboot
Android 11 ทำการเปลี่ยนแปลงต่อไปนี้ในโปรโตคอล fastboot
getvar snapshot-update-status
— ส่งคืนค่าที่ HAL ควบคุมการบูตสื่อสารกับโปรแกรมโหลดบูต ดังนี้- หากสถานะคือ
MERGING
บูตโหลดเดอร์ต้องแสดงผลเป็นmerging
- หากสถานะคือ
SNAPSHOTTED
บูตโหลดเดอร์ต้องแสดงผลเป็นsnapshotted
- มิเช่นนั้น บูตโหลดเดอร์ต้องแสดงผล
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 เวลาบูต และเวลาผสานสแนปชอต ตัวเลือกเริ่มต้นที่เปิดใช้สําหรับการทดสอบ A/B เสมือนที่มีการบีบอัดคือ 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 วินาที |
none | 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 วินาที |
none | 13 นาที 33 วินาที | 6.39 GB | 18.5 วินาที | 92.5 วินาที |