8.0.0 버전으로 마이그레이션 가이드

Yandex Mobile Ads SDK의 새 버전에서는 개발자 경험을 개선하기 위한 여러 API 변경이 도입되었습니다.

주요 변경 사항

1. AdRequest 변경

AdRequestConfigurationNativeAdRequestConfiguration 클래스가 제거되었습니다. 모든 광고 유형에 AdRequest를 사용합니다.

클래스 상태
AdRequestConfiguration 제거됨. AdRequest 사용
NativeAdRequestConfiguration 제거됨. AdRequestNativeAdOptions 사용

예시

Kotlin
SDK 7 SDK 8
// Fullscreen & Native Ads, e.g. InterstitialAdLoader
val loader = InterstitialAdLoader(this)

val config = AdRequestConfiguration.Builder("R-M-XXXXX-YY").build()

loader.loadAd(config)

// Banner ads
val bannerView = findViewById(R.id.view_banner)

bannerView.setAdUnitId("R-M-XXXXX-YY")

val request = AdRequest.Builder().build()

bannerView.loadAd(request)
// Fullscreen & Native Ads, e.g. InterstitialAdLoader
val loader = InterstitialAdLoader(this)
val request = AdRequest.Builder("R-M-XXXXX-YY").build()
loader.loadAd(adRequest, listener)

// Banner ads
val bannerView = findViewById(R.id.view_banner)
val request = AdRequest.Builder("R-M-XXXXX-YY").build()
bannerView.loadAd(request)
Java
SDK 7 SDK 8
void loadAd() {
    // Fullscreen & Native Ads, e.g. InterstitialAdLoader
    InterstitialAdLoader loader = new InterstitialAdLoader(this);
    AdRequestConfiguration config = new AdRequestConfiguration.Builder("R-M-XXXXX-YY")
            .build();
    loader.loadAd(config);

    // Banner ads
    BannerAdView bannerView = findViewById(R.id.view_banner);
    bannerView.setAdUnitId("R-M-XXXXX-YY");
    AdRequest request = AdRequest.Builder().build();
    bannerView.loadAd(request);
}
void loadAd() {
    // Fullscreen & Native Ads, e.g. InterstitialAdLoader
    InterstitialAdLoader loader = new InterstitialAdLoader(this);
    AdRequest request = new AdRequest.Builder("R-M-XXXXX-YY")
            .build();
    loader.loadAd(request, listener);

    // Banner ads
    BannerAdView bannerView = findViewById(R.id.view_banner);
    AdRequest request = AdRequest.Builder("R-M-XXXXX-YY").build();
    bannerView.loadAd(request);
}

2. 타게팅 API 변경

AdRequest.Builder에서 age, gender, location, contextQuery, contextTags 필드가 제거되었습니다. 타게팅 매개변수는 새 AdTargeting 클래스로 관리합니다.

클래스 메서드 상태
AdRequest.Builder setAge(String) 제거됨. 대신
AdTargeting.Builder.setAge(String)
AdRequest.Builder.setTargeting(AdTargeting) 사용
AdRequest.Builder setGender(String) 제거됨. 대신
AdTargeting.Builder.setGender(String)
AdRequest.Builder.setTargeting(AdTargeting) 사용
AdRequest.Builder setLocation(Location) 제거됨. 대신
AdTargeting.Builder.setLocation(Location)
AdRequest.Builder.setTargeting(AdTargeting) 사용
AdRequest.Builder setContextQuery(String) 제거됨. 대신
AdTargeting.Builder.setContextQuery(String)
AdRequest.Builder.setTargeting(AdTargeting) 사용
AdRequest.Builder setContextTags(List<String>) 제거됨. 대신
AdTargeting.Builder.setContextTags(List<String>)
AdRequest.Builder.setTargeting(AdTargeting) 사용
AdRequest.Builder setTargeting(AdTargeting) 추가됨
AdTargeting - 추가됨
AdTargeting.Builder - 추가됨
AdTargeting.Builder setAge(String) 추가됨
AdTargeting.Builder setGender(String) 추가됨
AdTargeting.Builder setLocation(Location) 추가됨
AdTargeting.Builder setContextQuery(String) 추가됨
AdTargeting.Builder setContextTags(List<String>) 추가됨

예시

Kotlin
SDK 7 SDK 8
val adRequest = AdRequest.Builder()
    .setAge("25")
    .setGender(Gender.MALE)
    .setContextTags(listOf("news"))
    .build()
val targeting = AdTargeting.Builder()
    .setAge("25")
    .setGender(Gender.MALE)
    .setContextTags(listOf("news"))
    .build()

val adRequest = AdRequest.Builder(adUnitId)
    .setTargeting(targeting)
    .build()
Java
SDK 7 SDK 8
void loadAd() {
    AdRequest adRequest = AdRequest.Builder()
            .setAge("25")
            .setGender(Gender.MALE)
            .setContextTags(listOf("news"))
            .build();
}
void loadAd() {
    AdTargeting targeting = new AdTargeting.Builder()
            .setAge("25")
            .setGender(Gender.MALE)
            .setContextTags(listOf("news"))
            .build();

    AdRequest adRequest = new AdRequest.Builder(adUnitId)
            .setTargeting(targeting)
            .build();
}

3. 광고 로딩 API 변경

콜백 리스너 등록 방식과 광고 로딩 방식이 변경되었습니다.

클래스 메서드 상태
InterstitialAdLoader setAdLoadListener(InterstitialAdLoadListener) 제거됨. loadAd 호출 시 InterstitialAdLoadListener를 인자로 넘깁니다.
InterstitialAdLoader loadAd(AdRequestConfiguration) 제거됨. 대신 loadAd(AdRequest, InterstitialAdLoadListener) 사용.
InterstitialAdLoader loadAd(AdRequest, InterstitialAdLoadListener) 추가됨
RewardedAdLoader setAdLoadListener(RewardedAdLoadListener) 제거됨. loadAd 호출 시 RewardedAdLoadListener를 인자로 넘깁니다.
RewardedAdLoader loadAd(AdRequestConfiguration) 제거됨. 대신 loadAd(AdRequest, RewardedAdLoadListener) 사용.
RewardedAdLoader loadAd(AdRequest, RewardedAdLoadListener) 추가됨
AppOpenAdLoader setAdLoadListener(AppOpenAdLoadListener) 제거됨. loadAd 호출 시 AppOpenAdLoadListener를 인자로 넘깁니다.
AppOpenAdLoader loadAd(AdRequestConfiguration) 제거됨. 대신 loadAd(AdRequest, AppOpenAdLoadListener) 사용.
AppOpenAdLoader loadAd(AdRequest, AppOpenAdLoadListener) 추가됨
NativeAdLoader setNativeAdLoadListener(NativeAdLoadListener) 제거됨. loadAd 호출 시 NativeAdLoadListener를 인자로 넘깁니다.
NativeAdLoader loadAd(NativeAdRequestConfiguration) 제거됨. 대신 loadAd(AdRequest, NativeAdLoadListener) 사용.
NativeAdLoader loadAd(AdRequest, NativeAdOptions, NativeAdLoadListener) 추가됨
NativeAdLoader loadAd(AdRequest, NativeAdLoadListener) 추가됨
SliderAdLoader setSliderAdLoadListener(SliderAdLoadListener) 제거됨. loadAd 호출 시 SliderAdLoadListener를 인자로 넘깁니다.
SliderAdLoader loadSlider(NativeAdRequestConfiguration) 제거됨. 대신 loadAd(AdRequest, SliderAdLoadListener) 사용.
SliderAdLoader loadSlider(AdRequest, NativeAdOptions, SliderAdLoadListener) 추가됨
SliderAdLoader loadAd(AdRequest, NativeAdLoadListener) 추가됨
NativeBulkAdLoader setNativeBulkAdLoadListener(NativeBulkAdLoadListener) 제거됨. loadAd 호출 시 NativeBulkAdLoadListener를 인자로 넘깁니다.
NativeBulkAdLoader loadAds(NativeAdRequestConfiguration, Int) 제거됨. 대신 loadAd(AdRequest, NativeAdLoadListener) 사용.
NativeBulkAdLoader loadAds(AdRequest, NativeAdOptions, NativeBulkAdLoadListener) 추가됨
NativeBulkAdLoader loadAds(AdRequest, NativeBulkAdLoadListener) 추가됨

