प्रॉडक्ट विभाजन

Android 9 और उसके बाद के वर्शन में, Android बिल्ड सिस्टम का इस्तेमाल करके product पार्टीशन बनाने की सुविधा शामिल है. पहले, Android 8.x ने SoC के हिसाब से बने कॉम्पोनेंट को system से vendor में अलग करने की सुविधा लागू की थी. हालांकि, इसमें Android बिल्ड सिस्टम से बने OEM के हिसाब से बने कॉम्पोनेंट के लिए जगह नहीं दी गई थी. Android 9 और उसके बाद के वर्शन में, अतिरिक्त अनुमतियां और व्हाइटलिस्ट की सुविधाएं मिलती हैं. ये सुविधाएं, अलग-अलग पार्टीशन पर मौजूद निजी ऐप्लिकेशन पर लागू होती हैं.

प्रॉडक्ट के बंटवारे के बारे में जानकारी

कई OEM, अपनी सुविधाओं के साथ-साथ कैरियर की ज़रूरी शर्तों को लागू करने के लिए, AOSP सिस्टम इमेज को पसंद के मुताबिक बनाते हैं. हालांकि, पसंद के मुताबिक बदलाव करने पर, एक से ज़्यादा सॉफ़्टवेयर SKU के लिए, एक ही सिस्टम इमेज का इस्तेमाल करना मुश्किल हो जाता है. अपनी पसंद के मुताबिक बनाने के लिए, हर इमेज अलग होनी चाहिए. जैसे, अलग-अलग भाषाओं या कैरियर के हिसाब से. पसंद के मुताबिक बदलाव करने के लिए, अलग से product पार्टीशन का इस्तेमाल करने से, एक से ज़्यादा सॉफ़्टवेयर SKU के लिए एक ही सिस्टम इमेज का इस्तेमाल किया जा सकता है. (system partition में सामान्य कोड होस्ट किया जाता है, जिसे कई सॉफ़्टवेयर SKU के बीच शेयर किया जा सकता है). vendor पार्टीशन में, SoC के हिसाब से BSP कोड होस्ट किया जाता है. इस कोड को, दिए गए SoC के आधार पर कई डिवाइसों के बीच शेयर किया जा सकता है.

अलग-अलग पार्टीशन का इस्तेमाल करने के कुछ नुकसान हैं. जैसे, डिस्क का स्टोरेज मैनेज करना (आने वाले समय में स्टोरेज की ज़रूरत के हिसाब से कुछ स्टोरेज रिज़र्व रखना ज़रूरी है) और पार्टीशन के बीच स्टैबल ऐप्लिकेशन बाइनरी इंटरफ़ेस (एबीआई) बनाए रखना. product सेगमेंट का इस्तेमाल करने का फ़ैसला लेने से पहले, AOSP को अपने हिसाब से लागू करने और समस्या को कम करने के तरीकों के बारे में सोचें. जैसे, ओवर-द-एयर (ओटीए) अपडेट के दौरान डिवाइस का सेगमेंट फिर से बांटना. यह काम Google नहीं करता, बल्कि कुछ OEM करते हैं. डाइनैमिक पार्टिशनिंग, इसके लिए एक अच्छा विकल्प है.

प्रॉडक्ट के अलग-अलग हिस्से और अनुमतियां

Android 9 और इसके बाद के वर्शन में, अनुमतियों और व्हाइटलिस्ट करने की प्रोसेस में हुए बदलाव से, आपके `प्रॉडक्ट` पार्टिशन पर निजी ऐप्लिकेशन की अनुमतियां देने के तरीके पर असर पड़ता है. permissions.xml फ़ाइल को उसी पार्टीशन में होना चाहिए जिसमें priv-apps मौजूद हैं. system में permissions.xml फ़ाइल को, product में मौजूद निजी ऐप्लिकेशन के लिए डालने पर, product में मौजूद निजी ऐप्लिकेशन के लिए उन अनुमतियों का इस्तेमाल नहीं किया जा सकता. भले ही, system, product का एक्सटेंशन हो. अनुमतियों और व्हाइटलिस्ट करने की प्रोसेस के बारे में ज़्यादा जानने के लिए, खास अनुमति वाली व्हाइटलिस्ट देखें.

