SDK রানটাইমের জন্য পশ্চাদগামী সামঞ্জস্য

এই ডকুমেন্টটি একটি নতুন Jetpack লাইব্রেরি প্রস্তাব করে যাতে ডেভেলপারদের SDK রানটাইমে মাইগ্রেশন করতে সাহায্য করা যায়। এটি ব্যাখ্যা করে যে কীভাবে SDK রানটাইম পূর্ববর্তী অ্যান্ড্রয়েড প্ল্যাটফর্ম সংস্করণগুলির জন্য সমর্থিত হবে (বিল্ড থেকে কার্যকর করা পর্যন্ত), এবং রানটাইম পরিবেশে বিকাশকারীরা কোন পার্থক্য বা সীমাবদ্ধতা আশা করতে পারে। এই লাইব্রেরিটি ডেভেলপারদের তাদের অ্যাপ বা SDK এর একটি একক সংস্করণ তৈরি করতে দেয় যাতে SDK রানটাইম সমর্থন সহ বা ছাড়া ডিভাইসে চালানোর ক্ষমতা অন্তর্ভুক্ত থাকে।

নিম্নলিখিত উপাদানগুলির মাধ্যমে পিছনের সামঞ্জস্যতা অর্জন করা হয়:

  • Android Gradle Plugin (AGP) + Bundletool SDK রানটাইমকে APK-তে বান্ডেল করে SDK রানটাইম সমর্থন ছাড়াই ডিভাইসগুলির জন্য একটি অ্যাপ ভেরিয়েন্ট তৈরি করে।

  • SDK রানটাইম ক্লায়েন্ট লাইব্রেরি ( androidx.privacysandbox.sdkruntime:sdkruntime-client ) অ্যাপ সম্পদ থেকে বান্ডিল করা SDK লোড করে এবং SDK রানটাইম সমর্থন ছাড়াই ডিভাইসে SDK রানটাইম অনুকরণ করে।

  • SDK রানটাইম প্রদানকারী লাইব্রেরি ( androidx.privacysandbox.sdkruntime:sdkruntime-provider ) SDK-এর জন্য একটি API প্রদান করে যাতে SDK রানটাইম ক্লায়েন্ট লাইব্রেরি থেকে লোড করা যায়।

Bundletool সহ SDK ডেলিভারি

SDK রানটাইম সমর্থন সহ ডিভাইসগুলিতে, SDKগুলি আলাদা প্যাকেজ হিসাবে বিতরণ এবং ইনস্টল করা হবে।

SDK রানটাইম সমর্থনের অভাব রয়েছে এমন প্ল্যাটফর্ম সংস্করণগুলিকে সমর্থন করার জন্য, Bundletool অ্যাপ APK সেটের এক বা একাধিক রূপ তৈরি করবে যাতে অ্যাপটি নির্ভর করে এমন সমস্ত SDK অন্তর্ভুক্ত করে। প্রতিটি SDK আলাদা APK বিভক্ত হিসাবে প্যাকেজ করা হয়। তদুপরি, নিম্নলিখিত রূপান্তরগুলি সঞ্চালিত হয়:

  1. SDK বাইটকোড (DEX) ফাইলগুলিকে সম্পদ হিসাবে SDK ভাগে অনুলিপি করুন৷
  2. SDK জাভা সংস্থানগুলিকে সম্পদ হিসাবে SDK ভাগে অনুলিপি করুন৷
  3. SDK সংস্থানগুলিকে রিম্যাপ করুন এবং সেগুলিকে অ্যাপ সংস্থানগুলির সাথে মার্জ করুন৷
  4. SDK রানটাইম ক্লায়েন্ট লাইব্রেরির জন্য কনফিগারেশন তৈরি করুন।

SDK রানটাইম ক্লায়েন্ট লাইব্রেরি দিয়ে SDK লোড করুন

SDK রানটাইম ক্লায়েন্ট লাইব্রেরি এমন API সরবরাহ করে যা প্ল্যাটফর্ম API-এর মতো, কিন্তু SDK রানটাইম পরিবেশে SDK এবং ভেরিয়েন্ট অ্যাপের সাথে সংযুক্ত SDK উভয়কেই সমর্থন করে।

SDK রানটাইম ক্লায়েন্ট লাইব্রেরি ব্যবহার করতে, নির্ভরতা যোগ করুন androidx.privacysandbox.sdkruntime:sdkruntime-client , এবং SdkSandboxManager এর পরিবর্তে SdkSandboxManagerCompat ব্যবহার করুন।

