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

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

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

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

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

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

বান্ডেলটুল দিয়ে 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 ) এক্সট্র্যাক্ট করা হয়েছে কিনা, এবং যদি না হয়, তাহলে সেগুলি অ্যাসেট থেকে এক্সট্র্যাক্ট করে।

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

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

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

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

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

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

SDK পরিবেশ

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

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

SDK রানটাইম পরিবেশে কম্প্যাট প্রোভাইডার লোড করার জন্য আপনাকে SDK প্রোভাইডার হিসেবে SandboxedSdkProviderAdapter ব্যবহার করতে হবে।

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

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

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

SDK রিসোর্স

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

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

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

জাভা রিসোর্স

অ্যাপ প্রক্রিয়ায় 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 ক্লায়েন্ট লাইব্রেরি অ্যাপ প্রক্রিয়ায় লোড করা বান্ডিল করা SDK-গুলিতে SdkSandboxControllerCompat বাস্তবায়ন প্রদান করে।

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

সংস্করণকরণ

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

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

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

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

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

{% অক্ষরে অক্ষরে %} {% এন্ডভারব্যাটিম %} {% অক্ষরে অক্ষরে %} {% এন্ডভারব্যাটিম %}