डाइनैमिक पार्टीशन वाले A/B डिवाइसों के लिए OTA

Android 10 में डाइनैमिक पार्टीशन की सुविधा काम करती है. यह एक यूज़रस्पेस पार्टीशनिंग सिस्टम है. यह सिस्टम, ओवर-द-एयर (OTA) अपडेट के दौरान पार्टीशन बना सकता है, उनका साइज़ बदल सकता है, और उन्हें मिटा सकता है.

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

बैकग्राउंड

डिवाइस पर एक super पार्टीशन है. इस पार्टिशन में स्लॉट सफ़िक्स नहीं है. ब्लॉक किया गया डिवाइस मौजूद होना चाहिए. साथ ही, fstab में /misc के लिए blk_device एंट्री मौजूद होनी चाहिए. उदाहरण के लिए, अगर fstab फ़ाइल में यह जानकारी दी गई है:

/dev/block/bootdevice/by-name/misc    /misc    # Other fields

इसके बाद, super के लिए ब्लॉक डिवाइस /dev/block/bootdevice/by-name/super में मौजूद होना चाहिए. हालांकि, super पार्टीशन को fstab फ़ाइल में शामिल करना ज़रूरी नहीं है.

super पार्टिशन में, दो मेटाडेटा स्लॉट होते हैं. इन्हें 0 और 1 नंबर दिया जाता है. ये पार्टिशन के A/B स्लॉट से मेल खाते हैं. इस पेज पर, मेटाडेटा स्लॉट को मेटाडेटा S (सोर्स) और मेटाडेटा T (टारगेट) कहा जाता है. इसी तरह, पार्टिशन को system_s, vendor_t वगैरह कहा जाता है.

अपग्रेड से पहले, Metadata S में इस्तेमाल किए जा रहे डाइनैमिक पार्टीशन की जानकारी होती है. आम तौर पर, यह system_s, vendor_s, product_s वगैरह होती है. अपडेट के दौरान सिस्टम, इन पार्टीशन के एक्सटेंट को पढ़ता है. इसलिए, इन्हें मिटाया नहीं जा सकता.

पार्टिशन, अपडेट ग्रुप से जुड़े होते हैं. ज़्यादा जानकारी के लिए, डाइनैमिक पार्टीशन लागू करना लेख पढ़ें.

किसी डिवाइस पर मौजूद मेटाडेटा का उदाहरण यहां दिया गया है.

  • मेटाडेटा 0
    • ग्रुप foo_a
      • पार्टिशन system_a
      • पार्टिशन product_services_a
      • Foo ने अन्य पार्टिशन अपडेट किए
    • Group bar_a
      • पार्टिशन vendor_a
      • पार्टिशन product_a
      • Bar ने अन्य पार्टीशन अपडेट किए
    • ग्रुप foo_b (पिछले अपग्रेड से बचा हुआ)
    • ग्रुप bar_b (पिछले अपग्रेड से बचा हुआ)
  • मेटाडेटा 1
    • ग्रुप foo_a (पिछले अपग्रेड से बचा हुआ)
    • ग्रुप bar_a (पिछले अपग्रेड से बचा हुआ)
    • ग्रुप foo_b
      • पार्टिशन system_b
      • पार्टिशन product_services_b
      • Foo ने अन्य पार्टिशन अपडेट किए
    • ग्रुप bar_b
      • पार्टिशन vendor_b
      • पार्टिशन product_b
      • Bar ने अन्य पार्टीशन अपडेट किए

अपने डिवाइस पर मेटाडेटा डंप करने के लिए, lpdump टूल (system/extras/partition_tools में मौजूद सोर्स कोड) का इस्तेमाल किया जा सकता है. उदाहरण के लिए:

lpdump --slot 0 /dev/block/bootdevice/by-name/super
lpdump --slot 1 /dev/block/bootdevice/by-name/super

फ़्लो अपडेट करें

  1. super पार्टीशन के मेटाडेटा को शुरू करें.
    1. Metadata S से, सोर्स डाइनैमिक पार्टीशन के लिए एक्सटेंट लोड करें. मान लें कि M, लोड किया गया मेटाडेटा है.
    2. M से टारगेट ग्रुप और पार्टीशन (उदाहरण के लिए, foo_t, bar_t) हटाएं, ताकि M में सिर्फ़ _s सफ़िक्स वाले पार्टीशन और ग्रुप शामिल हों.
    3. अपडेट मेनिफ़ेस्ट में मौजूद dynamic_partition_metadata फ़ील्ड के हिसाब से, टारगेट ग्रुप और पार्टीशन जोड़ें.
      हर पार्टीशन का साइज़ new_partition_info में देखा जा सकता है.
    4. मेटाडेटा टी में एम लिखो.
    5. डिवाइस मैपर पर जोड़े गए पार्टीशन को लिखने के तौर पर मैप करें.
  2. ब्लॉक किए गए डिवाइसों पर अपडेट लागू करें.
    1. अगर ज़रूरी हो, तो डिवाइस मैपर पर सोर्स पार्टीशन को सिर्फ़ पढ़ने के लिए मैप करें. साइडलोडिंग के लिए यह ज़रूरी है, क्योंकि अपडेट से पहले सोर्स पार्टिशन मैप नहीं किए जाते.
    2. टारगेट स्लॉट पर मौजूद सभी ब्लॉक डिवाइसों पर, पूरा या डेल्टा अपडेट लागू करें.
    3. पोस्ट-इंस्टॉल स्क्रिप्ट चलाने के लिए, पार्टिशन को माउंट करें. इसके बाद, पार्टिशन को अनमाउंट करें.
  3. टारगेट किए गए पार्टीशन को अनमैप करें.

अपडेट से पहले और बाद में, सिस्टम की इन प्रॉपर्टी की वैल्यू ये होनी चाहिए:

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

अपडेट मेनिफ़ेस्ट में ग्रुप और पार्टीशन जोड़ना

डाइनैमिक पार्टीशन वाले किसी ए/बी डिवाइस पर ओटीए अपडेट करते समय या डाइनैमिक पार्टीशन की सुविधा जोड़ने वाले किसी ए/बी डिवाइस पर ओटीए अपडेट करते समय, आपको अपडेट मेनिफ़ेस्ट में ग्रुप और पार्टीशन जोड़ने होंगे. नीचे दिए गए स्निपेट में, डाइनैमिक पार्टिशन के साथ काम करने के लिए, अपडेट मेनिफ़ेस्ट के बारे में ज़्यादा जानकारी दी गई है. हर फ़ील्ड के बारे में ज़्यादा जानकारी के लिए, update_metadata.proto देखें.

message DeltaArchiveManifest {
    optional DynamicPartitionMetadata dynamic_partition_metadata;
}

message DynamicPartitionMetadata {
    repeated DynamicPartitionGroup groups;
}

message DynamicPartitionGroup {
    required string name;
    optional uint64 size; // maximum size of group
    repeated string partition_names;
}