वर्चुअल ए/बी लागू करना

किसी नए डिवाइस पर वर्चुअल 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 योग (अपडेट समूहों का आकार) + ओवरहेड से अधिक या बराबर होना चाहिए, जो बदले में, योग (विभाजन का आकार) + ओवरहेड से अधिक या बराबर होना चाहिए।

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

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

बूट नियंत्रण एचएएल

बूट नियंत्रण एचएएल ओटीए क्लाइंट के लिए बूट स्लॉट को नियंत्रित करने के लिए एक इंटरफ़ेस प्रदान करता है। वर्चुअल ए/बी को बूट नियंत्रण एचएएल के एक छोटे संस्करण के उन्नयन की आवश्यकता होती है क्योंकि फ्लैशिंग/फ़ैक्टरी रीसेट के दौरान बूटलोडर की सुरक्षा सुनिश्चित करने के लिए अतिरिक्त एपीआई की आवश्यकता होती है। HAL परिभाषा के नवीनतम संस्करण के लिए IBootControl.hal और type.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 में जोड़ी गई सुविधाओं पर निर्भर करता है: snapshot में अतिप्रवाह स्थिति बिट और snapshot-merge लक्ष्य। Android 9 और बाद के संस्करण के साथ लॉन्च होने वाले सभी उपकरणों में पहले से ही कर्नेल संस्करण 4.4 या बाद का संस्करण होना चाहिए।

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

BOARD_GENERIC_RAMDISK_KERNEL_MODULES_LOAD := dm-user.ko

Android 11 में अपग्रेड करने वाले उपकरणों पर रेट्रोफिटिंग करना

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

  • गाय फ़ाइलों का स्थान — लॉन्च डिवाइस के लिए, OTA क्लाइंट /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 * योग (अपडेट समूहों का आकार) + ओवरहेड से बड़ा या बराबर है, जो बदले में 2 * योग (विभाजन का आकार) से अधिक या बराबर है। + ओवरहेड

बूटलोडर परिवर्तन

किसी अपडेट के मर्ज चरण के दौरान, /data Android OS का एकमात्र संपूर्ण उदाहरण रखता है। एक बार माइग्रेशन प्रारंभ हो जाने पर, मूल system , vendor , और product विभाजन तब तक अपूर्ण होते हैं जब तक कि प्रतिलिपि समाप्त नहीं हो जाती। यदि इस प्रक्रिया के दौरान डिवाइस को फ़ैक्टरी-रीसेट किया जाता है, या तो पुनर्प्राप्ति द्वारा या सिस्टम सेटिंग्स संवाद के माध्यम से, तो डिवाइस बूट करने योग्य नहीं होगा।

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

  • यदि नया बिल्ड पहले सफलतापूर्वक बूट हुआ, तो माइग्रेशन समाप्त करें।
  • अन्यथा, पुराने स्लॉट में रोलबैक करें:
    • गतिशील विभाजन के लिए, पिछली स्थिति में वापस रोल करें।
    • स्थिर विभाजन के लिए, सक्रिय स्लॉट को पुराने स्लॉट पर सेट करें।

यदि डिवाइस अनलॉक है तो बूटलोडर और fastbootd दोनों /data विभाजन को मिटा सकते हैं। जबकि fastbootd माइग्रेशन को पूरा करने के लिए बाध्य कर सकता है, बूटलोडर नहीं कर सकता। बूटलोडर यह नहीं जानता है कि मर्ज प्रगति पर है या नहीं, या कौन से ब्लॉक /data में ओएस विभाजन का गठन होता है। उपकरणों को उपयोगकर्ता को अनजाने में निम्न कार्य करके डिवाइस को निष्क्रिय (ब्रिकिंग) करने से रोकना चाहिए:

  1. बूट नियंत्रण HAL को लागू करें ताकि बूटलोडर 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()));
}

फास्टबूट टूलींग परिवर्तन

एंड्रॉइड 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_active — एक set_active कमांड जो सक्रिय स्लॉट को बदलता है, उसे स्नैपशॉट मर्ज स्थिति की जांच करनी चाहिए। यदि स्थिति MERGING है, तो डिवाइस को ऑपरेशन को रोक देना चाहिए। SNAPSHOTTED स्थिति में स्लॉट को सुरक्षित रूप से बदला जा सकता है।

इन परिवर्तनों को गलती से किसी डिवाइस को बूट न ​​करने योग्य बनाने से रोकने के लिए डिज़ाइन किया गया है, लेकिन वे स्वचालित टूलिंग के लिए विघटनकारी हो सकते हैं। जब कमांड का उपयोग सभी विभाजनों को चमकाने के एक घटक के रूप में किया जाता है, जैसे कि fastboot flashall , तो निम्नलिखित प्रवाह का उपयोग करने की सिफारिश की जाती है:

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

भंडारण आवश्यकताओं को कम करना

जिन उपकरणों में सुपर में आवंटित पूर्ण ए/बी भंडारण नहीं है, और आवश्यकतानुसार /data का उपयोग करने की अपेक्षा कर रहे हैं, ब्लॉक मैपिंग टूल का उपयोग करने के लिए दृढ़ता से अनुशंसा की जाती है। ब्लॉक मैपिंग टूल स्नैपशॉट में अनावश्यक लेखन को कम करते हुए, बिल्ड के बीच ब्लॉक आवंटन को सुसंगत रखता है। यह ओटीए आकार को कम करने के तहत प्रलेखित है।