예시

Kotlin
SDK 7 SDK 8
// Interstitial Ads
val interstitialAdLoader = InterstitialAdLoader(this)
interstitialAdLoader.setAdLoadListener(object : InterstitialAdLoadListener { /* ... */ })
interstitialAdLoader.loadAd(AdRequestConfiguration.Builder("R-M-XXXXX-YY").build())

// Rewarded Ads
val rewardedAdLoader = RewardedAdLoader(this)
rewardedAdLoader.setAdLoadListener(object : RewardedAdLoadListener { /* ... */ })
rewardedAdLoader.loadAd(AdRequestConfiguration.Builder("R-M-XXXXX-YY").build())

// AppOpen Ads
val appOpenAdLoader = AppOpenAdLoader(this)
appOpenAdLoader.setAdLoadListener(object : AppOpenAdLoadListener { /* ... */ })
appOpenAdLoader.loadAd(AdRequestConfiguration.Builder("R-M-XXXXX-YY").build())

// Native Ads
val nativeAdLoader = NativeAdLoader(this)
nativeAdLoader.setNativeAdLoadListener(object : NativeAdLoadListener { /* ... */ })
nativeAdLoader.loadAd(NativeAdRequestConfiguration.Builder("R-M-XXXXX-YY").build())

// Slider Ads
val sliderAdLoader = SliderAdLoader(this)
sliderAdLoader.setSliderAdLoadListener(object : SliderAdLoadListener { /* ... */ })
sliderAdLoader.loadSlider(NativeAdRequestConfiguration.Builder("R-M-XXXXX-YY").build())

// Native bulk ads
val nativeBulkAdLoader = NativeBulkAdLoader(this)
nativeBulkAdLoader.setNativeBulkAdLoadListener(object : NativeBulkAdLoadListener { /* ... */ })
nativeBulkAdLoader.loadAds(NativeAdRequestConfiguration.Builder("R-M-XXXXX-YY").build(), 1)
// Interstitial Ads
val interstitialAdLoader = InterstitialAdLoader(this)
interstitialAdLoader.loadAd(AdRequest.Builder("R-M-XXXXX-YY").build(), object : InterstitialAdLoadListener { /* ... */ })

// Rewarded Ads
val rewardedAdLoader = RewardedAdLoader(this)
rewardedAdLoader.loadAd(AdRequest.Builder("R-M-XXXXX-YY").build(), object : RewardedAdLoadListener { /* ... */ })

// AppOpen Ads
val appOpenAdLoader = AppOpenAdLoader(this)
appOpenAdLoader.loadAd(AdRequest.Builder("R-M-XXXXX-YY").build(), object : AppOpenAdLoadListener { /* ... */ })

// Native Ads
val nativeAdLoader = NativeAdLoader(this)
nativeAdLoader.loadAd(AdRequest.Builder("R-M-XXXXX-YY").build(), object : NativeAdLoadListener { /* ... */ })
// Or with NativeAdOptions
nativeAdLoader.loadAd(
    AdRequest.Builder("R-M-XXXXX-YY").build(),
    NativeAdOptions.Builder().build(),
    object : NativeAdLoadListener { /* ... */ })

// Slider Ads
val sliderAdLoader = SliderAdLoader(this)
sliderAdLoader.loadSlider(AdRequest.Builder("R-M-XXXXX-YY").build(), object : SliderAdLoadListener { /* ... */ })
// Or with NativeAdOptions
sliderAdLoader.loadSlider(
    AdRequest.Builder("R-M-XXXXX-YY").build(),
    NativeAdOptions.Builder().build(),
    object : SliderAdLoadListener { /* ... */ })

// Native Bulk Ads
val nativeBulkAdLoader = NativeBulkAdLoader(this)
nativeBulkAdLoader.loadAds(
    AdRequest.Builder("R-M-XXXXX-YY").build(),
    1,
    object : NativeBulkAdLoadListener { /* ... */ }
)
// Or with NativeAdOptions
nativeBulkAdLoader.loadAds(
    AdRequest.Builder("R-M-XXXXX-YY").build(),
    1,
    NativeAdOptions.Builder().build(),
    object : NativeBulkAdLoadListener { /* ... */ }
)
Java
SDK 7 SDK 8
void loadAd() {
    // Interstitial Ads
    InterstitialAdLoader interstitialAdLoader = new InterstitialAdLoader(this);
    interstitialAdLoader.setAdLoadListener(new InterstitialAdLoadListener() { /* ... */ });
    interstitialAdLoader.loadAd(new AdRequestConfiguration.Builder("R-M-XXXXX-YY").build());

    // Rewarded Ads
    RewardedAdLoader rewardedAdLoader = new RewardedAdLoader(this);
    rewardedAdLoader.setAdLoadListener(new RewardedAdLoadListener() { /* ... */ });
    rewardedAdLoader.loadAd(new AdRequestConfiguration.Builder("R-M-XXXXX-YY").build());

    // AppOpen Ads
    AppOpenAdLoader appOpenAdLoader = new AppOpenAdLoader(this);
    appOpenAdLoader.setAdLoadListener(new AppOpenAdLoadListener() { /* ... */ });
    appOpenAdLoader.loadAd(new AdRequestConfiguration.Builder("R-M-XXXXX-YY").build());

    // Native Ads
    NativeAdLoader nativeAdLoader = new NativeAdLoader(this);
    nativeAdLoader.setNativeAdLoadListener(new NativeAdLoadListener() { /* ... */ });
    nativeAdLoader.loadAd(new NativeAdRequestConfiguration.Builder("R-M-XXXXX-YY").build());

    // Slider Ads
    SliderAdLoader sliderAdLoader = new SliderAdLoader(this);
    sliderAdLoader.setSliderAdLoadListener(new SliderAdLoadListener() { /* ... */ });
    sliderAdLoader.loadSlider(new NativeAdRequestConfiguration.Builder("R-M-XXXXX-YY").build());

    // Native Bulk Ads
    NativeBulkAdLoader nativeBulkAdLoader = new NativeBulkAdLoader(this);
    nativeBulkAdLoader.setNativeBulkAdLoadListener(new NativeBulkAdLoadListener() { /* ... */ });
    nativeBulkAdLoader.loadAds(new NativeAdRequestConfiguration.Builder("R-M-XXXXX-YY").build(), 1);
}
void loadAd() {
    // Interstitial Ads
    InterstitialAdLoader interstitialAdLoader = new InterstitialAdLoader(this);
    interstitialAdLoader.loadAd(new AdRequest.Builder("R-M-XXXXX-YY").build(),
            new InterstitialAdLoadListener() { /* ... */ }
    );

    // Rewarded Ads
    RewardedAdLoader rewardedAdLoader = new RewardedAdLoader(this);
    rewardedAdLoader.loadAd(new AdRequest.Builder("R-M-XXXXX-YY").build(),
            new RewardedAdLoadListener() { /* ... */ }
    );

    // AppOpen Ads
    AppOpenAdLoader appOpenAdLoader = new AppOpenAdLoader(this);
    appOpenAdLoader.loadAd(new AdRequest.Builder("R-M-XXXXX-YY").build(),
            new AppOpenAdLoadListener() { /* ... */ }
    );

    // Native Ads
    NativeAdLoader nativeAdLoader = new NativeAdLoader(this);
    nativeAdLoader.loadAd(new AdRequest.Builder("R-M-XXXXX-YY").build(),
            new NativeAdLoadListener() { /* ... */ }
    );
    // Or with NativeAdOptions
    nativeAdLoader.loadAd(new AdRequest.Builder("R-M-XXXXX-YY").build(),
            new NativeAdOptions.Builder().build(),
            new NativeAdLoadListener() { /* ... */ }
    );

    // Slider Ads
    SliderAdLoader sliderAdLoader = new SliderAdLoader(this);
    sliderAdLoader.loadSlider(new AdRequest.Builder("R-M-XXXXX-YY").build(),
            new SliderAdLoadListener() { /* ... */ }
    );
    // Or with NativeAdOptions
    sliderAdLoader.loadSlider(new AdRequest.Builder("R-M-XXXXX-YY").build(),
            new NativeAdOptions.Builder().build(),
            new SliderAdLoadListener() { /* ... */ }
    );

    // Native Bulk Ads
    NativeBulkAdLoader nativeBulkAdLoader = new NativeBulkAdLoader(this);
    nativeBulkAdLoader.loadAds(new AdRequest.Builder("R-M-XXXXX-YY").build(),
            1,
            new NativeBulkAdLoadListener() { /* ... */ }
    );
    // Or with NativeAdOptions
    nativeBulkAdLoader.loadAds(new AdRequest.Builder("R-M-XXXXX-YY").build(),
            1,
            new NativeAdOptions.Builder().build(),
            new NativeBulkAdLoadListener() { /* ... */ }
    );
}

