वर्चुअल 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 स्लॉट अब सुपर में नहीं हैं. इसका मतलब है कि BOARD_SUPER_PARTITION_SIZE इससे ज़्यादा या इसके बराबर होना चाहिए sum(अपडेट ग्रुप का साइज़) + ओवरहेड, जो इससे ज़्यादा होना चाहिए सम(भागों का साइज़) + ओवरहेड से ज़्यादा या उसके बराबर होना चाहिए.

Android 13 और उसके बाद वाले वर्शन के लिए, कंप्रेस की गई सुविधा चालू करने के लिए वर्चुअल A/B वाले स्नैपशॉट लेने पर, नीचे दिए गए बेस कॉन्फ़िगरेशन का इस्तेमाल किया जाता है:

$(call inherit-product, $(SRC_TARGET_DIR)/product/generic_ramdisk.mk)
$(call inherit-product, \
    $(SRC_TARGET_DIR)/product/virtual_ab_ota/android_t_baseline.mk)

यह नो-ऑप का इस्तेमाल करते समय, वर्चुअल A/B के साथ यूज़रस्पेस स्नैपशॉट चालू करता है कंप्रेस करने का तरीका. इसके बाद, कंप्रेस करने के तरीके को काम करने वाले तरीके gz, zstd, और lz4.

PRODUCT_VIRTUAL_AB_COMPRESSION_METHOD := lz4

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.

यूज़रस्पेस मर्ज

Android 13 और उसके बाद के वर्शन में अपग्रेड होने वाले डिवाइसों के लिए, डिवाइस मैपर में दी गई जानकारी के हिसाब से यूज़रस्पेस मर्ज करने की प्रोसेस लेयरिंग इसकी मदद से चालू नहीं की गई है डिफ़ॉल्ट. यूज़रस्पेस मर्ज की सुविधा चालू करने के लिए, डिवाइस के .mk में इस लाइन को जोड़ें फ़ाइल:

PRODUCT_VENDOR_PROPERTIES += ro.virtual_ab.userspace.snapshots.enabled=true

इस सुविधा से लॉन्च होने वाले डिवाइसों पर, यूज़रस्पेस मर्ज की सुविधा डिफ़ॉल्ट रूप से चालू होती है 13 और उससे ज़्यादा.

बूट कंट्रोल एचएएल

बूट कंट्रोल एचएएल OTA क्लाइंट को बूट स्लॉट नियंत्रित करने के लिए एक इंटरफ़ेस देता है. वर्चुअल A/B बूट कंट्रोल 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 में बदलाव

बूट प्रोसेस के लिए मेटाडेटा पार्टीशन का इंटिग्रिटी ज़रूरी है, खास तौर पर, ओटीए अपडेट लागू होने के तुरंत बाद. इसलिए, मेटाडेटा का बंटवारा first_stage_init के माउंट करने से पहले चेक किया जाना चाहिए. यह पक्का करने के लिए, /metadata की एंट्री के लिए check fs_mgr फ़्लैग. यहां दी गई चीज़ें, उदाहरण:

/dev/block/by-name/metadata /metadata ext4 noatime,nosuid,nodev,discard,sync wait,formattable,first_stage_mount,check

कर्नेल के लिए ज़रूरी शर्तें

स्नैपशॉट लेने की सुविधा चालू करने के लिए, CONFIG_DM_SNAPSHOT को true पर सेट करें.

F2FS इस्तेमाल करने वाले डिवाइसों के लिए, f2fs: FS_NOCOW_FL फ़्लैग को इसमें एक्सपोर्ट करें: उपयोगकर्ता कर्नेल पैच का इस्तेमाल करके, फ़ाइल पिन करने की समस्या ठीक की जा सकती है. f2fs: सहायता वाली पिन की गई सहायता शामिल करें फ़ाइल कर्नेल पैच भी है.

वर्चुअल A/B, कर्नेल के वर्शन 4.3 में जोड़ी गई सुविधाओं पर निर्भर करता है: overflow स्टेटस बिट में, snapshot और snapshot-merge टारगेट शामिल करें. सभी डिवाइस लॉन्च हो रहे हैं जिनमें Android 9 और उसके बाद के वर्शन हैं, तो पहले से ही कर्नेल वर्शन 4.4 या उसके बाद का वर्शन होना चाहिए.

