หากต้องการใช้การทดสอบ 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)
ซึ่งจะเปิดใช้ภาพรวมพื้นที่ผู้ใช้ด้วย 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 Flag FS_NOCOW_FL ไปยังผู้ใช้แพตช์เคอร์เนลเพื่อแก้ไขการปักหมุดไฟล์ ใส่แพตช์เคอร์เนล 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
- มิฉะนั้น 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 เวลาบูต และเวลาผสานสแนปชอต ตัวเลือกเริ่มต้นสำหรับ 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 วินาที |