মূল ধারণা | আপনার উন্নয়ন পরিবেশ সেট আপ করুন | একটি RE SDK তৈরি করুন | RE SDK ব্যবহার করুন | পরীক্ষা, এবং বিতরণের জন্য বিল্ডিং |
মূল ধারণা | আপনার উন্নয়ন পরিবেশ সেট আপ করুন | একটি RE SDK তৈরি করুন | RE SDK ব্যবহার করুন | পরীক্ষা, এবং বিতরণের জন্য বিল্ডিং |
একটি রানটাইম-সক্ষম SDK তৈরি করুন
রানটাইম-সক্ষম SDK তৈরি করতে আপনাকে নিম্নলিখিত ধাপগুলি সম্পূর্ণ করতে হবে:
- আপনার প্রকল্প কাঠামো সেট আপ করুন
- আপনার প্রকল্প এবং মডিউল নির্ভরতা প্রস্তুত করুন
- আপনার SDK ব্যবসার যুক্তি যোগ করুন
- SDK APIs সংজ্ঞায়িত করুন
- আপনার SDK-এর জন্য একটি এন্ট্রি-পয়েন্ট নির্দিষ্ট করুন
আপনার প্রকল্প কাঠামো সেট আপ করুন
আমরা সুপারিশ করি যে আপনার প্রকল্পটি নিম্নলিখিত মডিউলগুলিতে সংগঠিত করা হয়েছে:
- অ্যাপ মডিউল - আপনার আসল অ্যাপ ক্লায়েন্টের কাছে কী থাকবে তা প্রতিনিধিত্ব করে আপনার SDK পরীক্ষা এবং বিকাশ করতে আপনি যে পরীক্ষামূলক অ্যাপ ব্যবহার করছেন। আপনার অ্যাপের বিদ্যমান বিজ্ঞাপন লাইব্রেরি মডিউলের উপর নির্ভরতা থাকা উচিত ( রানটাইম-সচেতন SDK )।
- বিদ্যমান বিজ্ঞাপন লাইব্রেরি মডিউল (রানটাইম-সচেতন SDK) - আপনার বিদ্যমান 'নন-রানটাইম-সক্ষম' SDK লজিক ধারণকারী একটি Android লাইব্রেরি মডিউল, একটি স্ট্যাটিকভাবে লিঙ্কযুক্ত SDK৷
- শুরু করার জন্য, ক্ষমতাগুলি বিভক্ত করা যেতে পারে। উদাহরণস্বরূপ, কিছু কোড আপনার বিদ্যমান SDK দ্বারা পরিচালনা করা যেতে পারে এবং কিছুকে রানটাইম-সক্ষম SDK-এ রাউট করা যেতে পারে।
- রানটাইম-সক্ষম বিজ্ঞাপন লাইব্রেরি মডিউল - আপনার রানটাইম-সক্ষম SDK ব্যবসায়িক যুক্তি রয়েছে। এটি অ্যান্ড্রয়েড স্টুডিওতে একটি অ্যান্ড্রয়েড লাইব্রেরি মডিউল হিসাবে তৈরি করা যেতে পারে।
- রানটাইম-সক্ষম ASB মডিউল - একটি ASB-এ রানটাইম-সক্ষম SDK কোড বান্ডিল করতে প্যাকেজ ডেটা সংজ্ঞায়িত করে।
- এটি 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 পরিবর্তন করুন:
// 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 থাকে যা আপনি স্থানান্তর করছেন, তাহলে এই পর্যায়ে আপনার ব্যবসার লজিক, ইন্টারফেস এবং সিস্টেম ফেসিং ফাংশনগুলি যতটা আপনি চান তা সরিয়ে নিন, তবে ভবিষ্যতে সম্পূর্ণ মাইগ্রেশনের জন্য অ্যাকাউন্ট করুন৷
আপনার যদি স্টোরেজ, Google Play Advertising ID বা অ্যাপ সেট আইডিতে অ্যাক্সেসের প্রয়োজন হয়, তাহলে নিম্নলিখিত বিভাগগুলি পড়ুন:
আপনার SDK-এ স্টোরেজ API ব্যবহার করুন
SDK রানটাইমে SDKগুলি আর কোনও অ্যাপের অভ্যন্তরীণ স্টোরেজে এবং অন্য উপায়ে অ্যাক্সেস, পড়তে বা লিখতে পারে না।
SDK রানটাইম অ্যাপ থেকে আলাদা, নিজস্ব অভ্যন্তরীণ স্টোরেজ এলাকা বরাদ্দ করা হয়েছে।
SandboxedSdkProvider#getContext()
দ্বারা প্রত্যাবর্তিত Context
অবজেক্টে ফাইল স্টোরেজ API ব্যবহার করে SDKগুলি এই পৃথক অভ্যন্তরীণ স্টোরেজ অ্যাক্সেস করতে সক্ষম।
SDK শুধুমাত্র অভ্যন্তরীণ স্টোরেজ ব্যবহার করতে পারে, তাই শুধুমাত্র অভ্যন্তরীণ স্টোরেজ API, যেমন Context.getFilesDir()
বা Context.getCacheDir()
কাজ করে। অভ্যন্তরীণ স্টোরেজ থেকে অ্যাক্সেসে আরও উদাহরণ দেখুন।
SDK রানটাইম থেকে বাহ্যিক সঞ্চয়স্থানে অ্যাক্সেস সমর্থিত নয়। বাহ্যিক সঞ্চয়স্থান অ্যাক্সেস করতে API-কে কল করা হয় একটি ব্যতিক্রম ছুঁড়ে দেবে বা শূন্য দেবে। নিম্নলিখিত তালিকায় কিছু উদাহরণ রয়েছে:
- স্টোরেজ অ্যাক্সেস ফ্রেমওয়ার্ক ব্যবহার করে ফাইল অ্যাক্সেস করা একটি নিরাপত্তা ব্যতিক্রম নিক্ষেপ করে।
-
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 রানটাইমের বাইরে অ্যাক্সেসযোগ্য হওয়ার জন্য, আপনাকে ক্লায়েন্ট (RA SDK বা ক্লায়েন্ট অ্যাপ) ব্যবহার করতে পারে এমন APIগুলিকে সংজ্ঞায়িত করতে হবে।
এই ইন্টারফেস ঘোষণা করতে টীকা ব্যবহার করুন.
টীকা
নিম্নোক্ত টীকাগুলি ব্যবহার করে SDK APIগুলিকে ইন্টারফেস এবং ডেটা ক্লাস হিসাবে Kotlin-এ ঘোষণা করতে হবে:
টীকা | |
---|---|
@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, বুলিয়ান ইত্যাদি)
- স্ট্রিং
- কোটলিন ইন্টারফেসগুলি
@PrivacySandboxInterface
বা@PrivacySandboxCallback
দিয়ে টীকা করা হয়েছে - কোটলিন ডেটা ক্লাস
@PrivacySandboxValue
এর সাথে টীকা করা হয়েছে - java.lang.List - তালিকার সমস্ত উপাদান অবশ্যই সমর্থিত ডেটা প্রকারের একটি হতে হবে
কিছু অতিরিক্ত সতর্কতা আছে:
-
@PrivacySandboxValue
এর সাথে টীকা করা ডেটা ক্লাসে@PrivacySandboxCallback
ধরনের ক্ষেত্র থাকতে পারে না - রিটার্নের প্রকারে
@PrivacySandboxCallback
এর সাথে টীকা করা প্রকার থাকতে পারে না - তালিকায়
@PrivacySandboxInterface
বা@PrivacySandboxCallback
এর সাথে টীকা করা ধরনের উপাদান থাকতে পারে না
অ্যাসিঙ্ক্রোনাস API
যেহেতু SDK APIগুলি সর্বদা একটি পৃথক প্রক্রিয়াতে কল করে, তাই আমাদের নিশ্চিত করতে হবে যে এই কলগুলি ক্লায়েন্টের কলিং থ্রেডকে ব্লক করে না।
এটি অর্জন করতে, @PrivacySandboxService
, @PrivacySandboxInterface
এবং @PrivacySandboxCallback
এর সাথে টীকাযুক্ত ইন্টারফেসের সমস্ত পদ্ধতিকে স্পষ্টভাবে অ্যাসিঙ্ক্রোনাস API হিসাবে ঘোষণা করতে হবে।
কোটলিনে অ্যাসিঙ্ক্রোনাস 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-মালিকানাধীন ক্রিয়াকলাপগুলি শুরু করতে আপনাকে একটি SdkActivityLauncher
অবজেক্ট পেতে SDK API সংশোধন করতে হবে, এছাড়াও UI লাইব্রেরি দ্বারা সরবরাহ করা হয়েছে৷
উদাহরণস্বরূপ, নিম্নলিখিত SDK API-এর কার্যক্রম চালু করা উচিত, তাই এটি SdkActivityLauncher
প্যারামিটার আশা করে:
@PrivacySandboxInterface
interface FullscreenAd {
suspend fun show(activityLauncher: SdkActivityLauncher)
}
SDK এন্ট্রি-পয়েন্ট
অ্যাবস্ট্রাক্ট ক্লাস SandboxedSdkProvider
এপিআইকে এনক্যাপসুলেট করে যা SDK রানটাইম এতে লোড করা 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
তৈরি করে।
আপনার এন্ট্রি পয়েন্টটি সম্পূর্ণভাবে সংযুক্ত করতে, আপনাকে আপনার @PrivacySandboxService
টিকা ইন্টারফেসের একটি বাস্তবায়ন প্রদান করতে হবে রানটাইম-সক্ষম SDK-এ জেনারেট করা AbstractSandboxedSdkProvider
এ।
class MySdkSandboxedSdkProvider : AbstractSandboxedSdkProvider() {
override fun createMySdk(context: Context): MySdk = MySdkImpl(context)
}
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"
}
ধাপ 2 : আপনার উন্নয়ন পরিবেশ সেট আপ করুনধাপ 4 : রানটাইম-সক্ষম SDK ব্যবহার করুন