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

इस दस्तावेज़ में एक नई Jetpack लाइब्रेरी दी गई है. इससे डेवलपर को SDK टूल के रनटाइम पर माइग्रेट करने में मदद मिलेगी. इसमें बताया गया है कि Android प्लैटफ़ॉर्म के पुराने वर्शन (बनाने से लेकर एक्ज़ीक्यूशन तक) के लिए, SDK टूल का रनटाइम किस तरह से इस्तेमाल किया जाएगा. साथ ही, यह भी बताया गया है कि रनटाइम एनवायरमेंट डेवलपर में किस तरह के अंतर या सीमाएं हो सकती हैं. इस लाइब्रेरी की मदद से, डेवलपर अपने ऐप्लिकेशन या SDK टूल का सिंगल वर्शन बना सकते हैं. इसमें, SDK टूल के रनटाइम के साथ या उसके बिना, उन डिवाइसों पर चलाने की सुविधा शामिल है.

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

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

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

  • SDK टूल के लिए रनटाइम की सेवा देने वाली कंपनी की लाइब्रेरी (androidx.privacysandbox.sdkruntime:sdkruntime-provider), SDK टूल के लिए एक एपीआई उपलब्ध कराती है. इसकी मदद से, SDK टूल रनटाइम क्लाइंट लाइब्रेरी से कॉन्टेंट लोड करने की अनुमति दी जाती है.

बंडलटूल की मदद से SDK टूल की डिलीवरी

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

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

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

SDK टूल की रनटाइम क्लाइंट लाइब्रेरी का इस्तेमाल करके, SDK टूल लोड करें

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

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

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

एसेट से SDK टूल एक्सट्रैक्ट करें

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

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

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

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

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

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

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

SDK टूल का एनवायरमेंट

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

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

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

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

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

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

SDK टूल के संसाधन

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

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

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

Java के संसाधन

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

SDK टूल की ऐसेट

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

SDK टूल का स्टोरेज

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

यह कॉन्टेक्स्ट SandboxedSdkProviderCompat#getContext से लिया जा सकता है.

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

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

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

SdkSandboxControllerCompat

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

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

वर्शन

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

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

SDKRuntime Client लाइब्रेरी के किसी भी वर्शन को, SDKRuntime Provider लाइब्रेरी के किसी भी वर्शन के साथ-साथ इसी तरह लोड किया जा सकता है.

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

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