---
metadata:
  - name: generator
    content: Diplodoc Platform v5.50.6
alternate:
  - https://ads.yandex.com/helpcenter/en/dev/android/release/8-0-0-migration.md
  - https://ads.yandex.com/helpcenter/ru/dev/android/release/8-0-0-migration.md
  - https://ads.yandex.com/helpcenter/zh/dev/android/release/8-0-0-migration.md
---
> **Documentation Index:** Fetch the complete configuration index at https://ads.yandex.com/helpcenter/ru/llms.txt

<!--
Используется в Boost: boost/ru/ad-monetization/dev/android
-->

# Руководство по миграции на версию 8

Новая 8-я версия Yandex Mobile Ads SDK вносит в API ряд изменений, направленных на улучшение пользовательского опыта разработчиков.

{% note tip "Миграция с помощью AI-инструментов" %}

Чтобы ускорить переход с SDK 7.x на 8.x, воспользуйтесь готовым скиллом миграции для AI-ассистентов — подробности в разделе [Миграция с помощью AI-инструментов](#ai).

{% endnote %}

## Основные изменения

### 1. Изменения в AdRequest

Классы `AdRequestConfiguration` и `NativeAdRequestConfiguration` удалены. Используйте `AdRequest` для всех типов рекламы.

#|
|| **Класс** | **Статус** ||
|| `AdRequestConfiguration` | Удален. Используйте `AdRequest` ||
|| `NativeAdRequestConfiguration` | Удален. Используйте `AdRequest` и `NativeAdOptions` ||
|#

#### Примеры

{% list tabs group=instructions %}

- Kotlin

  #|
  || **SDK 7** ||
  || 
  ```kotlin
  // 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>(BannerAdView)
  bannerView.setAdUnitId("R-M-XXXXX-YY")
  val request = AdRequest.Builder().build()
  bannerView.loadAd(request)
  ``` 
  ||
  || **SDK 8** ||
  || 
  ```kotlin
  // 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>(BannerAdView)
  val request = AdRequest.Builder("R-M-XXXXX-YY").build()
  bannerView.loadAd(request)
  ``` 
  ||
  |#

- Java

  #|
  || **SDK 7** ||
  || 
  ```java
  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);
  }
  ``` 
  ||
  || **SDK 8** ||
  || 
  ```java
  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 = new AdRequest.Builder("R-M-XXXXX-YY").build();
      bannerView.loadAd(request);
  }
  ``` 
  ||
  |#

{% endlist %}

### 2. Изменения в Targeting API

- Поля `age`, `gender`, `location`, `contextQuery` и `contextTags` удалены из `AdRequest.Builder`. 
- Для управления параметрами таргетинга используйте новый класс `AdTargeting`.

#|
|| **Класс** | **Статус** ||
|| `AdTargeting` | Добавлен ||
|| `AdTargeting.Builder` | Добавлен ||
|#

#|
|| **Класс** | **Метод** | **Статус** ||
|| `AdRequest.Builder` | `setAge(String)` | Удален, используйте `AdTargeting.Builder.setAge(String)` и `AdRequest.Builder.setTargeting(AdTargeting)` ||
|| ^ | `setGender(String)` | Удален, используйте `AdTargeting.Builder.setGender(String)` и `AdRequest.Builder.setTargeting(AdTargeting)` ||
|| ^ | `setLocation(Location)` | Удален, используйте `AdTargeting.Builder.setLocation(Location)` и `AdRequest.Builder.setTargeting(AdTargeting)` ||
|| ^ | `setContextQuery(String)` | Удален, используйте `AdTargeting.Builder.setContextQuery(String)` и `AdRequest.Builder.setTargeting(AdTargeting)` ||
|| ^ | `setContextTags(List<String>)` | Удален, используйте `AdTargeting.Builder.setContextTags(List<String>)` и `AdRequest.Builder.setTargeting(AdTargeting)` ||
|| ^ | `setTargeting(AdTargeting)` | Добавлен ||
|| `AdTargeting.Builder` | `setAge(String)` | Добавлен ||
|| ^ | `setGender(String)` | Добавлен ||
|| ^ | `setLocation(Location)` | Добавлен ||
|| ^ | `setContextQuery(String)` | Добавлен ||
|| ^ | `setContextTags(List<String>)` | Добавлен ||
|#

#### Примеры

{% list tabs group=instructions %}

- Kotlin

  #|
  || **SDK 7** ||
  || 
  ```kotlin
  val adRequest = AdRequest.Builder()
      .setAge("25")
      .setGender(Gender.MALE)
      .setContextTags(listOf("news"))
      .build()
  ``` 
  ||
  || **SDK 8** ||
  || 
  ```kotlin
  val targeting = AdTargeting.Builder()
      .setAge("25")
      .setGender(Gender.MALE)
      .setContextTags(listOf("news"))
      .build()

  val adRequest = AdRequest.Builder(adUnitId)
      .setTargeting(targeting)
      .build()
  ``` 
  ||
  |#

- Java

  #|
  || **SDK 7** ||
  || 
  ```java
  void loadAd() {
      AdRequest adRequest = AdRequest.Builder()
              .setAge("25")
              .setGender(Gender.MALE)
              .setContextTags(listOf("news"))
              .build();
  }
  ``` 
  ||
  || **SDK 8** ||
  || 
  ```java
  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();
  }
  ``` 
  ||
  |#

{% endlist %}

### 3. Изменения в API загрузки рекламы

Изменены методы для регистрации слушателей обратного вызова и загрузки рекламы.

#|
|| **Класс** | **Метод** | **Статус** ||
|| InterstitialAdLoader | `setAdLoadListener(InterstitialAdLoadListener)` | Удален. Передавайте `InterstitialAdLoadListener` в параметрах метода `loadAd`. ||
|| ^ | `loadAd(AdRequestConfiguration)` | Удален. Используйте `loadAd(AdRequest, InterstitialAdLoadListener)`. ||
|| ^ | `loadAd(AdRequest, InterstitialAdLoadListener)` | Добавлен ||
|| RewardedAdLoader | `setAdLoadListener(RewardedAdLoadListener)` | Удален. Передавайте `RewardedAdLoadListener` в параметрах метода `loadAd`. ||
|| ^ | `loadAd(AdRequestConfiguration)` | Удален. Используйте `loadAd(AdRequest, RewardedAdLoadListener)` ||
|| ^ | `loadAd(AdRequest, RewardedAdLoadListener)` | Добавлен ||
|| AppOpenAdLoader | `setAdLoadListener(AppOpenAdLoadListener)` | Удален. Передавайте `AppOpenAdLoadListener` в параметрах метода `loadAd`. ||
|| ^ | `loadAd(AdRequestConfiguration)` | Удален. Используйте `loadAd(AdRequest, AppOpenAdLoadListener)` ||
|| ^ | `loadAd(AdRequest, AppOpenAdLoadListener)` | Добавлен ||
|| NativeAdLoader | `setNativeAdLoadListener(NativeAdLoadListener)` | Удален. Передавайте `NativeAdLoadListener` в параметрах метода `loadAd`. ||
|| ^ | `loadAd(NativeAdRequestConfiguration)` | Удален. Используйте `loadAd(AdRequest, NativeAdLoadListener)`. ||
|| ^ | `loadAd(AdRequest, NativeAdOptions, NativeAdLoadListener)` | Добавлен ||
|| ^ | `loadAd(AdRequest, NativeAdLoadListener)` | Добавлен ||
|| SliderAdLoader | `setSliderAdLoadListener(SliderAdLoadListener)` | Удален. Передавайте `SliderAdLoadListener` в параметрах метода `loadAd`. ||
|| ^ | `loadSlider(NativeAdRequestConfiguration)` | Удален. Используйте `loadAd(AdRequest, SliderAdLoadListener)`. ||
|| ^ | `loadSlider(AdRequest, NativeAdOptions, SliderAdLoadListener)` | Добавлен ||
|| ^ | `loadAd(AdRequest, NativeAdLoadListener)` | Добавлен ||
|| NativeBulkAdLoader | `setNativeBulkAdLoadListener(NativeBulkAdLoadListener)` | Удален. Передавайте `NativeBulkAdLoadListener` в параметрах метода `loadAd`. ||
|| ^ | `loadAds(NativeAdRequestConfiguration, Int)` | Удален. Используйте `loadAd(AdRequest, NativeAdLoadListener)`. ||
|| ^ | `loadAds(AdRequest, NativeAdOptions, NativeBulkAdLoadListener)` | Добавлен ||
|| ^ | `loadAds(AdRequest, NativeBulkAdLoadListener)` | Добавлен ||
|#

#### Примеры

{% list tabs group=instructions %}

- Kotlin

  #|
  || **SDK 7** ||
  || 
  ```kotlin
  // 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)
  ``` 
  ||
  || **SDK 8** ||
  || 
  ```kotlin
  // 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** ||
  || 
  ```java
  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);
  }
  ```
  ||
  || **SDK 8** ||
  ||
  ```java
  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() { /* ... */ }
      );
  }
  ```
  ||
  |#

{% endlist %}

### 3.1 Поддержка Kotlin Coroutines

В API добавлены `suspend` перегрузки методов для загрузки рекламы:

#|
|| **Класс** | **Метод** | **Статус** ||
|| 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` | Добавлен ||
|| ^ | `suspend fun loadAd(AdRequest): NativeAdLoadResult` | Добавлен ||
|| SliderAdLoader | `suspend fun loadAd(AdRequest): SliderAdLoadResult` | Добавлен ||
|| ^ | `suspend fun loadAd(AdRequest, NativeAdOptions): SliderAdLoadResult` | Добавлен ||
|| NativeBulkAdLoader | `suspend fun loadAds(AdRequest, Int): NativeBulkAdLoadResult` | Добавлен ||
|| ^ | `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. Изменения в Banner API

Из `BannerAdView` был удален метод `setAdUnitId`, теперь `adUnitId` устанавливается для каждой загрузки объявления.
Фабричные методы для создания `BannerAdSize` были переименованы.

#|
|| **Класс** | **Метод** | **Статус** ||
|| `BannerAdView` | `setAdUnitId(String)` | Удален. Передавайте `adUnitId` в конструктор `AdRequest` перед загрузкой объявления. ||
|| `BannerAdSize` | `stickySize` | Удален. Используйте `BannerAdSize.sticky`. ||
|| ^ | `inlineSize` | Удален. Используйте `BannerAdSize.inline`. ||
|#

#### Примеры

{% list tabs group=instructions %}

- Kotlin

  #|
  || **SDK 7** ||
  || 
  ```kotlin
  val banner = findViewById<R.id.banner>(BannerAdView)
  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())
  ``` 
  ||
  || **SDK 8** ||
  || 
  ```kotlin
  val banner = findViewById<R.id.banner>(BannerAdView)
  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** ||
  || 
  ```java
  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());
  }
  ``` 
  ||
  || **SDK 8** ||
  || 
  ```java
  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());
  }
  ``` 
  ||
  |#