3.1 Kotlin Coroutines 지원

광고 로딩 메서드에 suspend 오버로드가 API에 추가되었습니다.

클래스 메서드 상태
InterstitialAdLoader suspend fun loadAd(AdRequest): InterstitialAdLoadResult 추가됨
RewardedAdLoader suspend fun loadAd(AdRequest): RewardedAdLoadResult 추가됨
AppOpenAdLoader suspend fun loadAd(AdRequest): AppOpenAdLoadResult 추가됨
NativeAdLoader suspend fun loadAd(AdRequest, NativeAdOptions): NativeAdLoadResult 추가됨
NativeAdLoader suspend fun loadAd(AdRequest): NativeAdLoadResult 추가됨
SliderAdLoader suspend fun loadAd(AdRequest): SliderAdLoadResult 추가됨
SliderAdLoader suspend fun loadAd(AdRequest, NativeAdOptions): SliderAdLoadResult 추가됨
NativeBulkAdLoader suspend fun loadAds(AdRequest, Int): NativeBulkAdLoadResult 추가됨
NativeBulkAdLoader suspend fun loadAds(AdRequest, Int, NativeAdOptions): NativeBulkAdLoadResult 추가됨

예시

Kotlin
lifecycleScope.launch {
    // Interstitial Ads
    val interstitialAdLoader = InterstitialAdLoader(applicationContext)
    when(val result = interstitialAdLoader.loadAd(AdRequest.Builder("R-M-XXXXX-YY").build())) {
        is InterstitialAdLoadResult.Failure -> TODO("Handle error: ${result.error.description}")
        is InterstitialAdLoadResult.Success -> TODO("Show interstitial ad: ${result.ad}")
    }

    // Rewarded Ads
    val rewardedAdLoader = RewardedAdLoader(applicationContext)
    when(val result = rewardedAdLoader.loadAd(AdRequest.Builder("R-M-XXXXX-YY").build())) {
        is RewardedAdLoadResult.Failure -> TODO("Handle error: ${result.error.description}")
        is RewardedAdLoadResult.Success -> TODO("Show rewarded ad: ${result.ad}")
    }

    // AppOpen Ads
    val appOpenAdLoader = AppOpenAdLoader(applicationContext)
    when(val result = appOpenAdLoader.loadAd(AdRequest.Builder("R-M-XXXXX-YY").build())) {
        is AppOpenAdLoadResult.Failure -> TODO("Handle error: ${result.error.description}")
        is AppOpenAdLoadResult.Success -> TODO("Show appOpen ad: ${result.ad}")
    }

    // Native Ads
    val nativeAdLoader = NativeAdLoader(applicationContext)
    val nativeAdRequest = AdRequest.Builder("R-M-XXXXX-YY").build()
    when(val result = nativeAdLoader.loadAd(nativeAdRequest)) {
        is NativeAdLoadResult.Failure -> TODO("Handle error: ${result.error.description}")
        is NativeAdLoadResult.Success -> TODO("Show native ad: ${result.ad}")
    }

    // Or with NativeAdOptions
    when(val result = nativeAdLoader.loadAd(nativeAdRequest, NativeAdOptions.Builder().build())) {
        is NativeAdLoadResult.Failure -> TODO("Handle error: ${result.error.description}")
        is NativeAdLoadResult.Success -> TODO("Show native ad: ${result.ad}")
    }

    // Slider Ads
    val sliderAdLoader = SliderAdLoader(applicationContext)
    val sliderAdRequest = AdRequest.Builder("R-M-XXXXX-YY").build()
    when(val result = sliderAdLoader.loadAd(sliderAdRequest)) {
        is SliderAdLoadResult.Failure -> TODO("Handle error: ${result.error.description}")
        is SliderAdLoadResult.Success -> TODO("Show slider ad: ${result.ad}")
    }

    // Or with NativeAdOptions
    when(val result = sliderAdLoader.loadAd(sliderAdRequest, NativeAdOptions.Builder().build())) {
        is SliderAdLoadResult.Failure -> TODO("Handle error: ${result.error.description}")
        is SliderAdLoadResult.Success -> TODO("Show slider ad: ${result.ad}")
    }

    // Native Bulk Ads
    val nativeBulkAdLoader = NativeBulkAdLoader(applicationContext)
    val builkAdRequest = AdRequest.Builder("R-M-XXXXX-YY").build()
    when(val result = nativeBulkAdLoader.loadAds(builkAdRequest, 1)) {
        is NativeBulkAdLoadResult.Failure -> TODO("Handle error: ${result.error.description}")
        is NativeBulkAdLoadResult.Success -> TODO("Show bulk ad: ${result.ads}")
    }

    // Or with NativeAdOptions
    when(val result = nativeBulkAdLoader.loadAds(builkAdRequest, 1, NativeAdOptions.Builder().build())) {
        is NativeBulkAdLoadResult.Failure -> TODO("Handle error: ${result.error.description}")
        is NativeBulkAdLoadResult.Success -> TODO("Show bulk ad: ${result.ads}")
    }
}

4. 배너 API 변경

BannerAdView에서 setAdUnitId 메서드가 제거되었습니다. 이제 adUnitId는 광고를 로드할 때마다 설정합니다. BannerAdSize를 만드는 팩토리 메서드 이름이 바뀌었습니다.

클래스 메서드 상태
BannerAdView setAdUnitId(String) 제거됨. 광고 로딩 전 AdRequest 생성자에 adUnitId를 넘깁니다.
BannerAdSize stickySize 제거됨. 대신 BannerAdSize.sticky 사용.
BannerAdSize inlineSize 제거됨. 대신 BannerAdSize.inline 사용.

예시

Kotlin
SDK 7 SDK 8
val banner = findViewById<BannerAdView>(R.id.banner)
val stickySize = BannerAdSize.stickySize(this, screenWidth)
val inlineSizeSize = BannerAdSize.inlineSize(this, screenWidth, 300)
banner.setAdUnitId("R-M-XXXXX-YY")
banner.setAdSize(stickySize)
banner.loadAd(AdRequest.Builder().build())
val banner = findViewById<BannerAdView>(R.id.banner)
val stickySize = BannerAdSize.sticky(this, screenWidth)
val inlineSizeSize = BannerAdSize.inline(this, screenWidth, 300)
banner.setAdSize(stickySize)
banner.loadAd(AdRequest.Builder("R-M-XXXXX-YY").build())
Java
SDK 7 SDK 8
void loadAd() {
    BannerAdView banner = findViewById(R.id.banner);
    BannerAdSize stickySize = BannerAdSize.stickySize(this, screenWidth);
    BannerAdSize inlineSizeSize = BannerAdSize.inlineSize(this, screenWidth, 300);
    banner.setAdUnitId("R-M-XXXXX-YY");
    banner.setAdSize(stickySize);
    banner.loadAd(new AdRequest.Builder().build());
}
void loadAd() {
    BannerAdView banner = findViewById(R.id.banner);
    BannerAdSize stickySize = BannerAdSize.sticky(this, screenWidth);
    BannerAdSize inlineSizeSize = BannerAdSize.inline(this, screenWidth, 300);
    banner.setAdSize(stickySize);
    banner.loadAd(new AdRequest.Builder("R-M-XXXXX-YY").build());
}

5. AdInfo API 변경

