SDK टूल के रनटाइम के साथ पुराने सिस्टम के साथ काम करने की सुविधा

इस दस्तावेज़ में, नई Jetpack लाइब्रेरी का सुझाव दिया गया है. इससे डेवलपर को SDK Runtime पर माइग्रेट करने में मदद मिलेगी. इसमें बताया गया है कि एसडीके टूल का रनटाइम, Android के पुराने वर्शन पर कैसे काम करेगा. साथ ही, यह भी बताया गया है कि रनटाइम एनवायरमेंट में डेवलपर को कौनसे अंतर या सीमाएं देखने को मिल सकती हैं. इस लाइब्रेरी की मदद से डेवलपर, अपने ऐप्लिकेशन या SDK टूल का एक ऐसा वर्शन बना सकते हैं जो SDK टूल के रनटाइम की सुविधा वाले और बिना सुविधा वाले डिवाइसों पर काम कर सके.

पुराने सिस्टम के साथ काम करने की सुविधा के लिए, इन कॉम्पोनेंट का इस्तेमाल किया जाता है:

  • Android Gradle Plugin (AGP) + Bundletool, SDK Runtime की सुविधा के बिना काम करने वाले डिवाइसों के लिए ऐप्लिकेशन का एक वैरिएंट बनाता है. इसके लिए, वह SDK Runtime को APK में बंडल करता है.

  • SDK Runtime क्लाइंट लाइब्रेरी (androidx.privacysandbox.sdkruntime:sdkruntime-client) ऐप्लिकेशन ऐसेट से बंडल किए गए SDK टूल को लोड करती है. साथ ही, SDK Runtime की सुविधा के बिना काम करने वाले डिवाइसों पर SDK Runtime की नकल करती है.

  • SDK Runtime provider library (androidx.privacysandbox.sdkruntime:sdkruntime-provider) एसडीके के लिए एक एपीआई उपलब्ध कराती है. इससे एसडीके, SDK Runtime client library से लोड हो पाते हैं.

Bundletool की मदद से एसडीके डिलीवर करना

जिन डिवाइसों पर SDK Runtime काम करता है उन पर एसडीके, अलग-अलग पैकेज के तौर पर डिलीवर और इंस्टॉल किए जाएंगे.

SDK Runtime की सुविधा के बिना काम करने वाले प्लैटफ़ॉर्म वर्शन के लिए, Bundletool, ऐप्लिकेशन के APK सेट के एक या इससे ज़्यादा वैरिएंट बनाएगा. इनमें वे सभी एसडीके शामिल होंगे जिन पर ऐप्लिकेशन निर्भर करता है. हर एसडीके को अलग-अलग APK स्प्लिट के तौर पर पैकेज किया जाता है. इसके अलावा, ये बदलाव किए जाते हैं:

  1. एसडीके के बाइटकोड (DEX) फ़ाइलों को, एसडीके स्प्लिट में ऐसेट के तौर पर कॉपी करें.
  2. एसडीके टूल की Java रिसॉर्स फ़ाइलों को ऐसेट के तौर पर एसडीके स्प्लिट में कॉपी करें.
  3. SDK टूल के संसाधनों को फिर से मैप करें और उन्हें ऐप्लिकेशन के संसाधनों के साथ मर्ज करें.
  4. SDK Runtime की क्लाइंट लाइब्रेरी के लिए कॉन्फ़िगरेशन जनरेट करें.

एसडीके रनटाइम की क्लाइंट लाइब्रेरी की मदद से एसडीके लोड करना

एसडीके रनटाइम की क्लाइंट लाइब्रेरी, प्लैटफ़ॉर्म एपीआई जैसे एपीआई उपलब्ध कराती है. हालांकि, ये एसडीके रनटाइम एनवायरमेंट में मौजूद एसडीके और वैरिएंट ऐप्लिकेशन के साथ बंडल किए गए एसडीके, दोनों के साथ काम करते हैं.

SDK Runtime क्लाइंट लाइब्रेरी का इस्तेमाल करने के लिए, androidx.privacysandbox.sdkruntime:sdkruntime-client डिपेंडेंसी जोड़ें. इसके बाद, SdkSandboxManager के बजाय SdkSandboxManagerCompat का इस्तेमाल करें.

जब कोई ऐप्लिकेशन किसी एसडीके को लोड करने की कोशिश करता है, तो लाइब्रेरी सबसे पहले यह देखती है कि एसडीके को बिल्ड के दौरान ऐप्लिकेशन के साथ बंडल किया गया था या नहीं. अगर इसे बंडल किया गया था, तो लाइब्रेरी, एसडीके को एसडीके स्प्लिट से निकालती है और उसे ऐप्लिकेशन प्रोसेस में लोड करती है. अगर एसडीके को ऐप्लिकेशन के साथ बंडल नहीं किया गया था, तो लाइब्रेरी, एसडीके को लोड करने के लिए प्लैटफ़ॉर्म एपीआई को सौंप देती है.

ऐसेट से एसडीके टूल निकालना