लेगसी /oem बनाम /product

प्रॉडक्ट इंटरफ़ेस लागू करने के तरीके के आधार पर, हमारे पास product पार्टीशन के दो तरह के एट्रिब्यूट हैं. साथ ही, product पार्टीशन, लेगसी oem पार्टीशन से अलग होता है:

सेगमेंट विशेषताएं
oem
  • इसे अपडेट नहीं किया जा सकता. आम तौर पर, फ़ैक्ट्री में इसे एक बार फ़्लैश किया जाता है.
  • ब्रैंडिंग और रंग जैसे छोटे बदलावों के हिसाब से बनाए गए. अलग-अलग oem partition कॉन्टेंट होने का मतलब यह नहीं है कि प्रॉडक्ट का सॉफ़्टवेयर अलग है.
  • system पार्टीशन, oem पार्टीशन पर निर्भर नहीं करता. (यह oem पार्टिशन का इस्तेमाल सिर्फ़ तब करता है, जब वहां कोई खास फ़ाइल मिलती है).
  • सिर्फ़ system पार्टीशन पर सार्वजनिक एपीआई का इस्तेमाल करता है.
product
  • अपडेट किया जा सकता है
  • सिस्टम इमेज के साथ जोड़ा जाता है (ये एक साथ अपडेट होते हैं)
  • हर प्रॉडक्ट या प्रॉडक्ट फ़ैमिली के हिसाब से बनाया गया.
  • सिस्टम पार्टीशन, product पार्टीशन पर निर्भर हो सकता है.
  • सार्वजनिक नहीं किए गए एपीआई का इस्तेमाल किया जा सकता है, क्योंकि वे एक साथ अपडेट होते हैं.
product (लागू किए गए इंटरफ़ेस)
  • अपडेट किया जा सकता है
  • सिस्टम इमेज से अलग किया गया.
  • हर प्रॉडक्ट या प्रॉडक्ट फ़ैमिली के हिसाब से बनाया गया.
  • system पार्टीशन, product पार्टीशन पर निर्भर नहीं करता.
  • छिपे हुए एपीआई का इस्तेमाल नहीं किया जा सकता. हालांकि, यह सिर्फ़ system partition पर मौजूद सार्वजनिक और सिस्टम एपीआई का इस्तेमाल करता है.

इन वजहों से, Android 9 में product पार्टीशन के साथ-साथ, oem लेगसी पार्टीशन की सुविधा भी काम करती है. हालांकि, यह सुविधा सिर्फ़ उन डिवाइसों पर काम करती है जिनमें oem लेगसी पार्टीशन का इस्तेमाल किया जाता है. product partition को system partition से अलग करने के लिए, Android 11 में product इंटरफ़ेस लागू करने की सुविधा उपलब्ध है.

/product components