광고 소재 정보를 가져오는 방식이 메서드에서 프로퍼티로 바뀌었고, 일부 추가 정보는 제거되었습니다.

클래스 메서드/필드 상태
BannerAdView,
InterstitialAd,
RewardedAd,
AppOpenAd,
NativeAd
info 제거됨. 대신 adInfo 사용
BannerAdView,
InterstitialAd,
RewardedAd,
AppOpenAd,
NativeAd
adAttributes 제거됨. 대신 adInfo 사용
NativeAd creativeId 제거됨. 대신 Creative.creativeId 사용
NativeAd campaignId 제거됨. 대신 Creative.campaignId 사용
AdInfo data 제거됨
AdInfo adSize 제거됨
AdInfo creatives 추가됨
AdInfo extraData 추가됨
AdInfo partnerText 추가됨
Creative placeId 추가됨
Creative offerId 추가됨

예시

Kotlin
SDK 7 SDK 8
// BannerAdView
val extraData = banner.info
val adUnitId = banner.adInfo.adUnitId
val extraData2 = banner.adInfo.data
val width = banner.adInfo.adSize?.width
val height = banner.adInfo.adSize?.height
val creativeId = banner.adInfo.creatives.first().creativeId
val campaignId = banner.adInfo.creatives.first().campaignId
val creativeId2 = banner.adAttributes.first().bannerId
val campaignId2 = banner.adAttributes.first().campaignId
val placeId = banner.adAttributes.first().placeId

// InterstitialAd, RewardedAd, AppOpenAd
val extraData = fullscreenAd.info.data
val adUnitId = fullscreenAd.info.adUnitId
val width = fullscreenAd.info.adSize?.width
val height = fullscreenAd.info.adSize?.height
val creativeId = fullscreenAd.info.creatives.first().creativeId
val campaignId = fullscreenAd.info.creatives.first().campaignId
val creativeId2 = fullscreenAd.adAttributes.first().bannerId
val campaignId2 = fullscreenAd.adAttributes.first().campaignId
val placeId = fullscreenAd.adAttributes.first().placeId

// NativeAd
val extraData = nativeAd.info
val creativeId = nativeAd.creativeId
val campaignId = nativeAd.campaignId
val creativeId2 = nativeAd.adAttributes?.bannerId
val campaignId2 = nativeAd.adAttributes?.campaignId
val placeId = nativeAd.adAttributes?.placeId
// BannerAdView
val extraData = banner.adInfo.extraData
val partnerText = banner.adInfo.partnerText
val creativeId = banner.adInfo.creatives.first().creativeId
val campaignId = banner.adInfo.creatives.first().campaignId
val placeId = banner.adInfo.creatives.first().placeId
val adUnitId = banner.adInfo.adUnitId
val width = banner.adSize?.width
val height = banner.adSize?.height

// InterstitialAd, RewardedAd, AppOpenAd
val extraData = fullscreenAd.adInfo.extraData
val partnerText = fullscreenAd.adInfo.partnerText
val adUnitId = fullscreenAd.adInfo.adUnitId
val creativeId = fullscreenAd.adInfo.creatives.first().creativeId
val campaignId = fullscreenAd.adInfo.creatives.first().campaignId
val placeId = fullscreenAd.adInfo.creatives.first().placeId

// NativeAd
val extraData = nativeAd.adInfo.extraData
val partnerText = nativeAd.adInfo.partnerText
val adUnitId = nativeAd.adInfo.adUnitId
val creativeId = nativeAd.adInfo.creatives.first().creativeId
val campaignId = nativeAd.adInfo.creatives.first().campaignId
val placeId = nativeAd.adInfo.creatives.first().placeId
Java
SDK 7 SDK 8
// BannerAdView
String extraData = banner.getInfo();
String adUnitId = banner.getAdInfo().getAdUnitId();
String extraData2 = banner.getAdInfo().getData();
int width = banner.getAdInfo().getAdSize().getWidth();
int height = banner.getAdInfo().getAdSize().getHeight();
String creativeId = banner.getAdInfo().getCreatives().get(0).getCreativeId();
String campaignId = banner.getAdInfo().getCreatives().get(0).getCampaignId();
String creativeId2 = banner.getAdAttributes().get(0).getBannerId();
String campaignId2 = banner.getAdAttributes().get(0).getCampaignId();
String placeId = banner.getAdAttributes().get(0).getPlaceId();

// InterstitialAd, RewardedAD, AppOpenAd
String extraData = fullscreenAd.getInfo().getData();
String adUnitId = fullscreenAd.getInfo().getAdUnitId();
int width = fullscreenAd.getInfo().getAdSize().getWidth();
int height = fullscreenAd.getInfo().getAdSize().getHeight();
String creativeId = fullscreenAd.getInfo().getCreatives().get(0).getCreativeId();
String campaignId = fullscreenAd.getInfo().getCreatives().get(0).getCampaignId();
String creativeId2 = fullscreenAd.getAdAttributes().get(0).getBannerId();
String campaignId2 = fullscreenAd.getAdAttributes().get(0).getCampaignId();
String placeId = fullscreenAd.getAdAttributes().get(0).getPlaceId();

// NativeAd
String extraData = nativeAd.getInfo();
String creativeId = nativeAd.getCreativeId();
String campaignId = nativeAd.getCampaignId();
String creativeId2 = nativeAd.getAdAttributes().getBannerId();
String campaignId2 = nativeAd.getAdAttributes().getCampaignId();
String placeId = nativeAd.getAdAttributes().getPlaceId();
// BannerAdView
String extraData = banner.getAdInfo().getExtraData();
String partnerText = banner.getAdInfo().getPartnerText();
String creativeId = banner.getAdInfo().getCreatives().get(0).getCreativeId();
String campaignId = banner.getAdInfo().getCreatives().get(0).getCampaignId();
String placeId = banner.getAdInfo().getCreatives().get(0).getPlaceId();
String adUnitId = banner.getAdInfo().getAdUnitId();
int width = banner.getAdSize().getWidth();
int height = banner.getAdSize().getHeight();

// InterstitialAd, RewardedAd, AppOpenAd
String extraData = fullscreenAd.getAdInfo().getExtraData();
String partnerText = fullscreenAd.getAdInfo().getPartnerText();
String adUnitId = fullscreenAd.getAdInfo().getAdUnitId();
String creativeId = fullscreenAd.getAdInfo().getCreatives().get(0).getCreativeId();
String campaignId = fullscreenAd.getAdInfo().getCreatives().get(0).getCampaignId();
String placeId = fullscreenAd.getAdInfo().getCreatives().get(0).getPlaceId();

// NativeAd
String extraData = nativeAd.getAdInfo().getExtraData();
String partnerText = nativeAd.getAdInfo().getPartnerText();
String adUnitId = nativeAd.getAdInfo().getAdUnitId();
String creativeId = nativeAd.getAdInfo().getCreatives().get(0).getCreativeId();
String campaignId = nativeAd.getAdInfo().getCreatives().get(0).getCampaignId();
String placeId = nativeAd.getAdInfo().getCreatives().get(0).getPlaceId();

6. 네이티브 광고 API 변경

NativeAd.bindNativeAdSliderAd.bindSliderAd() 메서드는 이제 AdBindingResult 바인딩 결과를 반환하며 예외를 던지지 않습니다. warning 필드 타입이 String?에서 NativeAdWarning?로 바뀌었습니다. 광고법 준수를 위해 새 클래스에는 warning 에셋 내용뿐 아니라, 전체 광고 영역 대비 warning 에셋의 최소 필요 크기(비율)도 포함됩니다. 선택한 광고에 동영상 소재가 있는지 나타내는 hasVideo 필드가 NativeAdMedia 클래스에 추가되었습니다.

클래스 메서드/필드 상태
NativeAd bindNativeAd 반환값 AdBindingResult 추가. 메서드는 더 이상 예외를 던지지 않음
SliderAd bindSliderAd 반환값 AdBindingResult 추가. 메서드는 더 이상 예외를 던지지 않음
AdBindingResult - 추가됨
NativeAdAssets warning 타입 변경: StringNativeAdWarning
NativeAdWarning - 추가됨
NativeAdWarning value 추가됨
NativeAdWarning minimumRequiredArea 추가됨
NativeAdMedia hasVideo 추가됨