{% endlist %}

### 5. Изменения в AdInfo API

Методы получения информации о рекламных креативах изменены. с методов на свойства, удалена дополнительная информация:

#|
|| **Класс** | **Метод/Поле** | **Статус** ||
|| `BannerAdView`, `InsterstitialAd`, `RewardedAd`, `AppOpenAd`, `NativeAd` | `info` | Удален. Используйте `adInfo` ||
|| ^ | `adAttributes` | Удален. Используйте `adInfo` ||
|| `NativeAd` | `creativeId` | Удален. используйте `Creative.creativeId` ||
|| ^ | `campaignId` | Удален. используйте `Creative.campaignId` ||
|| `AdInfo` | `data` | Удален ||
|| ^ | `adSize` | Удален ||
|| ^ | `creatives` | Добавлен ||
|| ^ | `extraData` | Добавлен ||
|| ^ | `partnerText` | Добавлен ||
|| `Creative` | `placeId` | Добавлен ||
|| ^ | `offerId` | Добавлен ||
|#

#### Примеры

{% list tabs group=instructions %}

- Kotlin

  #|
  || **SDK 7** ||
  || 
  ```kotlin
  // 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
  ``` 
  ||
  || **SDK 8** ||
  || 
  ```kotlin
  // 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** ||
  || 
  ```java
  // 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();
  ``` 
  ||
  || **SDK 8** ||
  || 
  ```java
  // 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();
  ``` 
  ||
  |#

{% endlist %}


### 6. Изменения в Native Ads API

- Методы `NativeAd.bindNativeAd` и `SliderAd.bindSliderAd()` теперь возвращают результат связывания `AdBindingResult` и больше не выбрасывают исключений.
- Тип поля `warning` изменен с `String?` на `NativeAdWarning?`. Для соблюдения Закона о рекламе, в новом классе помимо содержимого ассета `warning` содержится также требуемый минимальный размер ассета `warning` в процентах от площади всего объявления.
- В класс `NativeAdMedia` добавлено поле `hasVideo` указывающее наличие видео креатива в подобранной рекламе.

#|
|| **Класс** | **Статус** ||
|| `AdBindingResult` |  Добавлен ||
|| `NativeAdWarning` |  Добавлен ||
|#

#|
|| **Класс** | **Метод/Поле** | **Статус** ||
|| `NativeAd` | `bindNativeAd` | Добавлено возвращаемое значение `AdBindingResult`. Метод больше не выбрасывает исключений. ||
|| `SliderAd` | `bindSliderAd` | Добавлено возвращаемое значение `AdBindingResult`. Метод больше не выбрасывает исключений. ||
|| `NativeAdAssets` | `warning` | Изменен тип: `String` -> `NativeAdWarning` ||
|| `NativeAdWarning` | `value` | Добавлен ||
|| ^ | `minimumRequiredArea` | Добавлен ||
|| `NativeAdMedia` | `hasVideo` | Добавлен ||
|#

#### Примеры

{% list tabs group=instructions %}

- Kotlin

  #|
  || **SDK 7** ||
  || 
  ```kotlin
  val warning = nativeAd.adAssets.warning
  try {
      nativeAd.bindNativeAd(binder)
  } catch (e: NativeAdException) {
      val message = e.message
  }
  ``` 
  ||
  || **SDK 8** ||
  || 
  ```kotlin
  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** ||
  || 
  ```java
  void bindAd(NativeAd nativeAd) {
      String warning = nativeAd.getAdAssets().getWarning();
      try {
          nativeAd.bindNativeAd(binder);
      } catch (NativeAdException e) {
          String message = e.getMessage();
      }
  }
  ``` 
  ||
  || **SDK 8** ||
  || 
  ```java
  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();
      }
  }
  ``` 
  ||
  |#