যখন একটি অ্যাপ একটি SDK লোড করার চেষ্টা করে, লাইব্রেরি প্রথমে পরীক্ষা করে যে বিল্ড করার সময় SDK অ্যাপটির সাথে বান্ডিল ছিল কিনা। যদি এটি বান্ডিল করা হয়, লাইব্রেরি SDK বিভক্ত থেকে SDK বের করে এবং অ্যাপ প্রক্রিয়াতে লোড করে। যদি SDK অ্যাপের সাথে বান্ডেল করা না থাকে, তাহলে লাইব্রেরি SDK লোড করার জন্য প্ল্যাটফর্ম APIকে অর্পণ করে।

সম্পদ থেকে একটি SDK বের করুন

যখন একটি অ্যাপ বান্ডিল SDK লোড করার চেষ্টা করে, তখন SDK রানটাইম ক্লায়েন্ট লাইব্রেরি চেক করে যে SDK-এর DEX ফাইলগুলি ইতিমধ্যেই ডিভাইস স্টোরেজে ( code_cache ) এক্সট্র্যাক্ট করা হয়েছে কিনা এবং যদি না হয়, তাহলে সেগুলি সম্পদ থেকে বের করে।

লাইব্রেরি সাধারণত একটি অ্যাপ ইনস্টলেশন বা আপডেটের পরে শুধুমাত্র একবার ফাইলগুলি বের করবে।

যদি উপলব্ধ স্টোরেজ স্পেস অনুমোদিত থ্রেশহোল্ডের কম হয় (বর্তমানে 100 MB) এবং কোনও DEX ফাইল বের করা না হয়, তাহলে লাইব্রেরি সমর্থিত ডিভাইসে (API 27+) সম্পদ থেকে সরাসরি SDK লোড করার চেষ্টা করে। এটি একটি বৃহত্তর মেমরি ফুটপ্রিন্ট ফলাফল.

SDK ক্লাসের জন্য ক্লাসলোডার

SDK এবং অ্যাপ ক্লাসের মধ্যে দ্বন্দ্ব এড়ানোর জন্য, সমস্ত SDK ক্লাস একটি আলাদা ক্লাসলোডার ব্যবহার করে লোড করা হয় যা মূল অ্যাপ ক্লাসলোডার থেকে সম্পূর্ণ স্বাধীন।

বর্তমান SDK রানটাইম ডিজাইনে, একটি অ্যাপ এবং SDK-এর মধ্যে সমস্ত যোগাযোগ বাইন্ডার আইপিসি কল ব্যবহার করে হয়। একই SDK বাইন্ডার অবজেক্টগুলি বান্ডিল SDK-এর জন্য ব্যবহার করা হয় এবং বাইন্ডার লেনদেন সিরিয়ালাইজেশন অ্যাপ ডেভেলপারদের অ্যাপের পাশে SDK বাইন্ডার ইন্টারফেসে SDK বাইন্ডার অবজেক্টগুলি কাস্ট করতে দেয়।

অন্যান্য অভ্যন্তরীণ মিথস্ক্রিয়াগুলির জন্য (যেমন একটি SDK সূচনা করা, একটি SDK-তে একটি নিয়ামক API প্রদান ইত্যাদি) লাইব্রেরি বিভিন্ন ক্লাসলোডার জুড়ে কাজ করার জন্য প্রতিফলন এবং ডায়নামিক প্রক্সি ব্যবহার করে।

SDK পরিবেশ

SDKRuntime প্রোভাইডার লাইব্রেরি SDK ডেভেলপারদের API প্রদান করে। এই APIগুলি প্ল্যাটফর্ম APIগুলির অনুরূপ, কিন্তু SDK-কে SDK রানটাইম পরিবেশ এবং SDKRuntime ক্লায়েন্ট লাইব্রেরি উভয় দ্বারা লোড করার অনুমতি দেয়৷

লাইব্রেরি SDK ব্যবহার করতে সক্ষম হওয়ার জন্য, আপনাকে androidx.privacysandbox.sdkruntime:sdkruntime-provider নির্ভরতা যোগ করতে হবে এবং SandboxedSdkProvider এর পরিবর্তে SandboxedSdkProviderCompat প্রসারিত করতে হবে।

SDK রানটাইম পরিবেশে কম্প্যাট প্রদানকারীকে লোড করার অনুমতি দেওয়ার জন্য আপনাকে SDK প্রদানকারী হিসাবে SandboxedSdkProviderAdapter ব্যবহার করতে হবে।

যখন SDK রানটাইমে SDK লোড করা হয় তখন SdkSandboxControllerCompat প্ল্যাটফর্ম API-এ অর্পণ করে বা SDK-কে বান্ডিল SDK হিসাবে লোড করা হলে SDKRuntime ক্লায়েন্ট লাইব্রেরিতে প্রতিনিধিত্ব করে।