예시

Kotlin
SDK 7 SDK 8
val warning = nativeAd.adAssets.warning
try {
    nativeAd.bindNativeAd(binder)
} catch (e: NativeAdException) {
    val message = e.message
}
val warningAsset = nativeAd.adAssets.warning
val warning = warningAsset?.value
val warningMinArea = warningAsset?.minimumRequiredArea
val hasVideo = nativeAd.adAssets.media?.hasVideo
when (val result = nativeAd.bindNativeAd(binder)) {
    is AdBindingResult.Failure -> {
        val missingAssetName = result.missingAssetName
        val message = result.exception.message
    }
    AdBindingResult.Success -> Unit
}
Java
SDK 7 SDK 8
void bindAd(NativeAd nativeAd) {
    String warning = nativeAd.getAdAssets().getWarning();
    try {
        nativeAd.bindNativeAd(binder);
    } catch (NativeAdException e) {
        String message = e.getMessage();
    }
}
void bindNativeAd(NativeAd nativeAd) {
    NativeAdWarning warningAsset = nativeAd.getAdAssets().getWarning();
    String warning = warningAsset.getValue();
    float minWarningArea = warningAsset.getMinimumRequiredArea();
    boolean hasVideo = nativeAd.getAdAssets().getMedia().getHasVideo();
    AdBindingResult result = nativeAd.bindNativeAd(binder);
    if (result instanceof AdBindingResult.Failure) {
        String missingAssetName = ((AdBindingResult.Failure) result).getMissingAssetName();
        String message = ((AdBindingResult.Failure) result).getException().getMessage();
    }
}

6.1 네이티브 광고 템플릿 API

네이티브 광고 템플릿 연동 도구가 제거되었습니다. 표준 네이티브 광고 컴포넌트로 연동하세요.

클래스 상태
NativeBannerView 제거됨
SizeConstraint 제거됨
HorizontalOffset 제거됨
NativeTemplateAppearance 제거됨
TextAppearance 제거됨
BannerAppearance 제거됨
ButtonAppearance 제거됨
RatingAppearance 제거됨

7. 일부 광고 객체 콜백 제거

ClosableBannerAdEventListenerClosableNativeAdEventListener 인터페이스가 제거되었습니다. onLeftApplicationonReturnToApplication 메서드도 제거되었습니다.

클래스 메서드 상태
ClosableBannerAdEventListener - 제거됨
ClosableNativeAdEventListener - 제거됨
BannerAdEventListener
NativeAdEventListener
onLeftApplication 제거됨
BannerAdEventListener
NativeAdEventListener
onReturnToApplication 제거됨

예시

Kotlin
SDK 7 SDK 8
bannerAd?.setBannerAdEventListener(object : ClosableBannerAdEventListener {
    override fun closeBannerAd() { /* ... */ }
    override fun onAdClicked() { /* ... */ }
    override fun onAdFailedToLoad(error: AdRequestError) { /* ... */ }
    override fun onAdLoaded() { /* ... */ }
    override fun onImpression(impressionData: ImpressionData?) { /* ... */ }
    override fun onLeftApplication() { /* ... */ }
    override fun onReturnedToApplication() { /* ... */ }
})
// ClosableAdEventListener as well as
// onAdClosed callback are not available anymore
bannerAdView?.setBannerAdEventListener(object : BannerAdEventListener {
    override fun onAdClicked() { /* ... */ }
    override fun onAdFailedToLoad(error: AdRequestError) { /* ... */ }
    override fun onAdLoaded() { /* ... */ }
    override fun onImpression(impressionData: ImpressionData?) { /* ... */ }
})
Java
SDK 7 SDK 8
void setEventListener(BannerAdView bannerView) {
    bannerView.setBannerAdEventListener(
    new ClosableBannerAdEventListener() {
            @Override
            public void closeBannerAd() { /* ... */ }
            @Override
            public void onAdLoaded() { /* ... */ }
            @Override
            public void onAdFailedToLoad(@NotNull AdRequestError adRequestError) { /* ... */ }
            @Override
            public void onAdClicked() { /* ... */ }
            @Override
            public void onLeftApplication() { /* ... */ }
            @Override
            public void onReturnedToApplication() { /* ... */ }
            @Override
            public void onImpression(@Nullable ImpressionData impressionData) { /* ... */ }
        }
    );
}
void setEventListener(BannerAdView bannerView) {
// ClosableAdEventListener as well as
// onAdClosed callback are not available anymore
    bannerView.setBannerAdEventListener(
        new BannerAdEventListener() {
            @Override
            public void onAdLoaded() { /* ... */ }
            @Override
            public void onAdFailedToLoad(@NotNull AdRequestError adRequestError) { /* ... */ }
            @Override
            public void onAdClicked() { /* ... */ }
            @Override
            public void onImpression(@Nullable ImpressionData impressionData) { /* ... */ }
        }
    );
}

8. 메인 SDK 클래스 변경

메인 SDK 클래스 이름이 YandexAds로 바뀌었으며, 일부 개인정보 설정용 메서드 이름도 변경되었습니다.

클래스 메서드 상태
MobileAds - 제거됨. 대신 YandexAds 사용
MobileAds setAgeRestrictedUser(Boolean) 제거됨. 대신 YandexAds.setAgeRestricted(Boolean) 사용.
MobileAds setLocationConsent(Boolean) 제거됨. 대신 YandexAds.setLocationTracking(Boolean) 사용.
YandexAds - 추가됨
YandexAds setAgeRestricted(Boolean) 추가됨
YandexAds setLocationTracking(Boolean) 추가됨

예시

Kotlin
SDK 7 SDK 8
import com.yandex.mobile.ads.common.MobileAds

MobileAds.setUserConsent(true)
MobileAds.setAgeRestrictedUser(false)
MobileAds.setLocationConsent(true)
MobileAds.initialize(context) { /* ... */ }
MobileAds.enableDebugErrorIndicator(true)
MobileAds.enableLogging(true)
MobileAds.setAppAdAnalyticsReporting(true)
MobileAds.showDebugPanel(this)
MobileAds.libraryVersion
import com.yandex.mobile.ads.common.YandexAds

YandexAds.setUserConsent(true)
YandexAds.setAgeRestricted(false)
YandexAds.setLocationTracking(true)
YandexAds.initialize(context) { /* ... */ }
YandexAds.enableDebugErrorIndicator(true)
YandexAds.enableLogging(true)
YandexAds.setAppAdAnalyticsReporting(true)
YandexAds.showDebugPanel(this)
YandexAds.libraryVersion
Java
SDK 7 SDK 8
import com.yandex.mobile.ads.common.MobileAds;

void initSdk() {
    MobileAds.setUserConsent(true);
    MobileAds.setAgeRestrictedUser(false);
    MobileAds.setLocationConsent(true);
    MobileAds.initialize(this, () -> { /* ... */ });
    MobileAds.getLibraryVersion();
    MobileAds.enableDebugErrorIndicator(true);
    MobileAds.enableLogging(true);
    MobileAds.setAppAdAnalyticsReporting(true);
    MobileAds.showDebugPanel(this);
}
import com.yandex.mobile.ads.common.YandexAds;

void initSdk() {
    YandexAds.setUserConsent(true);
    YandexAds.setAgeRestricted(false);
    YandexAds.setLocationTracking(true);
    YandexAds.initialize(this, () -> { /* ... */ });
    YandexAds.getLibraryVersion();
    YandexAds.enableDebugErrorIndicator(true);
    YandexAds.enableLogging(true);
    YandexAds.setAppAdAnalyticsReporting(true);
    YandexAds.showDebugPanel(this);
}


Instream API 변경

1. 패키지 및 종속성 구조 변경

새 SDK 구조에 맞게 주요 클래스 이름이 변경되었습니다.

