| Key concepts | Set up your development environment | Build an RE SDK | Consume the RE SDK | Testing, and building for distribution |
런타임 지원 SDK 사용
이 섹션에서는 클라이언트가 선언된 런타임 지원(RE) SDK API와 상호작용하는 방법을 설명합니다.
이 가이드에서는 기존 SDK 모듈 (또는 런타임 인식 SDK)을 클라이언트라고 합니다.
런타임 지원 SDK를 앱에 직접 통합하려면 앱 모듈이 클라이언트입니다.
런타임 지원 SDK 로드
런타임 인식 SDK 또는 클라이언트 앱에서 가장 먼저 해야 할 일은 런타임 지원 SDK를 로드하는 것입니다.
SdkSandboxManager 클래스는 런타임 지원 SDK를 로드하는 데 도움을 주며, 런타임 인식 SDK가 런타임 지원 SDK에 선언된 인터페이스에 바인딩할 수 있는 IBinder 클래스를 반환합니다.
런타임 지원 SDK를 한 번만 로드해야 합니다. 그렇지 않으면 SDK 관리자가 예외를 반환합니다.
심 생성 도구는 SdkSandboxManager에서 반환된 IBinder 인터페이스를 선언된 SDK API 인터페이스로 다시 변환하는 헬퍼 클래스를 생성합니다.
도구는 @PrivacySandboxService로 주석이 지정된 인터페이스를 사용하여 *Factory 클래스를 생성합니다.
이 클래스에는 IBinder 객체를 런타임 지원 SDK 인터페이스의 인스턴스로 변환하는 정적 wrapTo* 함수가 포함되어 있습니다.
런타임 인식 SDK는 이 인터페이스를 사용하여 런타임 지원 SDK와 통신하고 이전 단계에서 선언한 SDK API를 호출할 수 있습니다.
// Name of the SDK to be loaded, defined in your ASB module
private const val SDK_NAME = "com.example.sdk"
try {
// SdkSandboxManagerCompat is used to communicate with the sandbox and load SDKs with backward compatibility.
val sandboxManagerCompat = SdkSandboxManagerCompat.from(context)
val sandboxedSdk = sandboxManagerCompat.loadSdk(SDK_NAME, Bundle.EMPTY)
val mySdk = MySdkFactory.wrapToMySdk(sandboxedSdk.getInterface()!!)
} catch (e: LoadSdkCompatException) {
Log.e(TAG, "Failed to load SDK, error code: ${e.loadSdkErrorCode}", e)
return null
}
UI 라이브러리 사용
UI 라이브러리를 사용하여 광고를 표시하려면 런타임 인식 SDK의 build.gradle에 androidx.privacysandbox.ui:ui-core 및 androidx.privacysandbox.ui:ui-client가 종속 항목으로 추가되어 있어야 합니다.
샌드박스SdkView를 사용하여 배너 광고 로드
androidx.privacysandbox.ui:ui-client에서는 런타임 지원 SDK로 생성된 UI를 호스팅하는 SandboxedSdkView라는 새로운 ViewGroup를 도입합니다.
setAdapter()는 런타임 지원 SDK와의 세션을 열어 광고 조회 및 UI 변경 알림을 수신합니다. SDK가 세션을 열면 광고가 표시됩니다.
다음과 같이 통합할 수 있습니다.
class BannerAd(context: Context, attrs: AttributeSet) : LinearLayout(context, attrs) {
suspend fun loadAd() {
// mySdk is the previously loaded SDK in the SDK Runtime.
val bannerAd = mySdk.loadAd()
val sandboxedSdkView = SandboxedSdkView(context)
addViewToLayout(sandboxedSdkView)
// This renders the ad.
sandboxedSdkView.setAdapter(bannerAd)
return
}
private fun addViewToLayout(view: View) {
view.layoutParams = LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)
super.addView(view)
}
}
런타임 인식 SDK는 UI 표시의 세션 상태가 변경될 때도 알림을 받을 수 있습니다. 방법은 다음과 같습니다.
다양한 시나리오를 처리하는
SessionStateChangeListener()클래스를 만듭니다.private class SessionStateChangeListener() : SandboxedSdkUiSessionStateChangedListener { override fun onStateChanged(state: SandboxedSdkUiSessionState) { if (state is SandboxedSdkUiSessionState.Error) { // Some error has occurred while opening the session. Handle // accordingly. Log.e(TAG, state.throwable.message!!); } else if (state is SandboxedSdkUiSessionState.Loading) { // The session is attempting to be opened. } else if (state is SandboxedSdkUiSessionState.Active) { // The session is open and the UI presentation was successful. } else if (state is SandboxedSdkUiSessionState.Idle) { // There is no open session. } } }이전에 인스턴스화한
SandboxedSdkView에 상태 변경 리스너를 추가합니다. 리스너는 뷰에 연결되자마자 현재 상태로 즉시 호출됩니다.
다음에 유의하세요.
- 런타임 인식 SDK가 세션이 아직 열리지 않은 상태에서
SandboxedSdkView메서드를 호출하면 세션이 열린 후에 모든 효과가 적용됩니다.- SandboxedSdkView.orderProviderUiAboveClientUi(providerUiOnTop)와 같은 메서드
SandboxedSdkView에서 뷰를 추가하거나 삭제하는 메서드 (예:addView(),removeView(),removeViewAt()등)를 호출하는 것은 지원되지 않으며UnsupportedOperationException이 발생합니다.setAdapter()를 사용하여 광고를 표시합니다.
SandboxedSdkView.orderProviderUiAboveClientUi(providerUiOnTop)는 사용자 상호작용에서MotionEvents이 런타임 지원 SDK 또는 런타임 인식 SDK로 전송되는지 여부에 영향을 미치는 Z 순서를 전환합니다.false로 설정된 경우MotionEvents이 런타임 인식 SDK로 전송되고, 그렇지 않으면 런타임 지원 SDK로 전송됩니다. UI 프레젠테이션 API를 사용한 Z 순서 지정에 대해 자세히 알아보기
활동 시작
런타임 지원 SDK가 소유한 활동을 시작하려면 createSdkActivityLauncher 확장 프로그램을 사용하여 런타임 인식 SDK에 런처를 만드세요.
그런 다음 이 런처를 런타임 지원 SDK에 전달하여 필요에 따라 활동을 시작할 수 있습니다.
프레디케이트를 사용하여 활동이 실행될지 여부를 제어할 수 있습니다.
활동이 허용되려면 술어에서 true 값을 반환해야 합니다.
val launchSdkActivityPredicate = {
// Boolean which has to be true to launch the activities
}
val launcher = baseActivity.createSdkActivityLauncher(launchSdkActivityPredicate)
fullscreenService.showActivity(launcher)
런타임 지원 SDK 내에서 SdkSandboxActivityHandlerCompat를 등록하고 SdkActivityLauncher.LaunchSdkActivity(IBinder)에 제공합니다.
fun showActivity(activityLauncher: SdkActivityLauncher) {
val handler = object : SdkSandboxActivityHandlerCompat {
override fun onActivityCreated(activityHolder: ActivityHolder) {
activityHolder.getActivity().setContentView(contentView)
}
}
val token = controller.registerSdkSandboxActivityHandler(handler)
activityLauncher.launchSdkActivity(token)
}
SdkSandboxActivityHandlerCompat.onActivityCreated(ActivityHolder)에 전달된 ActivityHolder는 LifecycleOwner를 구현하여 런타임 지원 SDK가 활동의 수명 주기에 액세스할 수 있도록 합니다.
또한 활동 내에서 뒤로 버튼 동작을 처리하기 위해 getOnBackPressedCallback 인스턴스를 등록하는 데 사용할 수 있는 getOnBackPressedDispatcher API를 제공합니다.
3단계: 런타임 지원 SDK 빌드 5단계: 테스트 및 배포용 빌드