ใช้การทดสอบ A/B เสมือน

หากต้องการใช้ 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 หรือ wipeerase หรือ wipe ของ metadata, userdata หรือพาร์ติชันที่มีสถานะการผสานสําหรับ HAL การควบคุมการบูตควรตรวจสอบสถานะการผสานสแนปชอต หากสถานะคือ MERGING หรือ SNAPSHOTTED อุปกรณ์ควรหยุดการดำเนินการ
  • set_active — คำสั่ง set_active ที่เปลี่ยนช่องที่ใช้งานอยู่ควรตรวจสอบสถานะการผสานสแนปชอต หากสถานะเป็น MERGING อุปกรณ์ควรหยุดการดำเนินการ คุณเปลี่ยนช่องได้อย่างปลอดภัยในสถานะ SNAPSHOTTED

การเปลี่ยนแปลงเหล่านี้ออกแบบมาเพื่อป้องกันไม่ให้อุปกรณ์บูตไม่ได้โดยไม่ตั้งใจ แต่ก็อาจรบกวนเครื่องมืออัตโนมัติได้ เมื่อใช้คำสั่งเป็นคอมโพเนนต์ของการแฟลชพาร์ติชันทั้งหมด เช่น การเรียกใช้ fastboot flashall เราขอแนะนำให้ใช้ขั้นตอนต่อไปนี้

  1. คําค้นหา getvar snapshot-update-status
  2. หากเป็น merging หรือ snapshotted แสดงว่าเป็นปัญหา snapshot-update cancel
  3. ดำเนินการตามขั้นตอนการแฟลช

ลดข้อกำหนดด้านพื้นที่เก็บข้อมูล

อุปกรณ์ที่ไม่มีพื้นที่เก็บข้อมูล 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 วินาที