클래스 상태
com.yandex.mobile.ads.instream.InstreamAdBinder Moved to com.yandex.mobile.ads.instream.binder.InstreamAdBinder
com.yandex.mobile.ads.instream.InstreamAdRequestConfiguration Renamed to com.yandex.mobile.ads.instream.InstreamAdRequest
com.yandex.mobile.ads.instream.InstreamAdBreak Renamed to com.yandex.mobile.ads.instream.adbreak.AdBreakData
com.yandex.mobile.ads.instream.inroll.Inroll
com.yandex.mobile.ads.instream.pauseroll.Pauseroll
Replaced by com.yandex.mobile.ads.instream.adbreak.InstreamAdBreak

예시

Kotlin
SDK 7 SDK 8
import com.yandex.mobile.ads.instream.InstreamAdBinder
import com.yandex.mobile.ads.instream.InstreamAdRequestConfiguration
import com.yandex.mobile.ads.instream.InstreamAdBreak
import com.yandex.mobile.ads.instream.inroll.Inroll
import com.yandex.mobile.ads.instream.pauseroll.Pauseroll
import com.yandex.mobile.ads.instream.binder.InstreamAdBinder
import com.yandex.mobile.ads.instream.InstreamAdRequest
import com.yandex.mobile.ads.instream.adbreak.AdBreakData
import com.yandex.mobile.ads.instream.adbreak.InstreamAdBreak
Java
SDK 7 SDK 8
import com.yandex.mobile.ads.instream.InstreamAdBinder;
import com.yandex.mobile.ads.instream.InstreamAdRequestConfiguration;
import com.yandex.mobile.ads.instream.InstreamAdBreak;
import com.yandex.mobile.ads.instream.inroll.Inroll;
import com.yandex.mobile.ads.instream.pauseroll.Pauseroll;
import com.yandex.mobile.ads.instream.binder.InstreamAdBinder;
import com.yandex.mobile.ads.instream.InstreamAdRequest;
import com.yandex.mobile.ads.instream.adbreak.AdBreakData;
import com.yandex.mobile.ads.instream.adbreak.InstreamAdBreak;

2. AdRequest 변경

InstreamAdRequestConfiguration 클래스 이름이 InstreamAdRequest로 바뀌었습니다.

클래스 상태
InstreamAdRequestConfiguration 제거됨. 대신 InstreamAdRequest 사용
InstreamAdRequest 추가됨
InstreamAdBreakRequest 추가됨

예시

Kotlin
SDK 7 SDK 8
val loader = InstreamAdLoader(this)
val config = InstreamAdRequestConfiguration.Builder("XXXXXX").build()
loader.loadInstreamAd(this, config)
val loader = InstreamAdLoader(this)
val config = InstreamAdRequest.Builder("XXXXXX").build()
loader.loadInstreamAd(this, config)
Java
SDK 7 SDK 8
void loadAd() {
    InstreamAdLoader loader = new InstreamAdLoader(this);
    InstreamAdRequestConfiguration config = new InstreamAdRequestConfiguration.Builder("XXXXXX").build();
    loader.loadInstreamAd(this, config);
}
void loadAd() {
    InstreamAdLoader loader = new InstreamAdLoader(this);
    InstreamAdRequest config = new InstreamAdRequest.Builder("XXXXXX").build();
    loader.loadInstreamAd(this, config);
}

3. 광고 로딩 API 변경

콜백 리스너 등록 방식과 광고 로딩 방식이 변경되었습니다. 광고 브레이크를 로드하는 InstreamAdBreakLoader 클래스가 추가되었습니다. onInstreamAdFailedToLoad 메서드 시그니처도 바뀌어, 이제 reason 문자열 대신 InstreamAdRequestError 객체가 전달됩니다.

클래스 메서드 상태
InstreamAdLoader setInstreamAdLoadListener(InstreamAdLoadListener) 제거됨. loadAd 호출 시 InstreamAdLoadListener를 인자로 넘깁니다.
InstreamAdLoader loadAd(InstreamAdRequestConfiguration) 제거됨. loadAd 호출 시 InstreamAdLoadListener를 인자로 넘깁니다.
InstreamAdLoader loadAd(InstreamAdRequest, InstreamAdLoadListener) 제거됨. loadAd 호출 시 InstreamAdLoadListener를 인자로 넘깁니다.
InstreamAdLoadListener onInstreamAdFailedToLoad(String) 제거됨. 대신 onInstreamAdFailedToLoad(InstreamAdRequestError) 사용.
InstreamAdLoadListener onInstreamAdFailedToLoad(InstreamAdRequestError) 추가됨
InstreamAdBreakLoader - 추가됨
InstreamAdBreakLoader loadAd(InstreamAdBreakRequest, InstreamAdBreakLoadListener) 추가됨
InstreamAdBreakLoadListener - 추가됨

예시

Kotlin
SDK 7 SDK 8
val instreamAdLoader = InstreamAdLoader(this)
instreamAdLoader.setInstreamAdLoadListener(object : InstreamAdLoadListener {
    override fun onInstreamAdLoaded(instreamAd: InstreamAd) {
        // ...
    }

    override fun onInstreamAdFailedToLoad(reason: String) {
        println("Instream ad failed to load: $reason")
    }
})
val config = InstreamAdRequestConfiguration.Builder("XXXXXX").build()
instreamAdLoader.loadInstreamAd(this, config)
val instreamAdLoader = InstreamAdLoader(this)
val config = InstreamAdRequest.Builder("XXXXXX").build()
instreamAdLoader.loadAd(config, object : InstreamAdLoadListener {
    override fun onInstreamAdLoaded(instreamAd: InstreamAd) {
        // ...
    }

    override fun onInstreamAdFailedToLoad(error: InstreamAdRequestError) {
        println("Instream ad failed to load: ${error.reason}")
    }
})
Java
SDK 7 SDK 8
void loadInstreamAd() {
    InstreamAdLoader instreamAdLoader = new InstreamAdLoader(this);
    instreamAdLoader.setInstreamAdLoadListener(new InstreamAdLoadListener() {
        @Override
        public void onInstreamAdLoaded(InstreamAd instreamAd) {
            // ...
        }

        @Override
        public void onInstreamAdFailedToLoad(String reason) {
            System.out.println("Instream ad failed to load: " + reason);
        }
    });
    InstreamAdRequestConfiguration config = new InstreamAdRequestConfiguration.Builder("XXXXXX").build();
    instreamAdLoader.loadInstreamAd(this, config);
}
void loadInstreamAd() {
    InstreamAdLoader instreamAdLoader = new InstreamAdLoader(this);
    InstreamAdRequest config = new InstreamAdRequest.Builder("XXXXXX").build();
    instreamAdLoader.loadAd(config, new InstreamAdLoadListener() {
        @Override
        public void onInstreamAdLoaded(InstreamAd instreamAd) {
            // ...
        }

        @Override
        public void onInstreamAdFailedToLoad(InstreamAdRequestError error) {
            System.out.println("Instream ad failed to load: " + error.getReason());
        }
    });
}

3.1 Kotlin Coroutines 지원

InstreamAdLoaderInstreamAdBreakAdLoader의 광고 로딩 메서드에 suspend 오버로드가 추가되었습니다.

클래스 메서드 상태
InstreamAdLoader suspend fun loadAd(InstreamAdRequest): InstreamAdLoadResult 추가됨
InstreamAdBreakLoader suspend fun loadAd(InstreamAdBreakRequest): InstreamAdBreakLoadResult 추가됨

예시

Kotlin
lifecycleScope.launch {
    val instreamAdLoader = InstreamAdLoader(applicationContext)
    when(val result = instreamAdLoader.loadAd(InstreamAdRequest.Builder("XXXXXX").build())) {
        is InstreamAdLoadResult.Failure -> TODO("Handle error: ${result.error.description}")
        is InstreamAdLoadResult.Success -> TODO("Show instream ad: ${result.ad}")
    }

    val adBreakLoader = InstreamAdBreakLoader(applicationContext)
    when (val result = adBreakLoader.loadAd(InstreamAdBreakRequest.Builder("XXXXXX", "YY").build())) {
        is InstreamAdBreakLoadResult.Failure -> TODO("Handle error: ${result.error.description}")
        is InstreamAdBreakLoadResult.Success -> TODO("Show adBreak : ${result.adBreak}")
    }
}

4. In-roll 및 Pause-roll 연동