{% endlist %}

### 6.1 API Шаблонов нативной рекламы

Инструменты для интеграции нативной рекламы с помощью шаблонов были удалены. Используйте стандартные компоненты нативной
рекламы для интеграции.

#|
|| **Класс** | **Статус** ||
|| `NativeBannerView` | Удален ||
|| `SizeConstraint` | ^ ||
|| `HorizontalOffset` | ^ ||
|| `NativeTemplateAppearance` | ^ ||
|| `TextAppearance` | ^ ||
|| `BannerAppearance` | ^ ||
|| `ButtonAppearance` | ^ ||
|| `RatingAppearance` | ^ ||
|#

### 7. Удаление некоторых методов обратного вызова рекламных объектах

- Интерфейсы `ClosableBannerAdEventListener` и `ClosableNativeAdEventListener` удалены. 
- Методы `onLeftApplication` и `onReturnToApplication` удалены.

#|
|| **Класс** | **Статус** ||
|| `ClosableBannerAdEventListener` |  Удален ||
|| `ClosableNativeAdEventListener` |  Удален ||
|#

#|
|| **Класс** | **Метод** | **Статус** ||
|| `BannerAdEventListener`, `NativeAdEventListener` | `onLeftApplication` | Удален ||
|| ^ | `onReturnToApplication` | Удален ||
|#