जब कोई ऐप्लिकेशन, बंडल किए गए SDK टूल को लोड करने की कोशिश करता है, तो SDK टूल के रनटाइम की क्लाइंट लाइब्रेरी यह देखती है कि SDK टूल की DEX फ़ाइलें पहले से ही डिवाइस स्टोरेज (code_cache) में एक्सट्रैक्ट की गई हैं या नहीं. अगर ऐसा नहीं है, तो वह उन्हें ऐसेट से एक्सट्रैक्ट करती है.

आम तौर पर, लाइब्रेरी ऐप्लिकेशन के इंस्टॉल या अपडेट होने के बाद, फ़ाइलों को सिर्फ़ एक बार एक्सट्रैक्ट करती है.

अगर उपलब्ध स्टोरेज स्पेस, तय सीमा (फ़िलहाल 100 एमबी) से कम है और कोई DEX फ़ाइल नहीं निकाली जाती है, तो लाइब्रेरी उन डिवाइसों पर ऐसेट से सीधे तौर पर SDK टूल लोड करने की कोशिश करती है जिन पर यह काम करता है (API 27 और इसके बाद के वर्शन). इससे मेमोरी का इस्तेमाल ज़्यादा होता है.

SDK टूल की क्लास के लिए क्लासलोडर

एसडीके टूल और ऐप्लिकेशन क्लास के बीच टकराव से बचने के लिए, सभी एसडीके क्लास को अलग क्लासलोडर का इस्तेमाल करके लोड किया जाता है. यह मुख्य ऐप्लिकेशन क्लासलोडर से पूरी तरह से अलग होता है.

SDK टूल के रनटाइम के मौजूदा डिज़ाइन में, किसी ऐप्लिकेशन और SDK टूल के बीच सभी कम्यूनिकेशन, Binder IPC कॉल का इस्तेमाल करके होते हैं. बंडल किए गए एसडीके के लिए, एक ही एसडीके बाइंडर ऑब्जेक्ट का इस्तेमाल किया जाता है. साथ ही, बाइंडर ट्रांज़ैक्शन सीरियलाइज़ेशन की मदद से ऐप्लिकेशन डेवलपर, ऐप्लिकेशन साइड पर एसडीके बाइंडर ऑब्जेक्ट को एसडीके बाइंडर इंटरफ़ेस में कास्ट कर सकते हैं.

अन्य इंटरनल इंटरैक्शन (जैसे कि एसडीके को शुरू करना, एसडीके को कंट्रोलर एपीआई उपलब्ध कराना वगैरह) के लिए, लाइब्रेरी अलग-अलग क्लासलोडर पर काम करने के लिए, रिफ़्लेक्शन और डाइनैमिक प्रॉक्सी का इस्तेमाल करती है.

एसडीके एनवायरमेंट

SDKRuntime Provider लाइब्रेरी, एसडीके डेवलपर को एपीआई उपलब्ध कराती है. ये एपीआई, प्लैटफ़ॉर्म एपीआई की तरह ही होते हैं. हालांकि, ये एसडीके को SDK Runtime एनवायरमेंट और SDKRuntime Client library, दोनों से लोड करने की अनुमति देते हैं.

लाइब्रेरी SDK टूल का इस्तेमाल करने के लिए, आपको androidx.privacysandbox.sdkruntime:sdkruntime-provider डिपेंडेंसी जोड़नी होगी. साथ ही, SandboxedSdkProvider के बजाय SandboxedSdkProviderCompat को बढ़ाना होगा.

आपको SDK टूल की सेवा देने वाली कंपनी के तौर पर SandboxedSdkProviderAdapter का इस्तेमाल भी करना होगा, ताकि SDK Runtime एनवायरमेंट में कंपैटिबिलिटी की सुविधा देने वाली कंपनी को लोड किया जा सके.

SdkSandboxControllerCompat, एसडीके टूल के SDK Runtime में लोड होने पर, प्लैटफ़ॉर्म एपीआई को डेलिगेट करता है. वहीं, बंडल किए गए एसडीके टूल के तौर पर लोड होने पर, SDKRuntime Client लाइब्रेरी को डेलिगेट करता है.

बंडल किए गए एसडीके के लिए, लाइब्रेरी एसडीके एनवायरमेंट में इस तरह बदलाव करती है कि वह एसडीके रनटाइम एनवायरमेंट की तरह काम करे.

अगले सेक्शन में, SDKRuntime Client library से SDK लोड होने पर, उम्मीद के मुताबिक होने वाले व्यवहार के बारे में बताया गया है.

एसडीके टूल के संसाधन

एसडीके के संसाधन (res/) तब काम करते हैं, जब एसडीके को ऐप्लिकेशन प्रोसेस में लोड किया जाता है. Bundletool, सभी एसडीके के संसाधनों को ऐप्लिकेशन के संसाधनों के साथ मर्ज करता है.

कॉन्फ़्लिक्ट से बचने के लिए, एसडीके के संसाधनों को फिर से मैप किया जाता है. इसके लिए, सभी संसाधन आईडी में packageId प्रीफ़िक्स बदल दिया जाता है.

