| মূল ধারণা | আপনার উন্নয়ন পরিবেশ সেট আপ করুন | একটি RE SDK তৈরি করুন | RE SDK ব্যবহার করুন | পরীক্ষা, এবং বিতরণের জন্য বিল্ডিং |
| মূল ধারণা | আপনার উন্নয়ন পরিবেশ সেট আপ করুন | একটি RE SDK তৈরি করুন | RE SDK ব্যবহার করুন | পরীক্ষা, এবং বিতরণের জন্য বিল্ডিং |
একটি রানটাইম-সক্ষম SDK তৈরি করুন
রানটাইম-সক্ষম SDK তৈরি করতে আপনাকে নিম্নলিখিত পদক্ষেপগুলি সম্পূর্ণ করতে হবে:
- আপনার প্রকল্পের কাঠামো সেট আপ করুন
- আপনার প্রকল্প এবং মডিউল নির্ভরতা প্রস্তুত করুন
- আপনার SDK ব্যবসায়িক যুক্তি যোগ করুন
- SDK API গুলি সংজ্ঞায়িত করুন
- আপনার SDK এর জন্য একটি এন্ট্রি-পয়েন্ট নির্দিষ্ট করুন
আপনার প্রকল্পের কাঠামো সেট আপ করুন
আমরা সুপারিশ করছি যে আপনার প্রকল্পটি নিম্নলিখিত মডিউলগুলিতে সংগঠিত হোক:
- অ্যাপ মডিউল - আপনার SDK পরীক্ষা এবং বিকাশের জন্য আপনি যে পরীক্ষামূলক অ্যাপটি ব্যবহার করছেন, এটি আপনার আসল অ্যাপ ক্লায়েন্টদের কী থাকবে তা উপস্থাপন করে। আপনার অ্যাপটি বিদ্যমান বিজ্ঞাপন লাইব্রেরি মডিউল ( runtime-aware SDK ) এর উপর নির্ভরশীল হওয়া উচিত।
- বিদ্যমান বিজ্ঞাপন লাইব্রেরি মডিউল (রানটাইম-সচেতন SDK) - একটি Android লাইব্রেরি মডিউল যাতে আপনার বিদ্যমান 'নন-রানটাইম-সক্ষম' SDK লজিক থাকে, এটি একটি স্ট্যাটিক্যালি লিঙ্কযুক্ত SDK।
- শুরু করার জন্য, ক্ষমতাগুলি ভাগ করা যেতে পারে। উদাহরণস্বরূপ, কিছু কোড আপনার বিদ্যমান SDK দ্বারা পরিচালিত হতে পারে, এবং কিছু রানটাইম-সক্ষম SDK-তে রাউট করা যেতে পারে।
- রানটাইম-সক্ষম বিজ্ঞাপন লাইব্রেরি মডিউল - এতে আপনার রানটাইম-সক্ষম SDK ব্যবসায়িক লজিক রয়েছে। এটি অ্যান্ড্রয়েড স্টুডিওতে একটি অ্যান্ড্রয়েড লাইব্রেরি মডিউল হিসাবে তৈরি করা যেতে পারে।
- রানটাইম-সক্ষম ASB মডিউল - রানটাইম-সক্ষম SDK কোডকে একটি ASB-তে বান্ডিল করার জন্য প্যাকেজ ডেটা সংজ্ঞায়িত করে।
- এটি com.android.privacy-sandbox-sdk টাইপ ব্যবহার করে ম্যানুয়ালি তৈরি করতে হবে। আপনি একটি নতুন ডিরেক্টরি তৈরি করে এটি করতে পারেন।
- এই মডিউলটিতে কোনও কোড থাকা উচিত নয় এবং কেবল একটি খালি build.gradle ফাইল থাকা উচিত যা আপনার রানটাইম-সক্ষম বিজ্ঞাপন লাইব্রেরি মডিউলের উপর নির্ভরশীল। এই ফাইলের বিষয়বস্তু আপনার SDK প্রস্তুত করুন বিভাগে সংজ্ঞায়িত করা হয়েছে।
- এই মডিউলটি settings.gradle ফাইলে এবং বিদ্যমান বিজ্ঞাপন লাইব্রেরি মডিউলে অন্তর্ভুক্ত করতে ভুলবেন না।
এই নির্দেশিকায় প্রজেক্ট স্ট্রাকচারটি একটি পরামর্শ, আপনি আপনার SDK এর জন্য একটি ভিন্ন স্ট্রাকচার বেছে নিতে পারেন এবং একই প্রযুক্তিগত নীতি প্রয়োগ করতে পারেন। অ্যাপ এবং লাইব্রেরি মডিউলগুলিতে কোড মডিউলারাইজ করার জন্য আপনি সর্বদা অন্যান্য অতিরিক্ত মডিউল তৈরি করতে পারেন।
আপনার SDK প্রস্তুত করুন
রানটাইম-সক্ষম SDK ডেভেলপমেন্টের জন্য আপনার প্রকল্পটি প্রস্তুত করতে আপনাকে প্রথমে কিছু টুলিং এবং লাইব্রেরি নির্ভরতা সংজ্ঞায়িত করতে হবে:
- SDK রানটাইম ব্যাকওয়ার্ড কম্প্যাটিবিলিটি লাইব্রেরি, যা প্রাইভেসি স্যান্ডবক্স (Android 13 এবং তার নিচের সংস্করণ) নেই এমন ডিভাইসগুলির জন্য সহায়তা প্রদান করে (
androidx.privacysandbox.sdkruntime:) - বিজ্ঞাপন উপস্থাপনা সমর্থন করার জন্য UI লাইব্রেরি (
androidx.privacysandbox.ui:) - SDK API ঘোষণা এবং শিম-জেনারেশন সমর্থন করার জন্য SDK ডেভেলপার টুল (
androidx.privacysandbox.tools:)
রানটাইম-সক্ষম SDK তৈরি করার ক্ষমতা সক্ষম করতে আপনার প্রকল্পের gradle.properties ফাইলে এই পতাকাটি যুক্ত করুন।
# This enables the Privacy Sandbox for your project on Android Studio. android.experimental.privacysandboxsdk.enable=true android.experimental.privacysandboxsdk.requireServices=falseআপনার প্রোজেক্টের build.gradle পরিবর্তন করে সাহায্যকারী Jetpack লাইব্রেরি এবং অন্যান্য নির্ভরতা অন্তর্ভুক্ত করুন:
// Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { ext.kotlin_version = '1.9.10' ext.ksp_version = "$kotlin_version-1.0.13" ext.privacy_sandbox_activity_version = "1.0.0-alpha01" ext.privacy_sandbox_sdk_runtime_version = "1.0.0-alpha13" ext.privacy_sandbox_tools_version = "1.0.0-alpha09" ext.privacy_sandbox_ui_version = "1.0.0-alpha09" repositories { mavenCentral() } dependencies { classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" } } plugins { id 'com.android.application' version '8.4.0-alpha13' apply false id 'com.android.library' version '8.4.0-alpha13' apply false // These two plugins do annotation processing and code generation for the sdk-implementation. id 'androidx.privacysandbox.library' version '1.0.0-alpha02' apply false id 'com.google.devtools.ksp' version "$ksp_version" apply false id 'org.jetbrains.kotlin.jvm' version '1.9.10' apply false } task clean(type: Delete) { delete rootProject.buildDir }এই নির্ভরতাগুলি অন্তর্ভুক্ত করার জন্য রানটাইম-সক্ষম বিজ্ঞাপন লাইব্রেরি (RE SDK) মডিউলে build.gradle ফাইলটি আপডেট করুন।
dependencies { // This allows Android Studio to parse and validate your SDK APIs. ksp "androidx.privacysandbox.tools:tools-apicompiler:$privacy_sandbox_tools_version" // This contains the annotation classes to decorate your SDK APIs. implementation "androidx.privacysandbox.tools:tools:$privacy_sandbox_tools_version" // This is runtime dependency required by the generated server shim code for // backward compatibility. implementation "androidx.privacysandbox.sdkruntime:sdkruntime-provider:$privacy_sandbox_sdk_runtime_version" // These are runtime dependencies required by the generated server shim code as // they use Kotlin. implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.1" implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.1' // This is the core part of the UI library to help with UI notifications. implementation "androidx.privacysandbox.ui:ui-core:$privacy_sandbox_ui_version" // This helps the SDK open sessions for the ad. implementation "androidx.privacysandbox.ui:ui-provider:$privacy_sandbox_ui_version" // This is needed if your SDK implements mediation use cases implementation "androidx.privacysandbox.ui:ui-client:$privacy_sandbox_ui_version" }আপনার রানটাইম-সক্ষম ASB মডিউলে build.gradle ফাইলটি নিম্নলিখিত দিয়ে প্রতিস্থাপন করুন:
plugins { id 'com.android.privacy-sandbox-sdk' } android { compileSdk 34 minSdk 21 bundle { // This is the package name of the SDK that you want to publish. // This is used as the public identifier of your SDK. // You use this later on to load the runtime-enabled SDK packageName = '<package name of your runtime-enabled SDK>' // This is the version of the SDK that you want to publish. // This is used as the public identifier of your SDK version. setVersion(1, 0, 0) // SDK provider defined in the SDK Runtime library. // This is an important part of the future backwards compatibility // support, most SDKs won't need to change it. sdkProviderClassName = "androidx.privacysandbox.sdkruntime.provider.SandboxedSdkProviderAdapter" // This is the class path of your implementation of the SandboxedSdkProviderCompat class. // It's the implementation of your runtime-enabled SDK's entry-point. // If you miss this step, your runtime-enabled SDK will fail to load at runtime: compatSdkProviderClassName = "<your-sandboxed-sdk-provider-compat-fully-qualified-class-name>" } } dependencies { // This declares the dependency on your runtime-enabled ad library module. include project(':<your-runtime-enabled-ad-library-here>') }আপনার বিদ্যমান বিজ্ঞাপন লাইব্রেরি (RA SDK) মডিউলে build.gradle ফাইলটি আপডেট করুন যাতে নিম্নলিখিত নির্ভরতাগুলি অন্তর্ভুক্ত করা যায়:
dependencies { // This declares the client's dependency on the runtime-enabled ASB module. // ⚠️ Important: We depend on the ASB module, not the runtime-enabled module. implementation project(':<your-runtime-enabled-asb-module-here>') // Required for backwards compatibility on devices where SDK Runtime is unavailable. implementation "androidx.privacysandbox.sdkruntime:sdkruntime-client:$privacy_sandbox_sdk_runtime_version" // This is required to display banner ads using the SandboxedUiAdapter interface. implementation "androidx.privacysandbox.ui:ui-core:$privacy_sandbox_ui_version" implementation "androidx.privacysandbox.ui:ui-client:$privacy_sandbox_ui_version" // This is required to use SDK ActivityLaunchers. implementation "androidx.privacysandbox.activity:activity-core:$privacy_sandbox_activity_version" implementation "androidx.privacysandbox.activity:activity-client:$privacy_sandbox_activity_version" }
SDK ব্যবসায়িক যুক্তি যোগ করুন
রানটাইম-সক্ষম বিজ্ঞাপন লাইব্রেরি মডিউলের ভিতরে আপনার SDK-এর ব্যবসায়িক যুক্তি প্রয়োগ করুন, ঠিক যেমনটি আপনি নিয়মিত করেন।
যদি আপনার কাছে একটি বিদ্যমান SDK থাকে যা আপনি মাইগ্রেট করছেন, তাহলে এই পর্যায়ে আপনার ব্যবসায়িক লজিক, ইন্টারফেস এবং সিস্টেম ফেসিং ফাংশনগুলি যতটা ইচ্ছা স্থানান্তর করুন, তবে ভবিষ্যতে সম্পূর্ণ মাইগ্রেশনের জন্য এটি বিবেচনা করুন।
আপনার যদি স্টোরেজ, গুগল প্লে বিজ্ঞাপন আইডি, অথবা অ্যাপ সেট আইডি অ্যাক্সেসের প্রয়োজন হয়, তাহলে নিম্নলিখিত বিভাগগুলি পড়ুন:
আপনার SDK-তে স্টোরেজ API ব্যবহার করুন
SDK রানটাইমের SDK গুলি আর কোনও অ্যাপের অভ্যন্তরীণ স্টোরেজে অ্যাক্সেস করতে, পড়তে বা লিখতে পারে না এবং বিপরীতভাবে।
SDK রানটাইমকে অ্যাপ থেকে আলাদা করে নিজস্ব অভ্যন্তরীণ স্টোরেজ এলাকা বরাদ্দ করা হয়েছে।
SandboxedSdkProvider#getContext() দ্বারা প্রদত্ত Context অবজেক্টের ফাইল স্টোরেজ API ব্যবহার করে SDK গুলি এই পৃথক অভ্যন্তরীণ স্টোরেজ অ্যাক্সেস করতে সক্ষম।
SDK গুলি শুধুমাত্র অভ্যন্তরীণ স্টোরেজ ব্যবহার করতে পারে, তাই শুধুমাত্র অভ্যন্তরীণ স্টোরেজ API গুলি, যেমন Context.getFilesDir() বা Context.getCacheDir() কাজ করে। অভ্যন্তরীণ স্টোরেজ থেকে অ্যাক্সেসে আরও উদাহরণ দেখুন।
SDK রানটাইম থেকে বহিরাগত স্টোরেজ অ্যাক্সেস করা সমর্থিত নয়। বহিরাগত স্টোরেজ অ্যাক্সেস করার জন্য API গুলিকে কল করলে হয় একটি ব্যতিক্রম আসবে অথবা null ফিরে আসবে। নিম্নলিখিত তালিকায় কিছু উদাহরণ রয়েছে:
- স্টোরেজ অ্যাক্সেস ফ্রেমওয়ার্ক ব্যবহার করে ফাইল অ্যাক্সেস করলে একটি SecurityException তৈরি হয়।
-
getExternalFilsDir()সর্বদা শূন্য প্রদান করে।
স্টোরেজের জন্য আপনাকে SandboxedSdkProvider.getContext() দ্বারা ফেরত পাঠানো Context ব্যবহার করতে হবে। অ্যাপ্লিকেশন কনটেক্সটের মতো অন্য কোনও Context অবজেক্ট ইনস্ট্যান্সে ফাইল স্টোরেজ API ব্যবহার করলে সব পরিস্থিতিতে প্রত্যাশা অনুযায়ী কাজ করবে এমন নিশ্চয়তা নেই।
নিম্নলিখিত কোড স্নিপেটটি SDK রানটাইমে স্টোরেজ কীভাবে ব্যবহার করতে হয় তা দেখায়:
class SdkServiceImpl(private val context: Context) : SdkService { override suspend fun getMessage(): String = "Hello from Privacy Sandbox!" override suspend fun createFile(sizeInMb: Int): String { val path = Paths.get( context.dataDir.path, "file.txt" ) withContext(Dispatchers.IO) { Files.deleteIfExists(path) Files.createFile(path) val buffer = ByteArray(sizeInMb * 1024 * 1024) Files.write(path, buffer) } val file = File(path.toString()) val actualFileSize: Long = file.length() / (1024 * 1024) return "Created $actualFileSize MB file successfully" } }
প্রতিটি SDK রানটাইমের জন্য পৃথক অভ্যন্তরীণ স্টোরেজের মধ্যে, প্রতিটি SDK এর নিজস্ব স্টোরেজ ডিরেক্টরি থাকে। প্রতি-SDK স্টোরেজ হল SDK রানটাইমের অভ্যন্তরীণ স্টোরেজের একটি যৌক্তিক পৃথকীকরণ যা প্রতিটি SDK কত স্টোরেজ ব্যবহার করে তা হিসাব করতে সাহায্য করে।
Context অবজেক্টের সমস্ত অভ্যন্তরীণ স্টোরেজ API প্রতিটি SDK এর জন্য একটি স্টোরেজ পাথ প্রদান করে।
Google Play পরিষেবা দ্বারা প্রদত্ত বিজ্ঞাপন আইডি অ্যাক্সেস করুন
যদি আপনার SDK-এর Google Play পরিষেবা দ্বারা প্রদত্ত বিজ্ঞাপন আইডিতে অ্যাক্সেসের প্রয়োজন হয়, তাহলে AdIdManager#getAdId() ব্যবহার করে অ্যাসিঙ্ক্রোনাসভাবে মানটি পুনরুদ্ধার করুন।
Google Play পরিষেবা দ্বারা প্রদত্ত অ্যাপ সেট আইডি অ্যাক্সেস করুন
যদি আপনার SDK-এর Google Play পরিষেবা দ্বারা প্রদত্ত অ্যাপ সেট আইডিতে অ্যাক্সেসের প্রয়োজন হয়, তাহলে অ্যাসিঙ্ক্রোনাসভাবে মানটি পুনরুদ্ধার করতে AppSetIdManager#getAppSetId() ব্যবহার করুন।
SDK API ঘোষণা করুন
আপনার রানটাইম-সক্ষম SDK রানটাইমের বাইরে অ্যাক্সেসযোগ্য হওয়ার জন্য, আপনাকে এমন API সংজ্ঞায়িত করতে হবে যা ক্লায়েন্টরা (RA SDK বা ক্লায়েন্ট অ্যাপ) ব্যবহার করতে পারে।
এই ইন্টারফেসগুলি ঘোষণা করতে টীকা ব্যবহার করুন।
টীকা
নিম্নলিখিত টীকা ব্যবহার করে কোটলিনে SDK API গুলিকে ইন্টারফেস এবং ডেটা ক্লাস হিসাবে ঘোষণা করতে হবে:
| টীকা | |
|---|---|
@PrivacySandboxService |
|
@PrivacySandboxInterface |
|
@PrivacySandboxValue |
|
@PrivacySandboxCallback |
|
রানটাইম-সক্ষম বিজ্ঞাপন লাইব্রেরি মডিউলের ভিতরে যেকোনো জায়গায় আপনাকে এই ইন্টারফেস এবং ক্লাসগুলি সংজ্ঞায়িত করতে হবে।
নিম্নলিখিত বিভাগগুলিতে এই টীকাগুলির ব্যবহার দেখুন।
@PrivacySandboxService
@PrivacySandboxService interface SdkService { suspend fun getMessage(): String suspend fun createFile(sizeInMb: Int): String suspend fun getBanner(request: SdkBannerRequest, requestMediatedAd: Boolean): SdkSandboxedUiAdapter? suspend fun getFullscreenAd(): FullscreenAd }
@PrivacySandboxInterface
@PrivacySandboxInterface interface SdkSandboxedUiAdapter : SandboxedUiAdapter
@PrivacySandboxValue
@PrivacySandboxValue data class SdkBannerRequest( /** The package name of the app. */ val appPackageName: String, /** * An [SdkActivityLauncher] used to launch an activity when the banner is clicked. */ val activityLauncher: SdkActivityLauncher, /** * Denotes if a WebView banner ad needs to be loaded. */ val isWebViewBannerAd: Boolean )
@PrivacySandboxCallback
@PrivacySandboxCallback interface InAppMediateeSdkInterface { suspend fun show() }
সমর্থিত প্রকারগুলি
রানটাইম-সক্ষম SDK API গুলি নিম্নলিখিত ধরণের সমর্থন করে:
- জাভা প্রোগ্রামিং ভাষার সকল আদিম প্রকার (যেমন int, long, char, boolean, ইত্যাদি)
- স্ট্রিং
-
@PrivacySandboxInterfaceঅথবা@PrivacySandboxCallbackদিয়ে টীকাযুক্ত কোটলিন ইন্টারফেস -
@PrivacySandboxValueদিয়ে টীকাযুক্ত কোটলিন ডেটা ক্লাস - java.lang.List - তালিকার সমস্ত উপাদান অবশ্যই সমর্থিত ডেটা টাইপগুলির মধ্যে একটি হতে হবে।
কিছু অতিরিক্ত সতর্কতা রয়েছে:
-
@PrivacySandboxValueদিয়ে টীকাযুক্ত ডেটা ক্লাসে@PrivacySandboxCallbackধরণের ক্ষেত্র থাকতে পারে না। - রিটার্ন টাইপগুলিতে
@PrivacySandboxCallbackদিয়ে টীকাযুক্ত টাইপ থাকতে পারে না। - তালিকায়
@PrivacySandboxInterfaceঅথবা@PrivacySandboxCallbackদিয়ে টীকাযুক্ত ধরণের উপাদান থাকতে পারে না।
অ্যাসিঙ্ক্রোনাস এপিআই
যেহেতু SDK API গুলি সর্বদা একটি পৃথক প্রক্রিয়ায় কল করে, তাই আমাদের নিশ্চিত করতে হবে যে এই কলগুলি ক্লায়েন্টের কলিং থ্রেডকে ব্লক না করে।
এটি অর্জনের জন্য, @PrivacySandboxService , @PrivacySandboxInterface এবং @PrivacySandboxCallback দিয়ে টীকাযুক্ত ইন্টারফেসের সমস্ত পদ্ধতিকে স্পষ্টভাবে অ্যাসিঙ্ক্রোনাস API হিসাবে ঘোষণা করতে হবে।
কোটলিনে অ্যাসিঙ্ক্রোনাস এপিআই দুটি উপায়ে প্রয়োগ করা যেতে পারে:
- সাসপেন্ড ফাংশন ব্যবহার করুন।
- অপারেশন সম্পূর্ণ হলে অথবা অপারেশনের অগ্রগতির সময় অন্যান্য ইভেন্টের বিজ্ঞপ্তি পাওয়া কলব্যাক গ্রহণ করুন। ফাংশনের রিটার্ন টাইপ একটি ইউনিট হতে হবে।
ব্যতিক্রম
SDK API গুলি কোনও ধরণের চেক করা ব্যতিক্রম সমর্থন করে না।
জেনারেট করা শিম কোড SDK দ্বারা নিক্ষেপ করা যেকোনো রানটাইম ব্যতিক্রম ধরে এবং ক্লায়েন্টের কাছে PrivacySandboxException হিসেবে কারণ সম্পর্কে তথ্য সহ তা ফেলে দেয়।
UI লাইব্রেরি
যদি আপনার ব্যানারের মতো বিজ্ঞাপনের ইন্টারফেস থাকে, তাহলে লোড করা বিজ্ঞাপনের জন্য খোলার সেশন সক্ষম করার জন্য আপনাকে SandboxedUiAdapter ইন্টারফেসটিও বাস্তবায়ন করতে হবে।
এই সেশনগুলি ক্লায়েন্ট এবং SDK এর মধ্যে একটি পার্শ্ব চ্যানেল তৈরি করে এবং এগুলি দুটি প্রধান উদ্দেশ্য পূরণ করে:
- যখনই কোনও UI পরিবর্তন ঘটে তখন বিজ্ঞপ্তি পান।
- UI উপস্থাপনায় যেকোনো পরিবর্তন সম্পর্কে ক্লায়েন্টকে অবহিত করুন।
যেহেতু ক্লায়েন্ট আপনার SDK এর সাথে যোগাযোগের জন্য @PrivacySandboxService এর সাথে টীকাযুক্ত ইন্টারফেস ব্যবহার করতে পারে, তাই বিজ্ঞাপন লোড করার জন্য যেকোনো API এই ইন্টারফেসে যোগ করা যেতে পারে।
যখন ক্লায়েন্ট কোনও বিজ্ঞাপন লোড করার অনুরোধ করে, তখন বিজ্ঞাপনটি লোড করুন এবং SandboxedUiAdapter বাস্তবায়নকারী ইন্টারফেসের একটি উদাহরণ ফেরত দিন। এটি ক্লায়েন্টকে সেই বিজ্ঞাপনের জন্য খোলার সেশনের অনুরোধ করতে দেয়।
যখন ক্লায়েন্ট একটি সেশন খোলার অনুরোধ করে, তখন আপনার রানটাইম-সক্ষম SDK বিজ্ঞাপনের প্রতিক্রিয়া এবং প্রদত্ত প্রসঙ্গ ব্যবহার করে একটি বিজ্ঞাপন দৃশ্য তৈরি করতে পারে।
এটি অর্জনের জন্য, এমন একটি ক্লাস তৈরি করুন যা SandboxedUiAdapter.Session ইন্টারফেসটি প্রয়োগ করে এবং যখন SandboxedUiAdapter.openSession() কল করা হয়, তখন নিশ্চিত করুন যে আপনি client.onSessionOpened() কল করছেন, এবং Session ক্লাসের একটি উদাহরণ প্যারামিটার হিসেবে পাস করছেন।
class SdkSandboxedUiAdapterImpl(
private val sdkContext: Context,
private val request: SdkBannerRequest,
) : SdkSandboxedUiAdapter {
override fun openSession(
context: Context,
windowInputToken: IBinder,
initialWidth: Int,
initialHeight: Int,
isZOrderOnTop: Boolean,
clientExecutor: Executor,
client: SandboxedUiAdapter.SessionClient
) {
val session = SdkUiSession(clientExecutor, sdkContext, request)
clientExecutor.execute {
client.onSessionOpened(session)
}
}
}
এই ক্লাসটি যখনই কোনও UI পরিবর্তন হয় তখন বিজ্ঞপ্তি পায়। আপনি এই ক্লাসটি ব্যবহার করে বিজ্ঞাপনের আকার পরিবর্তন করতে পারেন, অথবা কনফিগারেশন কখন পরিবর্তিত হয়েছে তা জানতে পারেন, উদাহরণস্বরূপ।
রানটাইমে UI প্রেজেন্টেশন API সম্পর্কে আরও জানুন।
কার্যকলাপ সহায়তা
প্রাইভেসি স্যান্ডবক্স থেকে SDK-মালিকানাধীন কার্যকলাপ শুরু করতে, আপনাকে SDK API পরিবর্তন করে একটি SdkActivityLauncher অবজেক্ট পেতে হবে, যা UI লাইব্রেরি দ্বারাও সরবরাহ করা হয়।
উদাহরণস্বরূপ, নিম্নলিখিত SDK API-এর ক্রিয়াকলাপ চালু করা উচিত, তাই এটি SdkActivityLauncher প্যারামিটার আশা করে:
@PrivacySandboxInterface
interface FullscreenAd {
suspend fun show(activityLauncher: SdkActivityLauncher)
}
SDK এন্ট্রি-পয়েন্ট
SandboxedSdkProvider অ্যাবস্ট্রাক্ট ক্লাসটি SDK রানটাইম যে API ব্যবহার করে তাতে লোড করা SDK গুলির সাথে ইন্টারঅ্যাক্ট করে তা ধারণ করে।
একটি রানটাইম-সক্ষম SDK-কে এই বিমূর্ত ক্লাসটি বাস্তবায়ন করতে হবে যাতে SDK রানটাইমের সাথে যোগাযোগ করার জন্য একটি এন্ট্রি পয়েন্ট তৈরি করা যায়।
ব্যাকওয়ার্ড কম্প্যাটিবিলিটি সাপোর্টের জন্য, আমরা নিম্নলিখিত ক্লাসগুলি চালু করেছি:
-
SandboxedSdkProviderAdapter, যাSandboxedSdkProviderপ্রসারিত করে এবং SDK রানটাইম উপলব্ধতা নির্বিশেষে SDK লোডিং অনুরোধগুলি পরিচালনা করে। এটি অভ্যন্তরীণভাবে ব্যবহৃত হয়, ASB মডিউলে ঘোষণা করা হয়েছে। -
SandboxedSdkProviderCompat, একটি বিমূর্ত ক্লাস যাSandboxedSdkProviderএর ইন্টারফেসের অনুকরণ করে।
SDK রানটাইমের জন্য ব্যাকওয়ার্ড সামঞ্জস্যতা সম্পর্কে আরও জানুন।
শিম জেনারেশন টুলগুলি বিমূর্ততার আরেকটি স্তর যোগ করে: তারা @PrivacySandboxService দিয়ে আপনার টীকা করা ইন্টারফেস ব্যবহার করে AbstractSandboxedSdkProvider নামে একটি বিমূর্ত ক্লাস তৈরি করে।
এই ক্লাসটি SandboxedSdkProviderCompat প্রসারিত করে এবং আপনার টীকাযুক্ত ইন্টারফেসের মতো একই প্যাকেজের অধীনে।
// Auto-generated code.
abstract class AbstractSandboxedSdkProvider : SandboxedSdkProviderCompat {
abstract fun createMySdk(context: Context): MySdk
}
এই জেনারেটেড ক্লাসটি একটি একক বিমূর্ত কারখানা পদ্ধতি প্রকাশ করে যা একটি Context গ্রহণ করে এবং আপনার এন্ট্রি-পয়েন্ট অ্যানোটেটেড ইন্টারফেসটি ফেরত পাওয়ার আশা করে।
এই পদ্ধতিটি আপনার @PrivacySandboxService ইন্টারফেসের নাম অনুসারে নামকরণ করা হয়েছে, নামের সাথে create যুক্ত করে। উদাহরণস্বরূপ, যদি আপনার ইন্টারফেসের নাম MySdk হয়, তাহলে টুলগুলি createMySdk তৈরি করে।
আপনার এন্ট্রি পয়েন্টটি সম্পূর্ণরূপে সংযুক্ত করতে, আপনাকে রানটাইম-সক্ষম SDK-তে আপনার @PrivacySandboxService অ্যানোটেটেড ইন্টারফেসের একটি বাস্তবায়ন জেনারেট করা AbstractSandboxedSdkProvider এ প্রদান করতে হবে।
class MySdkSandboxedSdkProvider : AbstractSandboxedSdkProvider() {
override fun createMySdk(context: Context): MySdk = MySdkImpl(context)
}
ASB মডিউলে পরিবর্তন
আপনার ASB মডিউলের build.gradle-এর compatSdkProviderClassName ফিল্ডে SandboxedSdkProviderCompat বাস্তবায়নের সম্পূর্ণ যোগ্যতাসম্পন্ন ক্লাসের নাম ঘোষণা করতে হবে।
এটি সেই ক্লাস যা আপনি আগের ধাপে প্রয়োগ করেছিলেন, এবং আপনি আপনার ASB মডিউলে build.gradle নিম্নরূপ পরিবর্তন করবেন:
bundle {
packageName = '<package name of your runtime-enabled SDK>'
setVersion(1, 0, 0)
// SDK provider defined in the SDK Runtime library.
sdkProviderClassName = "androidx.privacysandbox.sdkruntime.provider.SandboxedSdkProviderAdapter"
// This is the class that extends AbstractSandboxedSdkProvider,
// MySdkSandboxProvider as per the example provided.
compatSdkProviderClassName = "com.example.mysdk.MySdkSandboxProvider"
}
ধাপ ২ : আপনার ডেভেলপমেন্ট এনভায়রনমেন্ট সেট আপ করুন ধাপ ৪ : রানটাইম-সক্ষম SDK ব্যবহার করুন