#### Примеры

{% list tabs group=instructions %}

- Kotlin

  #|
  || **SDK 7** ||
  || 
  ```kotlin
  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() { /* ... */ }
  })
  ``` 
  ||
  || **SDK 8** ||
  || 
  ```kotlin
  // 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** ||
  || 
  ```java
  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) { /* ... */ }
          }
      );
  }
  ``` 
  ||
  || **SDK 8** ||
  || 
  ```java
  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) { /* ... */ }
          }
      );
  }
  ``` 
  ||
  |#

{% endlist %}

### 8. Изменения в основном классе SDK

- Основной класс SDK переименован в `YandexAds`. 
- Переименованы некоторые методы для установки privacy настроек.

#|
|| **Класс** |  **Статус** ||
|| `YandexAds` |  Добавлен ||
|| `MobileAds` | Удален. Используйте `YandexAds` ||
|#

#|
|| **Класс** | **Метод** | **Статус** ||
|| `MobileAds` | `setAgeRestrictedUser(Boolean)` | Удален. Используйте `YandexAds.setAgeRestricted(Boolean)`. ||
|| ^ | `setLocationConsent(Boolean)` | Удален. Используйте `YandexAds.setLocationTracking(Boolean)`. ||
|| `YandexAds` | `setAgeRestricted(Boolean)` | Добавлен ||
|| ^ | `setLocationTracking(Boolean)` | Добавлен ||
|#

#### Примеры

{% list tabs group=instructions %}

- Kotlin

  #|
  || **SDK 7** ||
  || 
  ```kotlin
  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
  ``` 
  ||
  || **SDK 8** ||
  || 
  ```kotlin
  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** ||
  || 
  ```java
  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);
  }
  ``` 
  ||
  || **SDK 8** ||
  || 
  ```java
  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);
  }
  ``` 
  ||
  |#

{% endlist %}

## Изменения в Instream API

### 1. Изменения в пакетах и структуре зависимостей

Основные классы переименованы для соответствия новой структуре SDK.

#|
|| **Класс** | **Статус** ||
|| `com.yandex.mobile.ads.instream.InstreamAdBinder` | Перемещен в `com.yandex.mobile.ads.instream.binder.InstreamAdBinder` ||
|| `com.yandex.mobile.ads.instream.InstreamAdRequestConfiguration` | Переименован в `com.yandex.mobile.ads.instream.InstreamAdRequest` ||
|| `com.yandex.mobile.ads.instream.InstreamAdBreak` | Переименован в `com.yandex.mobile.ads.instream.adbreak.AdBreakData` ||
|| `com.yandex.mobile.ads.instream.inroll.Inroll`, `com.yandex.mobile.ads.instream.pauseroll.Pauseroll` | Заменены на `com.yandex.mobile.ads.instream.adbreak.InstreamAdBreak` ||
|#