বান্ডিল করা SDK-এর জন্য, লাইব্রেরি SDK পরিবেশকে এমনভাবে পরিবর্তন করে যা SDK রানটাইম পরিবেশের মতো আচরণ অনুকরণ করে।

পরবর্তী বিভাগগুলি প্রত্যাশিত আচরণ বর্ণনা করে যখন SDK SDKRuntime ক্লায়েন্ট লাইব্রেরি দ্বারা লোড করা হয়।

SDK সম্পদ

অ্যাপ প্রক্রিয়ায় SDK লোড হলে SDK সম্পদ (res/) সমর্থিত হয়। Bundletool সমস্ত SDK-এর সংস্থানগুলিকে অ্যাপ সংস্থানগুলির সাথে একত্রিত করে৷

দ্বন্দ্ব এড়াতে, সমস্ত রিসোর্স আইডিতে packageId প্রিফিক্স পরিবর্তন করে SDK সংস্থানগুলিকে রিম্যাপ করা হয়।

যখন SDK SDKRuntime ক্লায়েন্ট লাইব্রেরি দ্বারা লোড করা হয়, packageId রানটাইমে আপডেট করা হয় যাতে R ক্লাস ব্যবহার করে রিম্যাপ করা সংস্থানগুলিকে অ্যাড্রেসিং করার অনুমতি দেওয়া হয়।

জাভা সম্পদ

যখন অ্যাপ প্রক্রিয়ায় SDK লোড হয় তখন জাভা সংস্থানগুলি সমর্থিত হয়। Bundletool অ্যাপ সম্পদের একটি বিশেষ ডিরেক্টরিতে সমস্ত SDK জাভা সংস্থান কপি করে। SDKRuntime ক্লায়েন্ট লাইব্রেরি নতুন রুট ডিরেক্টরিতে জাভা রিসোর্স-সম্পর্কিত সমস্ত কল পুনঃনির্দেশিত করতে একটি মধ্যবর্তী ক্লাসলোডার ব্যবহার করে।

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গুলিকে।

যদি API গুলি ক্লায়েন্ট লাইব্রেরি দ্বারা সমর্থিত না হয় (উদাহরণস্বরূপ, অ্যাপ সংস্করণের চেয়ে লাইব্রেরির সাম্প্রতিক সংস্করণের সাথে নির্মিত একটি SDK সহ), সবচেয়ে উপযুক্ত ফলব্যাক ব্যবহার করা হবে (কোনও অপশন বা ব্যতিক্রম)।

সংস্করণ করা

যখন SDKRuntime ক্লায়েন্ট লাইব্রেরি একটি বান্ডিল SDK লোড করে তখন এটি SDK-এর ভিতরে SDKRuntime প্রদানকারী লাইব্রেরির সাথে হ্যান্ডশেক করে। হ্যান্ডশেকের সময়, লাইব্রেরিগুলি তাদের সংস্করণগুলি বিনিময় করে এবং সবচেয়ে উপযুক্ত ফলব্যাক (নো-অপ বা ব্যতিক্রম) সহ অনুপলব্ধ APIগুলিকে প্রতিস্থাপন করতে আচরণ সামঞ্জস্য করে।

অ্যাপ এবং SDK বিকাশকারী উভয়ের জন্যই লাইব্রেরির সাম্প্রতিকতম সংস্করণ ব্যবহার করা বাঞ্ছনীয়, অন্যথায় উভয় অংশে সমর্থন প্রয়োজন এমন কার্যকারিতা উপলব্ধ নাও হতে পারে।

SDKRuntime ক্লায়েন্ট লাইব্রেরির যেকোনো সংস্করণ SDKRuntime প্রদানকারী লাইব্রেরির যেকোনো সংস্করণের সাথে এবং অন্যভাবে একটি SDK লোড করতে পারে।

ভবিষ্যতে এটি প্রদানকারী লাইব্রেরির একটি নির্দিষ্ট সংস্করণের সাথে SDK লোড করার জন্য প্রয়োজনীয় ন্যূনতম ক্লায়েন্ট লাইব্রেরি সংস্করণে পরিবর্তন করা হবে।

এটি ফ্র্যাগমেন্টেশন কমিয়ে আনবে এবং বান্ডিল করা SDK সফলভাবে লোড হলে অধিকাংশ API সমর্থিত হবে তা নিশ্চিত করতে সাহায্য করবে।

{% শব্দার্থে %} {% endverbatim %} {% শব্দার্থে %} {% endverbatim %}