ติดตั้งใช้งาน 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)

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