#### Примеры

{% list tabs group=instructions %}

- Kotlin

  #|
  || **SDK 7** ||
  || 
  ```kotlin
  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
  ``` 
  ||
  || **SDK 8** ||
  || 
  ```kotlin
  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** ||
  || 
  ```java
  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;
  ``` 
  ||
  || **SDK 8** ||
  || 
  ```java
  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;
  ``` 
  ||
  |#

{% endlist %}

### 2. Изменения в AdRequest

Класс `InstreamAdRequestConfiguration` переименован в `InstreamAdRequest`.

#|
|| **Класс** | **Статус** ||
|| `InstreamAdRequestConfiguration` | Удален. Используйте `InstreamAdRequest` ||
|| `InstreamAdRequest` | Добавлен ||
|| `InstreamAdBreakRequest` | Добавлен ||
|#


#### Примеры

{% list tabs group=instructions %}

- Kotlin

  #|
  || **SDK 7** ||
  || 
  ```kotlin
  val loader = InstreamAdLoader(this)
  val config = InstreamAdRequestConfiguration.Builder("XXXXXX").build()
  loader.loadInstreamAd(this, config)
  ``` 
  ||
  || **SDK 8** ||
  || 
  ```kotlin
  val loader = InstreamAdLoader(this)
  val config = InstreamAdRequest.Builder("XXXXXX").build()
  loader.loadInstreamAd(this, config)
  ``` 
  ||
  |#

- Java

  #|
  || **SDK 7** ||
  || 
  ```java
  void loadAd() {
      InstreamAdLoader loader = new InstreamAdLoader(this);
      InstreamAdRequestConfiguration config = new InstreamAdRequestConfiguration.Builder("XXXXXX").build();
      loader.loadInstreamAd(this, config);
  }
  ``` 
  ||
  || **SDK 8** ||
  || 
  ```java
  void loadAd() {
      InstreamAdLoader loader = new InstreamAdLoader(this);
      InstreamAdRequest config = new InstreamAdRequest.Builder("XXXXXX").build();
      loader.loadInstreamAd(this, config);
  }
  ``` 
  ||
  |#

{% endlist %}

### 3. Изменения в API загрузки рекламы

- Изменены методы для регистрации слушателей обратного вызова и загрузки рекламы. 
- Добавлен класс `InstreamAdBreakLoader` для загрузки рекламных вставок. 
- Изменена сигнатура метода `onInstreamAdFailedToLoad`: вместо строки `reason` теперь передается объект `InstreamAdRequestError`.

#|
|| **Класс**  | **Статус** ||
|| `InstreamAdBreakLoadListener`  | Добавлен ||
|| `InstreamAdBreakLoader` | Добавлен ||
|#

#|
|| **Класс** | **Метод** | **Статус** ||
|| `InstreamAdLoader` | `setInstreamAdLoadListener(InstreamAdLoadListener)` | Удален. Передавайте `InstreamAdLoadListener` в параметрах метода `loadAd`. ||
|| ^ | `loadAd(InstreamAdRequestConfiguration)` | Удален. Передавайте `InstreamAdLoadListener` в параметрах метода `loadAd`. ||
|| ^ | `loadAd(InstreamAdRequest, InstreamAdLoadListener)` | Удален. Передавайте `InstreamAdLoadListener` в параметрах метода `loadAd`. ||
|| `InstreamAdLoadListener` | `onInstreamAdFailedToLoad(String)` | Удален. Используйте `onInstreamAdFailedToLoad(InstreamAdRequestError)`. ||
|| ^ | `onInstreamAdFailedToLoad(InstreamAdRequestError)` | Добавлен ||
|| `InstreamAdBreakLoader` | `loadAd(InstreamAdBreakRequest, InstreamAdBreakLoadListener)` | Добавлен ||
|#

#### Примеры

{% list tabs group=instructions %}

- Kotlin

  #|
  || **SDK 7** ||
  || 
  ```kotlin
  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)
  ``` 
  ||
  || **SDK 8** ||
  || 
  ```kotlin
  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** ||
  || 
  ```java
  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);
  }
  ``` 
  ||
  || **SDK 8** ||
  || 
  ```java
  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());
          }
      });
  }
  ``` 
  ||
  |#

{% endlist %}

### 3.1. Поддержка Kotlin coroutines