कंप्रेस किए गए स्नैपशॉट चालू करने के लिए, कर्नेल के लिए कम से कम 4.19 वर्शन काम करता है. CONFIG_DM_USER=m या CONFIG_DM_USER=y सेट करें. अगर पहले वाले (मॉड्यूल) का इस्तेमाल किया जा रहा है, तो मॉड्यूल को पहले चरण की रैम डिस्क में लोड किया जाना चाहिए. यह लक्ष्य हासिल करके ऐसा किया जा सकता है Makefile डिवाइस में यह लाइन जोड़ी जा रही है:

BOARD_GENERIC_RAMDISK_KERNEL_MODULES_LOAD := dm-user.ko

Android 11 में अपग्रेड किए जा रहे डिवाइसों पर Retrofit

Android 11 में अपग्रेड करने पर, डाइनैमिक पार्टिशन के साथ लॉन्च हुए डिवाइस ये काम कर सकते हैं: वर्चुअल A/B को फिर से फ़िट करें. अपडेट करने की प्रक्रिया करीब-करीब वर्चुअल A/B के साथ लॉन्च होने वाले डिवाइस, जिनमें कुछ मामूली अंतर हैं:

  • गाय फ़ाइलों की जगह — लॉन्च डिवाइसों के लिए, ओटीए क्लाइंट इन फ़ाइलों का इस्तेमाल करता है स्पेस का इस्तेमाल करने से पहले, सुपर पार्टिशन में सभी उपलब्ध खाली स्पेस /data. रेट्रोफ़िट डिवाइसों के लिए, सुपर स्टोरेज में हमेशा काफ़ी जगह होती है विभाजन ताकि COW फ़ाइल /data पर कभी न बने.

  • बिल्ड-टाइम फ़ीचर फ़्लैग — वर्चुअल A/B को फिर से फ़िट करने वाले डिवाइसों के लिए, PRODUCT_VIRTUAL_AB_OTA और PRODUCT_VIRTUAL_AB_OTA_RETROFIT, दोनों सेट हैं true तक, जैसा कि नीचे दिखाया गया है:

    (call inherit-product, \
      (SRC_TARGET_DIR)/product/virtual_ab_ota_retrofit.mk)
    
  • सुपर पार्टिशन का साइज़ — वर्चुअल A/B के साथ लॉन्च होने वाले डिवाइस कट कर सकते हैं BOARD_SUPER_PARTITION_SIZE हाफ़ में है, क्योंकि B स्लॉट सुपर में नहीं हैं विभाजन. वर्चुअल A/B को रेट्रोफ़िट करने वाले डिवाइस, पुराने सुपर पार्टीशन को बनाए रखते हैं आकार, इसलिए BOARD_SUPER_PARTITION_SIZE, 2 * sum(अपडेट किए गए समूहों का आकार) + से ज़्यादा या इसके बराबर है ओवरहेड, जो बदले में 2 * sum(सेगमेंट का साइज़) + से ज़्यादा या इसके बराबर है ओवरहेड होगा.

बूटलोडर में किए गए बदलाव

किसी अपडेट को मर्ज करने के दौरान, /data में सिर्फ़ एक बार Android OS. माइग्रेशन शुरू होने के बाद, system, vendor, और कॉपी किए जाने तक, product सेगमेंट को बांटा नहीं जा सकता. अगर डिवाइस इस प्रोसेस के दौरान, डिवाइस को फ़ैक्ट्री रीसेट करना था. यह प्रोसेस, रिकवरी से मिली हो या सिस्टम से तो डिवाइस बूट नहीं हो पाएगा.

/data का डेटा हमेशा के लिए मिटाने से पहले, डेटा वापस पाने या रोलबैक करने की प्रोसेस के दौरान, इस प्रोसेस के दौरान मर्ज की प्रोसेस पूरी करें: डिवाइस की स्थिति:

  • अगर नया बिल्ड पहले चालू हो गया है, तो माइग्रेशन की प्रक्रिया पूरी करें.
  • अगर ऐसा नहीं है, तो पुराने स्लॉट पर रोल बैक करें:
    • डाइनैमिक पार्टीशन के लिए, पिछली स्थिति पर रोल बैक करें.
    • स्टैटिक पार्टिशन के लिए, ऐक्टिव स्लॉट को पुराने स्लॉट पर सेट करें.

