गतिशील विभाजन के बिना ए/बी उपकरणों के लिए ओटीए

एंड्रॉइड 10 गतिशील विभाजन का समर्थन करता है, एक उपयोगकर्ता स्थान विभाजन प्रणाली जो ओवर-द-एयर (ओटीए) अपडेट के दौरान विभाजन बना सकती है, आकार बदल सकती है और नष्ट कर सकती है।

यह पृष्ठ वर्णन करता है कि ओटीए क्लाइंट ए/बी डिवाइसों के लिए अपडेट के दौरान डायनेमिक विभाजन का आकार कैसे बदलते हैं जो डायनेमिक विभाजन समर्थन के बिना लॉन्च होते हैं और ओटीए क्लाइंट एंड्रॉइड 10 में कैसे अपग्रेड होते हैं।

पृष्ठभूमि

गतिशील विभाजन का समर्थन करने के लिए ए/बी डिवाइस के अपडेट के दौरान, डिवाइस पर GUID विभाजन तालिका (जीपीटी) संरक्षित होती है, इसलिए डिवाइस पर कोई super विभाजन नहीं होता है। मेटाडेटा system_a और system_b पर संग्रहीत है, लेकिन इसे BOARD_SUPER_PARTITION_METADATA_DEVICE को बदलकर अनुकूलित किया जा सकता है।

प्रत्येक ब्लॉक डिवाइस में दो मेटाडेटा स्लॉट होते हैं। प्रत्येक ब्लॉक डिवाइस में केवल एक मेटाडेटा स्लॉट का उपयोग किया जाता है। उदाहरण के लिए, system_a पर मेटाडेटा 0 और system_b पर मेटाडेटा 1 क्रमशः A और B स्लॉट पर विभाजन के अनुरूप हैं। रनटाइम पर, इससे कोई फर्क नहीं पड़ता कि कौन सा स्लॉट अपडेट किया जा रहा है।

इस पृष्ठ में, मेटाडेटा स्लॉट को मेटाडेटा एस (स्रोत) और मेटाडेटा टी (लक्ष्य) कहा जाता है। इसी प्रकार, विभाजनों को system_s , vendor_t , इत्यादि के रूप में संदर्भित किया जाता है।

बिल्ड सिस्टम कॉन्फ़िगरेशन के बारे में अधिक जानकारी के लिए, डिवाइस अपग्रेड करना देखें।

विभाजन अद्यतन समूहों से कैसे संबंधित हैं, इसके बारे में अधिक जानकारी के लिए, नए उपकरणों के लिए बोर्ड कॉन्फ़िगरेशन परिवर्तन देखें।

किसी डिवाइस पर मेटाडेटा का एक उदाहरण है:

  • फिजिकल ब्लॉक डिवाइस system_a
    • मेटाडेटा 0
      • समूह foo_a
        • तार्किक (गतिशील) विभाजन system_a
        • तार्किक (गतिशील) विभाजन product_services_a
        • अन्य विभाजन फू द्वारा अद्यतन किए गए
      • ग्रुप bar_a
        • तार्किक (गतिशील) विभाजन vendor_a
        • तार्किक (गतिशील) विभाजन product_a
        • अन्य विभाजन बार द्वारा अद्यतन किये गये
    • मेटाडेटा 1 (उपयोग नहीं किया गया)
  • फिजिकल ब्लॉक डिवाइस system_b
    • मेटाडेटा 0 (उपयोग नहीं किया गया)
    • मेटाडेटा 1
      • समूह foo_b
        • तार्किक (गतिशील) विभाजन system_b
        • तार्किक (गतिशील) विभाजन product_services_b
        • अन्य विभाजन फू द्वारा अद्यतन किए गए
      • ग्रुप बार_बी
        • तार्किक (गतिशील) विभाजन vendor_b
        • तार्किक (गतिशील) विभाजन product_b
        • अन्य विभाजन बार द्वारा अद्यतन किये गये

आप अपने डिवाइस पर मेटाडेटा को डंप करने के लिए system/extras/partition_tools के अंतर्गत lpdump टूल का उपयोग कर सकते हैं। उदाहरण के लिए:

lpdump --slot 0 /dev/block/by-name/system_a
lpdump --slot 1 /dev/block/by-name/system_b

किसी अद्यतन को पुनः फ़िट करें

एंड्रॉइड 9 और उसके बाद के संस्करण चलाने वाले उपकरणों पर, डिवाइस पर ओटीए क्लाइंट अपडेट से पहले डायनेमिक विभाजन मैपिंग का समर्थन नहीं करता है। पैच का एक अतिरिक्त सेट बनाया गया है ताकि मैपिंग को मौजूदा भौतिक विभाजनों पर सीधे लागू किया जा सके।