В `InstreamAdLoader` и `InstreamAdBreakAdLoader` добавлены `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

- Логика управления рекламными вставками стала более гибкой. 
- Специализированные провайдеры очередей `InrollQueueProvider` и `PauserollQueueProvider` удалены — все вставки доступны напрямую из объекта `InstreamAd` и фильтруются по типу.

{% note info "" %}

Если вы используете автоматическую отрисовку через `InstreamAdBinder`, выбирайте из коллекции `instreamAdBreaks` только вставки типов `INROLL` и `PAUSEROLL`.

{% endnote %}

#|
|| **Класс** | **Статус** ||
|| `InrollQueueProvider` | Удален. Используйте `instreamAd.instreamAdBreaks` с фильтром по `InstreamAdBreakType.INROLL` ||
|| `PauserollQueueProvider` | Удален. Используйте `instreamAd.instreamAdBreaks` с фильтром по `InstreamAdBreakType.PAUSEROLL` ||
|#

#### Примеры

{% list tabs group=instructions %}

- Kotlin

  #|
  || **SDK 7** ||
  || 
  ```kotlin
  // 1. Get In-roll queue from loaded ad
  val inrollQueueProvider = InrollQueueProvider(context, instreamAd)
  val instreamAdBreakQueue = inrollQueueProvider.queue

  // 2. Prepare specific ad break
  val currentInroll = instreamAdBreakQueue.poll()
  currentInroll?.setListener(object : InstreamAdBreakEventListener {
      override fun onInstreamAdBreakPrepared() {
          // 3. Show prepared ad break
          currentInroll.play(instreamAdView)
      }
      // ... other listener methods
  })
  currentInroll?.prepare(instreamAdPlayer)
  ```
  ||
  || **SDK 8** ||
  || 
  ```kotlin
  // 1. Get list of all ad 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 prepared ad break
          currentInroll.play(instreamAdView)
      }
  })
  currentInroll?.prepare(instreamAdPlayer)
  ```
  ||
  |#

- Java

  #|
  || **SDK 7** ||
  || 
  ```java
  void loadAdBreak() {
  // 1. Get In-roll queue from loaded ad
      InrollQueueProvider inrollQueueProvider = new InrollQueueProvider(context, instreamAd);
      Queue<Inroll> instreamAdBreakQueue = inrollQueueProvider.getQueue();

  // 2. Prepare specific ad break
      Inroll currentInroll = instreamAdBreakQueue.poll();
      if (currentInroll != null) {
          currentInroll.setListener(new InstreamAdBreakEventListener() {
              @Override
              public void onInstreamAdBreakPrepared() {
                  // 3. Show prepared ad break
                  currentInroll.play(instreamAdView);
              }
              // ... other listener methods
          });
          currentInroll.prepare(instreamAdPlayer);
      }
  }
  ```
  ||
  || **SDK 8** ||
  || 
  ```java
  void loadAdBreak() {
      // 1. Get list of all ad 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 prepared ad break
                  currentInroll.play(instreamAdView);
              }
          });
          currentInroll.prepare(instreamAdPlayer);
      }
  }
  ``` 
  ||
  |#

{% endlist %}

### 5. Дефолтный плеер

Передача плеера для отрисовки видео теперь опциональна. При передаче `null` SDK берет на себя полный контроль за отрисовкой видео.

#|
|| **Класс** | **Метод** | **Статус** ||
|| `InstreamAdBinder` | конструктор | Параметр `instreamAdPlayer` стал опциональным. Допустимо передать `null` ||
|| `InstreamAdBreak` | `prepare(instreamAdPlayer)` | Удален. Используйте `prepare()` без параметра ||
|| ^ | `prepare()` | Добавлен ||
|#

#### Примеры

{% list tabs group=instructions %}

- Kotlin

  #|
  || **SDK 7** ||
  || 
  ```kotlin
  // Automatic launch (InstreamAdBinder)
  val instreamAdBinder = InstreamAdBinder(
      context,
      instreamAd,
      instreamAdPlayer, // Player was required
      contentPlayer
  )

  // Manual launch (InstreamAdBreak)
  val adBreak: InstreamAdBreak
  adBreak.prepare(instreamAdPlayer)
  ```
  ||
  || **SDK 8** ||
  ||
  ```kotlin
  // Automatic launch (InstreamAdBinder)
  // Default ad player is used when the parameter is omitted
  val instreamAdBinder = InstreamAdBinder(
      context,
      instreamAd,
      contentPlayer
  )

  // Manual launch (InstreamAdBreak)
  val adBreak: InstreamAdBreak
  adBreak.prepare()
  ```
  ||
  |#

- Java

  #|
  || **SDK 7** ||
  || 
  ```java
  void showAd() {
      // Automatic launch (InstreamAdBinder)
      InstreamAdBinder instreamAdBinder = new InstreamAdBinder(
              context,
              instreamAd,
              instreamAdPlayer, // Player was required
              contentPlayer
      );

      // Manual launch (InstreamAdBreak)
      InstreamAdBreak adBreak;
      adBreak.prepare(instreamAdPlayer);
  }
  ```
  ||
  || **SDK 8** ||
  ||
  ```java
  void showAd() {
      // Automatic launch (InstreamAdBinder)
      // Default ad player is used when the parameter is omitted
      InstreamAdBinder instreamAdBinder = new InstreamAdBinder(
              context,
              instreamAd,
              contentPlayer
      );

      // Manual launch (InstreamAdBreak)
      InstreamAdBreak adBreak;
      adBreak.prepare();
  }
  ```
  ||
  |#

{% endlist %}

### 6. Изменения в интерфейсе InstreamAdPlayer

Интерфейс `InstreamAdPlayer` обновлен: добавлено свойство `supportedMimeTypes` для оптимизации выбора видеоформата и метод `bindPlayerView` для корректного позиционирования рекламных элементов поверх видео.

#|
|| **Класс** | **Метод** | **Статус** ||
|| `InstreamAdPlayer` | `supportedMimeTypes: List<String>` | Добавлен. Позволяет SDK выбрать наиболее подходящий видеоформат (например, DASH вместо MP4). ||
|| ^ | `bindPlayerView(container: FrameLayout)` | Добавлен. Необходимо разместить `videoPlayerView` внутри переданного контейнера на все пространство. ||
|#

#### Примеры

{% list tabs group=instructions %}

- Kotlin

  #|
  || **SDK 7** ||
  || 
  ```kotlin
  class InstreamAdPlayerImpl : InstreamAdPlayer {
      // ... methods (prepareAd, playAd, pauseAd, etc.)
  }
  ```
  ||
  || **SDK 8** ||
  ||
  ```kotlin
  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 on the entire space
      override fun bindPlayerView(container: FrameLayout) {
          container.addView(playerView)
      }

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