बूटलोडर और fastbootd दोनों ही /data पार्टिशन को मिटा सकते हैं, अगर डिवाइस अनलॉक है. हालांकि fastbootd, माइग्रेशन को पूरा करने के लिए ज़बरदस्ती कर सकता है, लेकिन बूटलोडर ऐसा नहीं कर सकता. बूटलोडर को यह पता नहीं चलता है कि मर्ज किया गया है या नहीं आगे बढ़ें या /data में कौनसे ब्लॉक से ओएस पार्टिशन बनता है. डिवाइसों को यह ज़रूर करना चाहिए उपयोगकर्ता को अनजाने में डिवाइस के काम न करने (ईंटिंग) से रोकने के लिए ये काम किए जा सकते हैं:

  1. बूट कंट्रोल एचएएल को लागू करें, ताकि बूटलोडर सेट की गई वैल्यू को पढ़ सके setSnapshotMergeStatus() तरीके से.
  2. अगर मर्ज की स्थिति MERGING है या मर्ज की स्थिति SNAPSHOTTED है और वह स्लॉट नए अपडेट किए गए स्लॉट में बदल जाता है, तो फिर वाइप करने का अनुरोध किया जाता है userdata, metadata या मर्ज की स्थिति को स्टोर करने वाले पार्टिशन बूटलोडर में अस्वीकार किया गया है.
  3. fastboot snapshot-update cancel निर्देश लागू करें, ताकि उपयोगकर्ता ये काम कर सकें बूटलोडर को सिग्नल भेज सकते हैं कि वे सुरक्षा के इस तरीके को बायपास करना चाहते हैं.
  4. पूरे डिवाइस को फ़्लैश करते समय fastboot snapshot-update cancel जारी करने के लिए, कस्टम फ़्लैशिंग टूल या स्क्रिप्ट में बदलाव करें. इसे जारी करना सुरक्षित है, क्योंकि पूरे डिवाइस को फ़्लैश करने से ओटीए हट जाता है. टूल इस निर्देश का पता लगा सकता है fastboot getvar snapshot-update-status लागू करके रनटाइम पर. यह कमांड की मदद से गड़बड़ी की स्थितियों के बीच अंतर किया जा सकता है.

उदाहरण

struct VirtualAbState {
    uint8_t StructVersion;
    uint8_t MergeStatus;
    uint8_t SourceSlot;
};

bool ShouldPreventUserdataWipe() {
    VirtualAbState state;
    if (!ReadVirtualAbState(&state)) ...
    return state.MergeStatus == MergeStatus::MERGING ||
           (state.MergeStatus == MergeStatus::SNAPSHOTTED &&
            state.SourceSlot != CurrentSlot()));
}

फ़ास्टबूट टूल में किए गए बदलाव

Android 11, फ़ास्टबूट में ये बदलाव करता है प्रोटोकॉल:

  • getvar snapshot-update-status — यह बूट की वैल्यू दिखाता है बूटलोडर को भेजे गए HAL को कंट्रोल करने के लिए:
    • अगर स्थिति MERGING है, तो बूटलोडर को merging दिखाना होगा.
    • अगर स्थिति SNAPSHOTTED है, तो बूटलोडर को snapshotted दिखाना होगा.
    • ऐसा न होने पर, बूटलोडर को none ज़रूर दिखना चाहिए.
  • snapshot-update merge — मर्ज कार्रवाई पूरी करता है और चालू होता है रिकवरी/फ़ास्टबूट कहते हैं. यह निर्देश सिर्फ़ तब मान्य होता है, जब snapshot-update-status, merging है और सिर्फ़ फ़ास्टबूट में काम करता है.
  • snapshot-update cancel — बूट कंट्रोल HAL के मर्ज होने की स्थिति को इस पर सेट करता है CANCELLED. डिवाइस लॉक होने पर यह निर्देश अमान्य है.
  • erase या wipemetadata, userdata में से erase या wipe या बूट कंट्रोल एचएएल के मर्ज स्टेटस को होल्ड करने वाला पार्टिशन स्नैपशॉट मर्ज की स्थिति में बदलाव कर सकता है. अगर स्थिति MERGING या SNAPSHOTTED है, तो डिवाइस को ऑपरेशन रद्द कर देना चाहिए.
  • set_activeset_active का ऐसा निर्देश जो ऐक्टिव स्लॉट को बदल देता है को स्नैपशॉट मर्ज की स्थिति की जांच करनी चाहिए. अगर स्थिति MERGING है, तो डिवाइस को ऑपरेशन रद्द कर देना चाहिए. स्लॉट को SNAPSHOTTED राज्य.