जब एसडीके को SDKRuntime Client लाइब्रेरी लोड करती है, तब रनटाइम में packageId अपडेट हो जाता है. इससे R क्लास का इस्तेमाल करके, फिर से मैप किए गए संसाधनों को ऐक्सेस किया जा सकता है.

Java के संसाधन

ऐप्लिकेशन प्रोसेस में एसडीके लोड होने पर, Java संसाधनों का इस्तेमाल किया जा सकता है. Bundletool, सभी एसडीके Java संसाधनों को ऐप्लिकेशन ऐसेट में मौजूद किसी खास डायरेक्ट्री में कॉपी करता है. SDKRuntime Client लाइब्रेरी, इंटरमीडिएट क्लासलोडर का इस्तेमाल करती है. इससे Java रिसॉर्स से जुड़े सभी कॉल को नए रूट डायरेक्ट्री पर रीडायरेक्ट किया जा सकता है.

एसडीके ऐसेट

SDK टूल की ऐसेट को ऐप्लिकेशन की ऐसेट के साथ मर्ज कर दिया जाता है. इसके लिए, रीमैपिंग की ज़रूरत नहीं होती.

एसडीके स्टोरेज

एसडीके टूल के स्टोरेज की सुविधा के लिए, एसडीके टूल के रनटाइम की क्लाइंट लाइब्रेरी, ऐप्लिकेशन के स्टोरेज में बंडल किए गए हर एसडीके टूल के लिए एक रूट डायरेक्ट्री बनाती है. साथ ही, एक खास कॉन्टेक्स्ट उपलब्ध कराती है, जो इस डायरेक्ट्री को स्टोरेज रूट के तौर पर इस्तेमाल करता है.

इस कॉन्टेक्स्ट को SandboxedSdkProviderCompat#getContext से वापस पाया जा सकता है.

स्टोरेज से जुड़े इन तरीकों का इस्तेमाल किया जा सकता है:

  • getDataDir
  • getCacheDir
  • getCodeCacheDir
  • getNoBackupFilesDir
  • getDir
  • getFilesDir
  • openFileInput
  • openFileOutput
  • deleteFile
  • getFileStreamPath
  • fileList
  • getDatabasePath
  • openOrCreateDatabase
  • moveDatabaseFrom - सिर्फ़ एसडीके के कॉन्टेक्स्ट के बीच
  • deleteDatabase
  • databaseList
  • getSharedPreferences
  • moveSharedPreferencesFrom - सिर्फ़ एसडीके के कॉन्टेक्स्ट के बीच
  • deleteSharedPreferences

डिवाइस के सुरक्षित स्टोरेज का कॉन्टेक्स्ट बनाने के लिए, उस कॉन्टेक्स्ट पर createDeviceProtectedStorageContext() को कॉल किया जा सकता है.

SdkSandboxControllerCompat

SDKRuntime Client लाइब्रेरी, ऐप्लिकेशन प्रोसेस में लोड किए गए बंडल किए गए एसडीके के लिए SdkSandboxControllerCompat लागू करने की सुविधा देती है.

अगर क्लाइंट लाइब्रेरी में एपीआई काम नहीं करते हैं (उदाहरण के लिए, ऐप्लिकेशन के वर्शन से ज़्यादा नए वर्शन वाली लाइब्रेरी से बनाया गया एसडीके), तो सबसे सही फ़ॉलबैक का इस्तेमाल किया जाएगा (नो-ऑप या अपवाद).

वर्शन

जब SDKRuntime Client लाइब्रेरी, बंडल किए गए SDK टूल को लोड करती है, तब वह SDK के अंदर मौजूद SDKRuntime Provider लाइब्रेरी के साथ हैंडशेक करती है. हैंडशेक के दौरान, लाइब्रेरी अपने वर्शन का आदान-प्रदान करती हैं. साथ ही, अनुपलब्ध एपीआई को सबसे सही फ़ॉलबैक (नो-ऑप या अपवाद) से बदलने के लिए, अपने व्यवहार में बदलाव करती हैं.

हमारा सुझाव है कि ऐप्लिकेशन और एसडीके डेवलपर, दोनों ही लाइब्रेरी के सबसे नए वर्शन का इस्तेमाल करें. ऐसा न करने पर, हो सकता है कि कुछ ऐसी सुविधाएं उपलब्ध न हों जिनके लिए दोनों की मदद की ज़रूरत होती है.

SDKRuntime Client लाइब्रेरी का कोई भी वर्शन, SDKRuntime Provider लाइब्रेरी के किसी भी वर्शन वाले एसडीके को लोड कर सकता है. इसके उलट भी ऐसा किया जा सकता है.

आने वाले समय में, इसे क्लाइंट लाइब्रेरी के उस सबसे पुराने वर्शन में बदल दिया जाएगा जो एसडीके को, सेवा देने वाली कंपनी की लाइब्रेरी के किसी खास वर्शन के साथ लोड करने के लिए ज़रूरी है.

इससे फ़्रैगमेंटेशन कम होगा. साथ ही, यह पक्का करने में मदद मिलेगी कि बंडल किए गए SDK टूल के लोड होने पर, ज़्यादातर एपीआई काम करेंगे.