- Java

  #|
  || **SDK 7** ||
  || 
  ```java
  public class InstreamAdPlayerImpl implements InstreamAdPlayer {
      // ... methods (prepareAd, playAd, pauseAd, etc.)
  }
  ```
  ||
  || **SDK 8** ||
  ||
  ```java
  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 on the entire space
      @Override
      public void bindPlayerView(FrameLayout container) {
          container.addView(playerView);
      }

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

{% endlist %}

## Изменения в API медиационных сетей.

### 1. Новое API для передачи данных о медиационной сети

Для медиационных адаптеров идентификация адаптера вынесена в отдельный метод.

#|
|| **Класс** | **Статус** ||
|| `AdapterIdentity` | Добавлен ||
|#

#|
|| **Класс** | **Метод** | **Статус** ||
|| `YandexAds` | `setAdapterIdentity(AdapterIdentity)` | Добавлен. Вызывайте этот метод до `YandexAds.initialize` вместо передачи данных об адаптере  в качестве дополнительных параметров к запросам за рекламой. ||
|#

#### Примеры

{% list tabs group=instructions %}

- Kotlin

  #|
  || **SDK 7** ||
  || 
  ```kotlin
  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)
  ``` 
  ||
  || **SDK 8** ||
  || 
  ```kotlin
  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** ||
  || 
  ```java
  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);
  }
  ``` 
  ||
  || **SDK 8** ||
  || 
  ```java
  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);
  }
  ``` 
  ||
  |#

{% endlist %}

### 2. Переименование и упрощение BidderTokenRequest

- Класс `BidderTokenLoader` получил конструктор, метод `loadBidderToken` из статического стал методом экземпляра.
- Класс `BidderTokenRequestConfiguration` переименован в `BidderTokenRequest` и изменен. 
- Для создания экземпляра вместо `Builder(AdType)` необходимо использовать фабричные методы `banner`, `interstitial`, `rewarded`, `appOpenAd` и `native`.

#|
|| **Класс** | **Статус** ||
|| `BidderTokenRequestConfiguration` | Удален. Используйте `BidderTokenRequest` ||
|| `BidderTokenRequestConfiguration.Builder` | Удален. Используйте фабричные методы в `BidderTokenRequest` ||
|| `BidderTokenRequest` | Добавлен ||
|#

#|
|| **Класс** | **Конструктор/Метод** | **Статус** ||
|| `BidderTokenLoader` | `BidderTokenLoader(Context)` | Добавлен конструктор ||
|| ^ | `loadBidderToken` | Изменен. Из статического метод стал методом экземпляра класса `BidderTokenLoader` ||