product पार्टीशन में ये कॉम्पोनेंट होते हैं:

  • प्रॉडक्ट से जुड़ी सिस्टम प्रॉपर्टी (/product/build.prop)
  • प्रॉडक्ट के हिसाब से आरआरओ (/product/overlay/*.apk)
  • प्रॉडक्ट से जुड़े ऐप्लिकेशन (/product/app/*.apk)
  • प्रॉडक्ट के हिसाब से बनाए गए निजी ऐप्लिकेशन (/product/priv-app/*.apk)
  • प्रॉडक्ट के हिसाब से लाइब्रेरी (/product/lib/*)
  • प्रॉडक्ट के हिसाब से Java लाइब्रेरी (/product/framework/*.jar)
  • प्रॉडक्ट के हिसाब से Android फ़्रेमवर्क के सिस्टम कॉन्फ़िगरेशन (/product/etc/sysconfig/* और /product/etc/permissions/*)
  • प्रॉडक्ट से जुड़ी मीडिया फ़ाइलें (/product/media/audio/*)
  • प्रॉडक्ट से जुड़ी bootanimation फ़ाइलें

कोई custom_images नहीं

custom_images का इस्तेमाल नहीं किया जा सकता. इनमें ये सुविधाएं काम नहीं करतीं:

  • किसी खास टारगेट में मॉड्यूल इंस्टॉल करना. custom_images, आर्टफ़ैक्ट को इमेज में कॉपी करने की सुविधा देता है. हालांकि, बिल्ड नियम के हिस्से के तौर पर, टारगेट किए गए partition की जानकारी देकर, किसी खास partition में मॉड्यूल इंस्टॉल नहीं किया जा सकता.
  • Soong की सहायता. custom_images को Soong बिल्ड सिस्टम का इस्तेमाल करके, बिल्ड नहीं किया जा सकता.
  • ओटीए अपडेट से जुड़ी सहायता. custom_images का इस्तेमाल फ़ैक्ट्री ROM इमेज के तौर पर किया जाता है, जिन्हें ओटीए अपडेट नहीं मिल सकते.

पार्टीशन के बीच एबीआई (ऐप्लिकेशन बाइनरी इंटरफ़ेस) बनाए रखना

Android 9 में product पार्टीशन, system पार्टीशन का एक्सटेंशन है. product और system के बीच कमजोर एबीआई है. इसलिए, दोनों को एक साथ अपग्रेड करना होगा. साथ ही, एबीआई सिस्टम SDK पर आधारित होना चाहिए. अगर सिस्टम SDK टूल, product और system के बीच के सभी एपीआई प्लैटफ़ॉर्म को कवर नहीं करता है, तो OEM को दोनों सेगमेंट के बीच अपने एबीआई को मैनेज करना होगा.

product और system सेगमेंट एक-दूसरे पर निर्भर हो सकते हैं. हालांकि, सामान्य सिस्टम इमेज (जीएसआई) के साथ की जाने वाली जांच, product पार्टीशन के बिना सही तरीके से काम करनी चाहिए.

product इंटरफ़ेस लागू होने पर, product पार्टीशन को system पार्टीशन से अलग कर दिया जाता है. product पार्टीशन, system पार्टीशन में मौजूद सिर्फ़ उन इंटरफ़ेस का इस्तेमाल करता है जिनके लिए अनुमति दी गई है.

product पार्टीशन को vendor पार्टीशन पर अस्थिर इंटरफ़ेस के ज़रिए किसी भी तरह से डिपेंड नहीं करना चाहिए. product और vendor के बीच सीधे इंटरैक्शन की अनुमति नहीं है. (यह SEpolicy से लागू होता है.)

प्रॉडक्ट के अलग-अलग हिस्सों को लागू करना

नया प्रॉडक्ट पार्टीशन लागू करने से पहले, AOSP में प्रॉडक्ट पार्टीशन से जुड़े बदलावों की समीक्षा करें. इसके बाद, product को सेट अप करने के लिए, इन बोर्ड या प्रॉडक्ट-बिल्ड फ़्लैग को शामिल करें:

  • BOARD_USES_PRODUCTIMAGE
  • BOARD_PRODUCTIMAGE_PARTITION_SIZE
  • BOARD_PRODUCTIMAGE_FILE_SYSTEM_TYPE
  • फ़्लाइट की कीमत PRODUCT_PRODUCT_PROPERTIES को /product/build.prop है. ये $(call inherit-product path/to/device.mk) के अंदर होने चाहिए, जैसे कि PRODUCT_PRODUCT_PROPERTIES += product.abc=ok में.

प्रॉडक्ट के बंटवारे में मॉड्यूल इंस्टॉल करना

product पार्टीशन में मॉड्यूल इंस्टॉल करने के लिए, नीचे दिए गए बिल्ड फ़्लैग का इस्तेमाल करें.

  • product_specific: true, Android.bp में है
  • LOCAL_PRODUCT_MODULE := true, Android.mk में है

वेरिफ़ाइड बूट मोड चालू करना

product पार्टीशन में नुकसान पहुंचाने वाले सॉफ़्टवेयर से छेड़छाड़ होने से रोकने के लिए, उस पार्टीशन के लिए Android Verified Boot (AVB) को चालू करें. ठीक उसी तरह जैसे आपने vendor और system पार्टीशन के लिए किया है. एवीबी को चालू करने के लिए, इन बिल्ड फ़्लैग को शामिल करें: BOARD_AVB_PRODUCT_ADD_HASHTREE_FOOTER_ARGS.