नए डिवाइस पर वर्चुअल 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
में कौनसे ब्लॉक से ओएस पार्टिशन बनता है. डिवाइसों को यह ज़रूर करना चाहिए
उपयोगकर्ता को अनजाने में डिवाइस के काम न करने (ईंटिंग) से रोकने के लिए
ये काम किए जा सकते हैं:
- बूट कंट्रोल एचएएल को लागू करें, ताकि बूटलोडर सेट की गई वैल्यू को पढ़ सके
setSnapshotMergeStatus()
तरीके से. - अगर मर्ज की स्थिति
MERGING
है या मर्ज की स्थितिSNAPSHOTTED
है और वह स्लॉट नए अपडेट किए गए स्लॉट में बदल जाता है, तो फिर वाइप करने का अनुरोध किया जाता हैuserdata
,metadata
या मर्ज की स्थिति को स्टोर करने वाले पार्टिशन बूटलोडर में अस्वीकार किया गया है. fastboot snapshot-update cancel
निर्देश लागू करें, ताकि उपयोगकर्ता ये काम कर सकें बूटलोडर को सिग्नल भेज सकते हैं कि वे सुरक्षा के इस तरीके को बायपास करना चाहते हैं.- पूरे डिवाइस को फ़्लैश करते समय
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
याwipe
—metadata
,userdata
में सेerase
याwipe
या बूट कंट्रोल एचएएल के मर्ज स्टेटस को होल्ड करने वाला पार्टिशन स्नैपशॉट मर्ज की स्थिति में बदलाव कर सकता है. अगर स्थितिMERGING
याSNAPSHOTTED
है, तो डिवाइस को ऑपरेशन रद्द कर देना चाहिए.set_active
—set_active
का ऐसा निर्देश जो ऐक्टिव स्लॉट को बदल देता है को स्नैपशॉट मर्ज की स्थिति की जांच करनी चाहिए. अगर स्थितिMERGING
है, तो डिवाइस को ऑपरेशन रद्द कर देना चाहिए. स्लॉट कोSNAPSHOTTED
राज्य.
ये बदलाव इसलिए किए गए हैं, ताकि डिवाइस को गलती से चालू होने से रोका जा सके.
लेकिन उनसे ऑटोमेटेड टूलिंग पर असर पड़ सकता है. जब कमांड का इस्तेमाल
सभी पार्टिशन को फ़्लैश करने का कॉम्पोनेंट, जैसे कि fastboot flashall
चलाना, यह काम करता है
आपको नीचे दिया गया फ़्लो इस्तेमाल करने का सुझाव दिया जाता है:
- क्वेरी
getvar snapshot-update-status
. - अगर
merging
याsnapshotted
है, तो समस्याsnapshot-update cancel
. - फ़्लैशिंग चरणों के साथ आगे बढ़ें.
स्टोरेज से जुड़ी ज़रूरतें कम करें
वे डिवाइस जिनके पास सुपर चार्ट में पूरा 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 सेकंड |