Google은 흑인 공동체를 위한 인종 간 평등을 진전시키기 위해 노력하고 있습니다. Google에서 어떤 노력을 하고 있는지 확인하세요.

사용자가 재설정할 수 있는 광고 ID 가져오기

사용자 개인정보를 보호하려면 모든 Android 앱에서 사용자가 재설정할 수 있는 식별자를 사용하는 것이 가장 좋습니다. 이와 같은 식별자 중 하나가 광고 ID이며 광고 개인 최적화와 같은 광고 사용 사례를 위한 특정 사용자를 고유하게 식별합니다.

앱을 실행하는 기기에서 표준화된 광고 추적 솔루션을 지원하려면 Jetpack의 일부인 광고 ID 라이브러리를 사용하면 됩니다. 이 라이브러리는 Android 4.0(API 레벨 14) 이상을 실행하는 기기에서 사용할 수 있고 인터페이스를 정의하여 시스템 수준 광고 제공자와 상호작용합니다. 이 인터페이스로 앱에서 일관된 광고 ID 값을 수신할 수 있습니다.

광고 ID 라이브러리에 포함된 광고 제공자는 광고 제공자가 구현하는 설정 화면을 열기 위한 표준 인텐트도 정의합니다. 설정 화면에서 사용자는 광고 ID를 재설정하고 광고 개인 최적화를 선택 해제할 수 있습니다.

이 가이드에서는 광고 ID 라이브러리의 클라이언트 모듈을 사용하여 기기 사용자별로 일관된 광고 ID를 얻는 방법을 설명합니다. 또한 라이브러리의 아키텍처를 간단하게 보여줍니다.

클라이언트 앱 구성

앱은 광고 ID 라이브러리의 클라이언트 모듈과 상호작용하여 앱과 상호작용하는 사용자를 나타내는 일관된 광고 ID를 검색할 수 있습니다.

광고 ID는 보편적 고유 식별자(UUID) 형식 버전 3이나 동등한 128비트 형식을 사용하여 표시됩니다.

    38400000-8cf0-11bd-b23e-10b96e40000d
    

광고 ID 라이브러리는 필요에 따라 반환 값을 정규화하여 이 형식을 사용하는 ID를 제공합니다.

앱에서 사용자가 재설정할 수 있는 광고 ID를 검색하려면 다음 단계를 완료하세요.

  1. AdvertisingIdClient.isAdvertisingIdProviderAvailable()을 호출하여 광고 제공자를 사용할 수 있는지 확인합니다. 이 메서드에서 false를 반환하면 앱에서는 다른 방법을 사용하여 필요한 광고 추적 사용 사례를 실행해야 합니다.

  2. AdvertisingIdClient.getAdvertisingIdInfo()를 호출하여 광고 ID를 비롯한 광고 식별자 세부정보를 가져옵니다. 광고 ID 라이브러리는 작업자 스레드에서 이 메서드를 실행하고 10초 연결 제한 시간을 사용합니다.

다음 코드 스니펫은 광고 제공자의 다른 정보와 함께 광고 ID를 검색하는 방법을 보여줍니다.

app/build.gradle

    dependencies {
      implementation 'androidx.ads:ads-identifier:1.0.0-alpha01'

      // Used for the calls to addCallback() in the snippets on this page.
      implementation 'com.google.guava:guava:28.0-android'
    }
    

MyAdIdClient

