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

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

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

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

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

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

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

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

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

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

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

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

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

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

ऐसेट से SDK टूल एक्सट्रैक्ट करना

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

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

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

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

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

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

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

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

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

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

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

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

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

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

एसडीके से जुड़े संसाधन

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

समस्याओं से बचने के लिए, packageId को बदलकर SDK टूल के संसाधनों को फिर से मैप किया जाता है का उपयोग करें.

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

Java के संसाधन

ऐप्लिकेशन प्रोसेस में SDK टूल के लोड होने पर, Java के संसाधनों का इस्तेमाल किया जा सकता है. बंडलटूल, 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 क्लाइंट लाइब्रेरी से SdkSandboxControllerCompat ऐप्लिकेशन प्रोसेस में लोड किए गए बंडल किए गए SDK टूल पर लागू करना.

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

वर्शन

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

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

SDKRuntime क्लाइंट लाइब्रेरी का कोई भी वर्शन, SDKRuntime की सेवा देने वाली कंपनी की लाइब्रेरी के किसी भी वर्शन के साथ SDK टूल को लोड कर सकता है. इसके अलावा, SDK टूल का कोई भी वर्शन, SDKRuntime की सेवा देने वाली कंपनी की लाइब्रेरी के किसी भी वर्शन के साथ लोड किया जा सकता है.

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

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