ये बदलाव इसलिए किए गए हैं, ताकि डिवाइस को गलती से चालू होने से रोका जा सके. लेकिन उनसे ऑटोमेटेड टूलिंग पर असर पड़ सकता है. जब कमांड का इस्तेमाल सभी पार्टिशन को फ़्लैश करने का कॉम्पोनेंट, जैसे कि fastboot flashall चलाना, यह काम करता है आपको नीचे दिया गया फ़्लो इस्तेमाल करने का सुझाव दिया जाता है:

  1. क्वेरी getvar snapshot-update-status.
  2. अगर merging या snapshotted है, तो समस्या snapshot-update cancel.
  3. फ़्लैशिंग चरणों के साथ आगे बढ़ें.

स्टोरेज से जुड़ी ज़रूरतें कम करें

वे डिवाइस जिनके पास सुपर चार्ट में पूरा A/B स्टोरेज नहीं है और जो ज़्यादा स्टोरेज चाहते हैं ज़रूरत के हिसाब से /data का इस्तेमाल करने के लिए, हमारा सुझाव है कि आप ब्लॉक मैपिंग का भी इस्तेमाल करें टूल. ब्लॉक मैपिंग टूल, बिल्ड के लिए ब्लॉक ऐलोकेशन को एक जैसा रखता है. ताकि स्नैपशॉट में ग़ैर-ज़रूरी टेक्स्ट न लिखा जाए. इसे कम करना ओटीए का साइज़.

ओटीए कंप्रेस करने के तरीके

ओटीए पैकेज को अलग-अलग परफ़ॉर्मेंस मेट्रिक के लिए ट्यून किया जा सकता है. Android यह सेवा देता है कई काम करने वाले कंप्रेशन के तरीके (gz, lz4, zstd, और none) इंस्टॉल करने का समय, COW स्पेस का इस्तेमाल, बूट टाइम, और स्नैपशॉट के बीच का अंतर मर्ज करने का समय. वर्चुअल ab के लिए कंप्रेशन के साथ चालू होने वाला डिफ़ॉल्ट विकल्प है gz compression method. (ध्यान दें: कंप्रेस करने के अलग-अलग तरीकों के बीच मिलती-जुलती परफ़ॉर्मेंस यह सुविधा, सीपीयू की स्पीड और स्टोरेज थ्रूपुट के हिसाब से अलग-अलग हो सकती है. यह ज़रूरत के हिसाब से बदल भी सकती है डिवाइस पर. यहां जनरेट किए गए सभी OTA पैकेज, PostInstall की सुविधा बंद करते हैं. तो बूट होने में लगने वाला समय थोड़ा कम हो जाएगा. किसी संपीड़न के बिना पूरा ota 4.81 GB है).

Pixel 6 Pro पर इंक्रीमेंटल ओटीए

इंस्टॉल करने के बाद के चरण में ऐप्लिकेशन इंस्टॉल होने में लगने वाला समय गाय के लिए जगह का इस्तेमाल पोस्ट OTA बूट समय स्नैपशॉट मर्ज करने का समय
जीज़ेड 24 मिनट 1.18 जीबी 40.2 सेकंड 45.5 सेकंड
एलज़ेड4 13 मिनट 1.49 जीबी 37.4 सेकंड 37.1 सेकंड
कोई नहीं 13 मिनट 2.90 जीबी 37.6 सेकंड 40.7 सेकंड

Pixel 6 Pro पर फ़ुल ओटीए

इंस्टॉल करने के बाद के चरण में ऐप्लिकेशन इंस्टॉल होने में लगने वाला समय गाय के स्पेस का इस्तेमाल पोस्ट OTA बूट समय स्नैपशॉट मर्ज करने का समय
जीज़ेड 23 मिनट 2.79 जीबी 24.9 सेकंड 41.7 सेकंड
एलज़ेड4 12 मिनट 3.46 जीबी 20.0 सेकंड 25.3 सेकंड
कोई नहीं 10 मिनट 4.85 जीबी 20.6 सेकंड 29.8 सेकंड