런타임 지원 SDK 빌드 및 사용

1
Key concepts
2
Set up your development environment
3
Build an RE SDK
4
Consume the RE SDK
5
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-coreandroidx.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 표시의 세션 상태가 변경될 때도 알림을 받을 수 있습니다. 방법은 다음과 같습니다.

  1. 다양한 시나리오를 처리하는 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.
            }
        }
    }
    
  2. 이전에 인스턴스화한 SandboxedSdkView에 상태 변경 리스너를 추가합니다. 리스너는 뷰에 연결되자마자 현재 상태로 즉시 호출됩니다.

다음에 유의하세요.

  • 런타임 인식 SDK가 세션이 아직 열리지 않은 상태에서 SandboxedSdkView 메서드를 호출하면 세션이 열린 후에 모든 효과가 적용됩니다.
    • SandboxedSdkView.orderProviderUiAboveClientUi(providerUiOnTop)와 같은 메서드
  • SandboxedSdkView에서 뷰를 추가하거나 삭제하는 메서드 (예: addView(), removeView(), removeViewAt() 등)를 호출하는 것은 지원되지 않으며 UnsupportedOperationException이 발생합니다.
    • setAdapter()를 사용하여 광고를 표시합니다.
  • SandboxedSdkView.orderProviderUiAboveClientUi(providerUiOnTop)는 사용자 상호작용에서 MotionEvents이 런타임 지원 SDK 또는 런타임 인식 SDK로 전송되는지 여부에 영향을 미치는 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)에 전달된 ActivityHolderLifecycleOwner를 구현하여 런타임 지원 SDK가 활동의 수명 주기에 액세스할 수 있도록 합니다.

또한 활동 내에서 뒤로 버튼 동작을 처리하기 위해 getOnBackPressedCallback 인스턴스를 등록하는 데 사용할 수 있는 getOnBackPressedDispatcher API를 제공합니다.


3단계: 런타임 지원 SDK 빌드 5단계: 테스트 및 배포용 빌드