광고 브레이크 관리 방식이 더 유연해졌습니다. 전용 큐 제공자 InrollQueueProviderPauserollQueueProvider는 제거되었으며, 모든 브레이크는 InstreamAd 객체에서 바로 가져와 유형별로 필터링합니다.

InstreamAdBinder로 자동 렌더링을 사용하는 경우 instreamAdBreaks 컬렉션에서 INROLLPAUSEROLL 유형의 브레이크만 선택하세요.

클래스 상태
InrollQueueProvider 제거됨. InstreamAdBreakType.INROLL로 필터한 instreamAd.instreamAdBreaks 사용
PauserollQueueProvider 제거됨. InstreamAdBreakType.PAUSEROLL로 필터한 instreamAd.instreamAdBreaks 사용

예시

Kotlin
SDK 7 SDK 8
// 1. Get the In-roll queue from the loaded ad
val inrollQueueProvider = InrollQueueProvider(context, instreamAd)
val instreamAdBreakQueue = inrollQueueProvider.queue

// 2. Prepare a specific break
val currentInroll = instreamAdBreakQueue.poll()
currentInroll?.setListener(object : InstreamAdBreakEventListener {
    override fun onInstreamAdBreakPrepared() {
        // 3. Show the prepared break
        currentInroll.play(instreamAdView)
    }
    // ... other listener methods
})
currentInroll?.prepare(instreamAdPlayer)
// 1. Get the list of all breaks directly from InstreamAd
val inrolls = instreamAd.instreamAdBreaks.filter {
    it.adBreakData.type == InstreamAdBreakType.INROLL
}

// 2. Prepare and show
val inrollIndex = 0 // Manage the index yourself
val currentInroll = inrolls.getOrNull(inrollIndex)

currentInroll?.setListener(object : InstreamAdBreakEventListener {
    override fun onInstreamAdBreakPrepared() {
        // 3. Show the prepared break
        currentInroll.play(instreamAdView)
    }
})
currentInroll?.prepare(instreamAdPlayer)
Java
SDK 7 SDK 8
void loadAdBreak() {
// 1. Get the In-roll queue from the loaded ad
    InrollQueueProvider inrollQueueProvider = new InrollQueueProvider(context, instreamAd);
    Queue<Inroll> instreamAdBreakQueue = inrollQueueProvider.getQueue();

// 2. Prepare a specific break
    Inroll currentInroll = instreamAdBreakQueue.poll();
    if (currentInroll != null) {
        currentInroll.setListener(new InstreamAdBreakEventListener() {
            @Override
            public void onInstreamAdBreakPrepared() {
                // 3. Show the prepared break
                currentInroll.play(instreamAdView);
            }
            // ... other listener methods
        });
        currentInroll.prepare(instreamAdPlayer);
    }
}
void loadAdBreak() {
    // 1. Get the list of all breaks directly from InstreamAd
    List<InstreamAdBreak> inrolls = new ArrayList<>();
    for (InstreamAdBreak adBreak : instreamAd.getInstreamAdBreaks()) {
        if (adBreak.getAdBreakData().getType() == InstreamAdBreakType.INROLL) {
            inrolls.add(adBreak);
        }
    }

    // 2. Prepare and show
    int inrollIndex = 0; // Manage the index yourself
    InstreamAdBreak currentInroll = inrollIndex < inrolls.size() ? inrolls.get(inrollIndex) : null;

    if (currentInroll != null) {
        currentInroll.setListener(new InstreamAdBreakEventListener() {
            @Override
            public void onInstreamAdBreakPrepared() {
                // 3. Show the prepared break
                currentInroll.play(instreamAdView);
            }
        });
        currentInroll.prepare(instreamAdPlayer);
    }
}

5. 기본 플레이어

동영상 렌더링용 플레이어를 넘기는 것은 선택 사항입니다. null을 넘기면 SDK가 동영상 렌더링을 전적으로 담당합니다.

클래스 메서드 상태
InstreamAdBinder constructor instreamAdPlayer 매개변수는 선택 사항이며, null을 넘겨도 됩니다.
InstreamAdBreak prepare(instreamAdPlayer) 제거됨. 매개변수 없는 prepare() 사용
InstreamAdBreak prepare() 추가됨

예시

Kotlin
SDK 7 SDK 8
// Automatic start (InstreamAdBinder)
val instreamAdBinder = InstreamAdBinder(
    context,
    instreamAd,
    instreamAdPlayer, // Player was required
    contentPlayer
)

// Manual start (InstreamAdBreak)
val adBreak: InstreamAdBreak
adBreak.prepare(instreamAdPlayer)
// Automatic start (InstreamAdBinder)
val instreamAdBinder = InstreamAdBinder(
    context,
    instreamAd,
    null, // Pass null to use the default player
    contentPlayer
)

// Manual start (InstreamAdBreak)
val adBreak: InstreamAdBreak
adBreak.prepare()
Java
SDK 7 SDK 8
void showAd() {
    // Automatic start (InstreamAdBinder)
    InstreamAdBinder instreamAdBinder = new InstreamAdBinder(
            context,
            instreamAd,
            instreamAdPlayer, // Player was required
            contentPlayer
    );

    // Manual start (InstreamAdBreak)
    InstreamAdBreak adBreak;
    adBreak.prepare(instreamAdPlayer);
}
void showAd() {
    // Automatic start (InstreamAdBinder)
    InstreamAdBinder instreamAdBinder = new InstreamAdBinder(
            context,
            instreamAd,
            null, // Pass null to use the default player
            contentPlayer
    );

    // Manual start (InstreamAdBreak)
    InstreamAdBreak adBreak;
    adBreak.prepare();
}

6. InstreamAdPlayer 인터페이스 변경

InstreamAdPlayer 인터페이스가 업데이트되었습니다. 동영상 포맷 선택을 최적화하는 supportedMimeTypes 프로퍼티가 추가되었고, 광고 요소를 동영상 위에 올바르게 배치하기 위한 bindPlayerView 메서드가 추가되었습니다.

클래스 메서드 상태
InstreamAdPlayer supportedMimeTypes: List<String> 추가됨. SDK가 가장 적합한 동영상 포맷(예: MP4 대신 DASH)을 고를 수 있게 합니다.
InstreamAdPlayer bindPlayerView(container: FrameLayout) 추가됨. 제공된 컨테이너 전체를 채우도록 그 안에 videoPlayerView를 배치해야 합니다.

예시

Kotlin
SDK 7 SDK 8
class InstreamAdPlayerImpl : InstreamAdPlayer {
    // ... methods (prepareAd, playAd, pauseAd, etc.)
}
class InstreamAdPlayerImpl : InstreamAdPlayer {

    // 1. List of MIME types supported by the player
    override val supportedMimeTypes: List<String>
        get() = listOf(InstreamAdMimeTypes.MP4, InstreamAdMimeTypes.WEBM)

    // 2. Place videoPlayerView inside container filling the full space
    override fun bindPlayerView(container: FrameLayout) {
        container.addView(playerView)
    }

    // ... other methods (prepareAd, playAd, pauseAd, etc.)
}
Java
SDK 7 SDK 8
public class InstreamAdPlayerImpl implements InstreamAdPlayer {
    // ... methods (prepareAd, playAd, pauseAd, etc.)
}
public class InstreamAdPlayerImpl implements InstreamAdPlayer {

    // 1. List of MIME types supported by the player
    @Override
    public List<String> getSupportedMimeTypes() {
        return Arrays.asList(InstreamAdMimeTypes.MP4, InstreamAdMimeTypes.WEBM);
    }

    // 2. Place videoPlayerView inside container filling the full space
    @Override
    public void bindPlayerView(FrameLayout container) {
        container.addView(playerView);
    }

    // ... other methods (prepareAd, playAd, pauseAd, etc.)
}

미디에이션 네트워크 API 변경

1. 미디에이션 네트워크 데이터 전달용 신규 API

미디에이션 어댑터에서는 어댑터 식별 정보를 별도 메서드로 넘기도록 바뀌었습니다.