ओटीए जनरेटर अंतिम super.img फ़ाइल बनाता है जिसमें सभी गतिशील विभाजनों की सामग्री होती है, फिर छवि को सिस्टम, विक्रेता, आदि के अनुरूप भौतिक ब्लॉक उपकरणों के आकार से मेल खाने वाली कई छवियों में विभाजित करता है। इन छवियों को super_system.img , super_vendor.img इत्यादि नाम दिए गए हैं। OTA क्लाइंट इन छवियों को तार्किक (गतिशील) विभाजनों के लिए छवियों को लागू करने के बजाय, भौतिक विभाजनों पर लागू करता है।

क्योंकि ओटीए क्लाइंट को पता नहीं है कि डायनामिक विभाजन को कैसे मैप किया जाए, अद्यतन पैकेज उत्पन्न होने पर इन विभाजनों के लिए सभी पोस्ट-इंस्टॉल चरण स्वचालित रूप से अक्षम हो जाते हैं। अधिक विवरण के लिए पोस्ट-इंस्टॉलेशन कॉन्फ़िगर करना देखें।

अपडेट का प्रवाह एंड्रॉइड 9 जैसा ही है।

अद्यतन से पहले:

ro.boot.dynamic_partitions=
ro.boot.dynamic_partitions_retrofit=

अद्यतन के बाद:

ro.boot.dynamic_partitions=true
ro.boot.dynamic_partitions_retrofit=true

रेट्रोफ़िट के बाद भविष्य के अपडेट

रेट्रोफ़िट अद्यतन के बाद, OTA क्लाइंट को गतिशील विभाजन के साथ काम करने के लिए अद्यतन किया जाता है। स्रोत विभाजनों का विस्तार कभी भी लक्ष्य भौतिक विभाजनों तक नहीं फैला होता है।

नियमित अद्यतन पैकेज़ का उपयोग करके प्रवाह अद्यतन करें

  1. super पार्टीशन मेटाडेटा प्रारंभ करें।
    1. मेटाडेटा एस (स्रोत मेटाडेटा) से नया मेटाडेटा एम बनाएं। उदाहरण के लिए, यदि मेटाडेटा एस ब्लॉक डिवाइस के रूप में [ system_s , vendor_s , product_s ] का उपयोग करता है, तो नया मेटाडेटा एम ब्लॉक डिवाइस के रूप में [ system_t , vendor_t , product_t ] का उपयोग करता है। एम में सभी समूह और विभाजन हटा दिए जाते हैं।
    2. अद्यतन मेनिफ़ेस्ट में dynamic_partition_metadata फ़ील्ड के अनुसार लक्ष्य समूह और विभाजन जोड़ें। प्रत्येक विभाजन का आकार new_partition_info में पाया जा सकता है।
    3. मेटाडेटा टी को एम लिखें।
    4. डिवाइस मैपर पर जोड़े गए विभाजनों को लिखने योग्य के रूप में मैप करें।
  2. ब्लॉक डिवाइस पर अपडेट लागू करें.
    1. यदि आवश्यक हो, तो डिवाइस मैपर पर स्रोत विभाजन को केवल पढ़ने के लिए मैप करें। साइडलोडिंग के लिए यह आवश्यक है क्योंकि अद्यतन से पहले स्रोत विभाजन को मैप नहीं किया जाता है।
    2. लक्ष्य स्लॉट पर सभी ब्लॉक डिवाइसों पर पूर्ण या डेल्टा अपडेट लागू करें।
    3. पोस्ट-इंस्टॉल स्क्रिप्ट को चलाने के लिए विभाजन को माउंट करें, और फिर विभाजन को अनमाउंट करें।
  3. लक्ष्य विभाजन को अनमैप करें.

रेट्रोफ़िट अद्यतन पैकेज़ का उपयोग करके प्रवाह को अद्यतन करें

यदि रेट्रोफिट अपडेट पैकेज किसी ऐसे डिवाइस पर लागू किया जाता है जो पहले से ही गतिशील विभाजन को सक्षम करता है, तो ओटीए क्लाइंट स्प्लिट super.img फ़ाइल को सीधे ब्लॉक डिवाइस पर लागू करता है। अद्यतन प्रवाह रेट्रोफ़िट अद्यतन के समान है। विवरण के लिए रेट्रोफिटिंग अपडेट देखें।

उदाहरण के लिए, निम्नलिखित मान लें:

  • स्लॉट ए सक्रिय स्लॉट है.
  • system_a स्लॉट 0 पर सक्रिय मेटाडेटा शामिल है।
  • system_a , vendor_a , और product_a उपयोग ब्लॉक डिवाइस के रूप में किया जाता है।

