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

หากต้องการใช้ 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 ขอแนะนำให้ใช้ขั้นตอนต่อไปนี้

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

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

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