클래스 메서드 상태
AdapterIdentity - 추가됨
YandexAds setAdapterIdentity(AdapterIdentity) 추가됨. 광고 요청에 어댑터 데이터를 추가 인자로 넘기지 말고, YandexAds.initialize 전에 이 메서드를 호출하세요.

예시

Kotlin
SDK 7 SDK 8
YandexAds.initialize(context, listener)

val parameters = mapOf(
    "adapter_network_name" to "AdNetwork",
    "adapter_network_version" to "1.2.3",
    "adapter_version" to "1.0.0"
)

val adRequest = AdRequest.Builder()
    .setParameters(parameters)
    .build()

bannerAd.loadAd(adRequest)
val identity = AdapterIdentity("AdNetwork", "1.0.0", "1.2.3")
YandexAds.setAdapterIdentity(identity) // Call before initialize()
YandexAds.initialize(context, listener)

// No need to pass additional parameters
val adRequest = AdRequest.Builder("R-M-XXXXX-YY").build()
bannerAd.loadAd(adRequest)
Java
SDK 7 SDK 8
void loadAd() {
    Map<String, String> parameters = new HashMap<>();
    parameters.put("adapter_network_name", "AdNetwork");
    parameters.put("adapter_network_version", "1.2.3");
    parameters.put("adapter_version", "1.0.0");

    AdRequest adRequest = new AdRequest.Builder()
            .setParameters(parameters)
            .build();

    bannerView.loadAd(adRequest);
}
void loadAd() {
    AdapterIdentity adapterIdentity = new AdapterIdentity("AdNetwork", "1.0.0", "1.2.3");
    YandexAds.setAdapterIdentity(adapterIdentity); // Call before initialize()
    YandexAds.initialize(this, () -> { /* ... */ });

    // No need to pass additional parameters
    AdRequest adRequest = new AdRequest.Builder("R-M-XXXXX-YY").build();

    bannerView.loadAd(adRequest);
}

2. BidderTokenRequest 개편

BidderTokenLoader 클래스에 생성자가 생겼고, loadBidderToken 메서드는 정적 메서드에서 인스턴스 메서드로 바뀌었습니다. BidderTokenRequestConfiguration 클래스는 BidderTokenRequest로 이름이 바뀌고 구조도 달라졌습니다. 이제 Builder(AdType) 대신 banner, interstitial, rewarded, appOpenAd, native 팩토리 메서드로 인스턴스를 만듭니다.

클래스 생성자/메서드 상태
BidderTokenLoader BidderTokenLoader(Context) 생성자 추가
BidderTokenLoader loadBidderToken 변경됨. 정적 메서드에서 BidderTokenLoader 클래스의 인스턴스 메서드로 바뀜
BidderTokenRequestConfiguration - 제거됨. 대신 BidderTokenRequest 사용
BidderTokenRequestConfiguration.Builder - 제거됨. BidderTokenRequest의 팩토리 메서드 사용
BidderTokenRequestConfiguration.Builder setBannerAdSize(BannerAdSize) 제거됨. BidderTokenRequest.banner(BannerAdSize) 인자에 BannerAdSize 전달
BidderTokenRequestConfiguration.Builder setParameters(Map<String, String>) 제거됨. 매개변수는 팩토리 메서드 인자로 전달
BidderTokenRequest - 추가됨
BidderTokenRequest banner(BannerAdSize) 추가됨
BidderTokenRequest banner(BannerAdSize, AdTargeting) 추가됨
BidderTokenRequest banner(BannerAdSize, AdTargeting, Map<String, String>) 추가됨
BidderTokenRequest interstitial() 추가됨
BidderTokenRequest interstitial(AdTargeting) 추가됨
BidderTokenRequest interstitial(AdTargeting, Map<String, String>) 추가됨
BidderTokenRequest rewarded() 추가됨
BidderTokenRequest rewarded(AdTargeting) 추가됨
BidderTokenRequest rewarded(AdTargeting, Map<String, String>) 추가됨
BidderTokenRequest appOpenAd() 추가됨
BidderTokenRequest appOpenAd(AdTargeting) 추가됨
BidderTokenRequest appOpenAd(AdTargeting, Map<String, String>) 추가됨
BidderTokenRequest native() 추가됨
BidderTokenRequest native(AdTargeting) 추가됨
BidderTokenRequest native(AdTargeting, Map<String, String>) 추가됨

예시

Kotlin
SDK 7 SDK 8
val bidderTokenRequest = BidderTokenRequestConfiguration.Builder(AdType.INTERSTITIAL)
    .setBannerAdSize(BannerAdSize.stickySize(this, screenWidth))
    .setParameters(mapOf("a" to "b"))
    .build()

BidderTokenLoader.loadBidderToken(
    this,
    bidderTokenRequest,
    object : BidderTokenLoadListener { /* ... */ }
)
val bidderTokenLoader = BidderTokenLoader(this);
bidderTokenLoader.loadBidderToken(
    BidderTokenRequest.banner(BannerAdSize.sticky(this, screenWidth), parameters = mapOf("a" to "b")),
    object : BidderTokenLoadListener { /* ... */ }
)

bidderTokenLoader.loadBidderToken(
    BidderTokenRequest.interstitial(),
    object : BidderTokenLoadListener { /* ... */ }
)
Java
SDK 7 SDK 8
void loadToken() {
    Map<String, String> parameters = new HashMap<>();
    parameters.put("a", "b");

    BidderTokenRequestConfiguration bidderTokenRequest =
            new BidderTokenRequestConfiguration.Builder(AdType.INTERSTITIAL)
                    .setBannerAdSize(BannerAdSize.stickySize(this, screenWidth))
                    .setParameters(parameters)
                    .build();

    BidderTokenLoader.loadBidderToken(
            this,
            bidderTokenRequest,
            new BidderTokenLoadListener() { /* ... */ }
    );
}
void loadToken() {
    Map<String, String> parameters = new HashMap<>();
    parameters.put("a", "b");

    BidderTokenLoader bidderTokenLoader = new BidderTokenLoader(this);
    bidderTokenLoader.loadBidderToken(
            BidderTokenRequest.banner(BannerAdSize.inline(this, screenWidth), null, parameters),
            new BidderTokenLoadListener() { /* ... */ }
    );

    bidderTokenLoader.loadBidderToken(BidderTokenRequest.interstitial(),
            new BidderTokenLoadListener() { /* ... */ }
    );
}

Jetpack Compose 연동

Jetpack Compose 연동이 지원됩니다. Jetpack Compose 섹션의 연동 예시를 참고하세요.

AI 기반 마이그레이션

SDK 7.x에서 8.x로 옮기는 과정을 돕기 위해, 미리 준비된 마이그레이션 스킬과 함께 AI 어시스턴트를 사용할 수 있습니다.

사용 방법

  1. 스킬 다운로드

    마이그레이션 스킬은 GitHub Yandex Ads SDK Android에서 받을 수 있습니다.

    • Claude Desktop

      에이전트 스킬 디렉터리에 스킬 폴더를 복사합니다. 예:

      cp -r Skills/migrate-yandex-ads-sdk-from-7-to-8 .claude/skills/
      
    • Cursor IDE

      프로젝트에 스킬 폴더를 복사한 뒤 @SKILL.md를 지정합니다. 예:

      @migrate-yandex-ads-sdk-from-7-to-8/SKILL.md
      
    • 다른 방법

      SKILL.md 내용과 관련 파일을 AI 대화에 붙여 넣습니다(메시지 길이 제한을 넘을 수 있음).

  2. 프롬프트 사용

    스킬을 불러온 뒤 AI 대화에 아래와 같이 입력합니다.

    Migrate my project from Yandex Mobile Ads SDK 7.x to 8.x
    

AI가 생성한 변경 사항은 반드시 직접 검토하세요.

스킬은 AI가 작업을 올바르게 수행하도록 돕지만, 에이전트가 적용한 모든 변경은 본인이 확인·검증해야 합니다. AI는 실수할 수 있으므로 수동 코드 리뷰가 필요합니다.

요구 사항

  • Gradle: 7.0 이상
  • Android Gradle Plugin: 8.3.2 이상
  • Android SDK: 21(Android 5.0) 이상
  • Kotlin: 1.9.0 이상
  • Java: 8 이상