जब ओटीए क्लाइंट को एक रेट्रोफिट अपडेट पैकेज प्राप्त होता है, तो वह भौतिक system_b पर super_system.img , भौतिक vendor_b पर super_vendor.img और भौतिक product_b पर super_product.img लागू करता है। भौतिक ब्लॉक डिवाइस system_b बूट समय पर तार्किक system_b , vendor_b और product_b मैप करने के लिए सही मेटाडेटा होता है।

अद्यतन पैकेज जनरेट करें

वृद्धिशील ओटीए

रेट्रोफिट उपकरणों के लिए वृद्धिशील ओटीए उत्पन्न करते समय, अपडेट इस बात पर निर्भर करते हैं कि बेस बिल्ड PRODUCT_USE_DYNAMIC_PARTITIONS और PRODUCT_RETROFIT_DYNAMIC_PARTITIONS को परिभाषित करता है या नहीं।

  • यदि बेस बिल्ड वेरिएबल्स को परिभाषित नहीं करता है , तो यह एक रेट्रोफिटिंग अपडेट है। अपडेट पैकेज में स्प्लिट super.img फ़ाइल शामिल है और पोस्ट-इंस्टॉल चरण को अक्षम कर देता है।
  • यदि बेस बिल्ड वेरिएबल्स को परिभाषित करता है , तो यह गतिशील विभाजन के साथ एक विशिष्ट अद्यतन के समान है। अद्यतन पैकेज़ में तार्किक (गतिशील) विभाजन के लिए छवियाँ शामिल हैं। पोस्ट-इंस्टॉल चरण को सक्षम किया जा सकता है।

पूर्ण ओटीए

रेट्रोफिट उपकरणों के लिए दो पूर्ण ओटीए पैकेज तैयार किए गए हैं।

  • $(PRODUCT)-ota-retrofit-$(TAG).zip में हमेशा स्प्लिट super.img होता है और रेट्रोफिटिंग अपडेट के लिए पोस्ट-इंस्टॉल चरण को अक्षम कर देता है।
    • यह ota_from_target_files स्क्रिप्ट के लिए एक अतिरिक्त तर्क --retrofit_dynamic_partitions के साथ उत्पन्न होता है।
    • इसे सभी बिल्ड पर लागू किया जा सकता है।
  • $(PRODUCT)-ota-$(TAG).zip भविष्य के अपडेट के लिए तार्किक छवियां शामिल हैं।
    • इसे केवल गतिशील विभाजन सक्षम वाले बिल्ड पर लागू करें। इसे लागू करने पर नीचे विवरण देखें।

पुराने बिल्ड पर नॉनरेट्रोफिट अपडेट को अस्वीकार करें

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

डिवाइस को पूर्ण ओटीए पैकेज स्वीकार करने से रोकने के लिए, आपको मौजूदा डिवाइस कॉन्फ़िगरेशन की जांच करने के लिए पोस्ट-इंस्टॉल चरण की आवश्यकता हो सकती है। उदाहरण के लिए:

device/ device_name /dynamic_partitions/check_dynamic_partitions

#!/system/bin/sh
DP_PROPERTY_NAME="ro.boot.dynamic_partitions"
DP_RETROFIT_PROPERTY_NAME="ro.boot.dynamic_partitions_retrofit"

DP_PROPERTY=$(getprop ${DP_PROPERTY_NAME})
DP_RETROFIT_PROPERTY=$(getprop ${DP_RETROFIT_PROPERTY_NAME})

if [ "${DP_PROPERTY}" != "true" ] || [ "${DP_RETROFIT_PROPERTY}" != "true" ] ; then
    echo "Error: applied non-retrofit update on build without dynamic" \
         "partitions."
    echo "${DP_PROPERTY_NAME}=${DP_PROPERTY}"
    echo "${DP_RETROFIT_PROPERTY_NAME}=${DP_RETROFIT_PROPERTY}"
    exit 1
fi

device/ device_name /dynamic_partitions/Android.mk

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE:= check_dynamic_partitions
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_CLASS := EXECUTABLES
LOCAL_SRC_FILES := check_dynamic_partitions
LOCAL_PRODUCT_MODULE := true
include $(BUILD_PREBUILT)

device/ device_name /device.mk

PRODUCT_PACKAGES += check_dynamic_partitions

# OPTIONAL=false so that the error in check_dynamic_partitions will be
# propagated to OTA client.
AB_OTA_POSTINSTALL_CONFIG += \
    RUN_POSTINSTALL_product=true \
    POSTINSTALL_PATH_product=bin/check_dynamic_partitions \
    FILESYSTEM_TYPE_product=ext4 \
    POSTINSTALL_OPTIONAL_product=false \

जब नियमित ओटीए पैकेज को डायनेमिक विभाजन सक्षम किए बिना डिवाइस पर लागू किया जाता है, तो ओटीए क्लाइंट check_dynamic_partitions पोस्ट-इंस्टॉल चरण के रूप में चलाता है और अपडेट को अस्वीकार कर देता है।