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 टूल के रनटाइम क्लाइंट लाइब्रेरी से लोड करने की अनुमति देते हैं.

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

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

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

  1. SDK टूल के स्प्लिट किए गए SDK टूल की बाइट कोड (DEX) फ़ाइलों को ऐसेट के तौर पर कॉपी करें.
  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 टूल से जोड़ना वगैरह) लाइब्रेरी, Reflection और अलग-अलग क्लासलोडर पर काम करने के लिए डाइनैमिक प्रॉक्सी.

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

SDKRuntime प्रोवाइडर की लाइब्रेरी से, SDK टूल डेवलपर को एपीआई उपलब्ध कराए जाते हैं. ये एपीआई हैं यह प्लैटफ़ॉर्म एपीआई की तरह ही होता है, लेकिन SDK टूल को दोनों रनटाइम से लोड करने की अनुमति देता है एनवायरमेंट और 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 टूल की रनटाइम क्लाइंट लाइब्रेरी ऐप्लिकेशन के स्टोरेज में बंडल किए गए हर एसडीके के लिए रूट डायरेक्ट्री और एक खास कॉन्टेक्स्ट के हिसाब से तय किया जाता है, जो इस डायरेक्ट्री को स्टोरेज रूट के तौर पर इस्तेमाल करता है.

इस संदर्भ को यहां से लिया जा सकता है 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 टूल पर लागू करना.

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

वर्शन

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

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

SDKRuntime क्लाइंट लाइब्रेरी का कोई भी वर्शन, SDK टूल को किसी भी के वर्शन की मदद से.

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

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