|| `BidderTokenRequestConfiguration.Builder` | `setBannerAdSize(BannerAdSize)` | Удален. Передавайте `BannerAdSize` в аргументах метода `BidderTokenRequest.banner(BannerAdSize)` ||
|| ^ | `setParameters(Map<String, String>)` | Удален. Передавайте параметры в аргументы фабричных методов ||
|| `BidderTokenRequest` | `banner(BannerAdSize)` | Добавлен ||
|| ^ | `banner(BannerAdSize, AdTargeting)` | Добавлен ||
|| ^ | `banner(BannerAdSize, AdTargeting, Map<String, String>)` | Добавлен ||
|| ^ | `interstitial()` | Добавлен ||
|| ^ | `interstitial(AdTargeting)` | Добавлен ||
|| ^ | `interstitial(AdTargeting, Map<String, String>)` | Добавлен ||
|| ^ | `rewarded()` | Добавлен ||
|| ^ | `rewarded(AdTargeting)` | Добавлен ||
|| ^ | `rewarded(AdTargeting, Map<String, String>)` | Добавлен ||
|| ^ | `appOpenAd()` | Добавлен ||
|| ^ | `appOpenAd(AdTargeting)` | Добавлен ||
|| ^ | `appOpenAd(AdTargeting, Map<String, String>)` | Добавлен ||
|| ^ | `native()` | Добавлен ||
|| ^ | `native(AdTargeting)` | Добавлен ||
|| ^ | `native(AdTargeting, Map<String, String>)` | Добавлен ||
|#

#### Примеры

{% list tabs group=instructions %}

- Kotlin

  #|
  || **SDK 7** ||
  || 
  ```kotlin
  val bidderTokenRequest = BidderTokenRequestConfiguration.Builder(AdType.INTERSTITIAL)
      .setBannerAdSize(BannerAdSize.stickySize(this, screenWidth))
      .setParameters(mapOf("a" to "b"))
      .build()

  BidderTokenLoader.loadBidderToken(
      this,
      bidderTokenRequest,
      object : BidderTokenLoadListener { /* ... */ }
  )
  ``` 
  ||
  || **SDK 8** ||
  || 
  ```kotlin
  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** ||
  || 
  ```java
  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() { /* ... */ }
      );
  }
  ``` 
  ||
  || **SDK 8** ||
  || 
  ```java
  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() { /* ... */ }
      );
  }
  ``` 
  ||
  |#

{% endlist %}

## Jetpack Compose интеграция

Поддержана интеграция через Jetpack Compose. См. примеры интеграции в разделе Jetpack Compose:

- [Адаптивный inline-баннер](https://ads.yandex.com/helpcenter/ru/dev/android/compose/adaptive-inline-banner.md)
- [Адаптивный sticky-баннер](https://ads.yandex.com/helpcenter/ru/dev/android/compose/adaptive-sticky-banner.md)
- [Межстраничная реклама](https://ads.yandex.com/helpcenter/ru/dev/android/compose/interstitial.md)
- [Реклама с вознаграждением](https://ads.yandex.com/helpcenter/ru/dev/android/compose/rewarded.md)
- [Реклама при открытии приложения](https://ads.yandex.com/helpcenter/ru/dev/android/compose/app-open-ad.md)

## Миграция с помощью AI-инструментов {#ai}

Для упрощения процесса миграции с SDK 7.x на 8.x вы можете использовать AI-ассистенты с готовым скиллом миграции.

### Как использовать

1. **Загрузите скилл**

    Скилл для миграции доступен в [GitHub Yandex Ads SDK Android](https://github.com/yandexmobile/yandex-ads-sdk-android/tree/master/YandexMobileAdsExample/skills/migrate-yandex-ads-sdk-from-7-to-8).

    - Для Claude Desktop     

        Cкопируйте папку скилла в директорию skills вашего агента, например:

        ```bash
        cp -r Skills/migrate-yandex-ads-sdk-from-7-to-8 .claude/skills/
        ```

    - Для Cursor IDE

        Cкопируйте папку скилла в ваш проект и используйте ссылку на файл `SKILL.md` через `@`, например:

        ```
        @migrate-yandex-ads-sdk-from-7-to-8/SKILL.md
        ```

    - Альтернативный способ
    
        Cкопируйте содержимое `SKILL.md` и всех связанных файлов в диалог с AI-ассистентом (однако это может превысить лимиты сообщения).

2. **Используйте промпт**

    После загрузки скилла используйте следующий промпт в диалоге с AI-ассистентом:

    ```
    Мигрируй мой проект с Yandex Mobile Ads SDK 7.x на 8.x
    ```

{% note warning "" %}

Всегда тщательно проверяйте изменения, сгенерированные AI.

Хотя скиллы помогают AI-ассистентам корректно выполнять задачи, вы должны лично проверять и верифицировать все изменения, внесенные агентом. AI-ассистенты могут допускать ошибки, поэтому ручная проверка кода необходима.

{% endnote %}

## Требования

- **Gradle**: 7.0 и выше
- **Android gradle plugin**: 8.3.2 и выше
- **Android SDK**: 21 (Android 5.0) и выше
- **Kotlin**: 1.9.0 и выше
- **Java**: 8 и выше