Kotlin

    // Used for the call to addCallback() within this snippet.
    import com.google.common.util.concurrent.Futures.addCallback

    private fun determineAdvertisingInfo() {
        if (AdvertisingIdClient.isAdvertisingIdProviderAvailable()) {
            val advertisingIdInfoListenableFuture =
                    AdvertisingIdClient.getAdvertisingIdInfo(applicationContext)

            addCallback(advertisingIdInfoListenableFuture,
                    object : FutureCallback<AdvertisingIdInfo> {
                override fun onSuccess(adInfo: AdvertisingIdInfo?) {
                    val id: String = adInfo?.id
                    val providerPackageName: String = adInfo?.providerPackageName
                    val isLimitTrackingEnabled: Boolean =
                                    adInfo?.isLimitTrackingEnabled
                }

                override fun onFailure(t: Throwable) {
                    Log.e("MY_APP_TAG",
                            "Failed to connect to Advertising ID provider.")
                    // Try to connect to the Advertising ID provider again, or fall
                    // back to an ads solution that doesn't require using the
                    // Advertising ID library.
                }
            }, Executors.newSingleThreadExecutor())
        } else {
            // The Advertising ID client library is unavailable. Use a different
            // library to perform any required ads use cases.
        }
    }
    

자바

    // Used for the call to addCallback() within this snippet.
    import com.google.common.util.concurrent.Futures;

    private void determineAdvertisingInfo() {
        if (AdvertisingIdClient.isAdvertisingIdProviderAvailable()) {
            ListenableFuture<AdvertisingIdInfo> advertisingIdInfoListenableFuture =
                    AdvertisingIdClient.getAdvertisingIdInfo(getApplicationContext());
            Futures.addCallback(advertisingIdInfoListenableFuture,
                    new FutureCallback<AdvertisingIdInfo>() {
                        @Override
                        public void onSuccess(AdvertisingIdInfo adInfo) {
                            String id = adInfo.getId();
                            String providerPackageName =
                                    adInfo.getProviderPackageName();
                            boolean isLimitTrackingEnabled =
                                    adInfo.isLimitTrackingEnabled();

                        // Any exceptions thrown by getAdvertisingIdInfo()
                        // cause this method to get called.
                        @Override
                        public void onFailure(Throwable throwable) {
                            Log.e("MY_APP_TAG",
                                    "Failed to connect to Advertising ID provider.");
                            // Try to connect to the Advertising ID provider again,
                            // or fall back to an ads solution that doesn't require
                            // using the Advertising ID library.
                        }
                    });
        } else {
            // The Advertising ID client library is unavailable. Use a different
            // library to perform any required ads use cases.
        }
    }
    

광고 ID 라이브러리 아키텍처

아키텍처 다이어그램
그림 1. 광고 ID 라이브러리 아키텍처

그림 1에 표시된 다이어그램은 광고 ID 라이브러리의 구조를 보여줍니다. 라이브러리는 다음 모듈로 구성됩니다.

  • 클라이언트 모듈: 앱에 포함된 얇은 레이어
  • 제공자 모듈: 기기 제조업체에서 제공. 이 모듈의 구현으로 설정 UI를 정의하여 사용자가 광고 ID를 재설정하고 광고 추적 환경설정을 전환할 수 있도록 해야 합니다.

클라이언트 모듈은 제공자 모듈과 통신하여 광고 추적 관련 광고 ID와 사용자 환경설정을 검색합니다.

라이브러리가 여러 제공자를 처리하는 방법

기기에서는 여러 시스템 수준 광고 제공자를 동시에 지원할 수 있습니다. 광고 ID 라이브러리에서 이 상황을 감지하면 제공자를 계속 사용할 수 있다는 가정하에 앱이 항상 동일한 제공자로부터 정보를 검색하는지 확인합니다. 이 프로세스를 통해 광고 ID의 일관성이 유지됩니다.

사용 가능한 광고 제공자 세트가 시간이 지남에 따라 변경되어 앱에서 다른 광고 식별자 제공자와 상호작용하면 다른 모든 클라이언트 앱에서도 그러한 새 제공자를 사용하기 시작합니다. 앱은 사용자가 광고 ID 재설정을 요청하면 발생할 수 있는 동작을 동일하게 보여줍니다.

광고 ID 제공자 라이브러리는 다음과 같은 결정론적인 순서를 사용하여 제공자의 순위를 정합니다.

  1. androidx.ads.identifier.provider.HIGH_PRIORITY 권한을 요청한 제공자
  2. 가장 오래 기기에 설치된 제공자
  3. 알파벳 순서에서 처음 표시되는 제공자