Привет, Хабр! Меня зовут Александр, я Android-разработчик в IT-компании SimbirSoft. В конце 2022 года на одном из проектов мы с командой столкнулись с трудностями в работе мобильной рекламы — тогда у нас была подключена сеть AdMob от Google. Приходилось искать много обходных путей для продолжения монетизации приложения. Поэтому решили мигрировать на платформу, с которой не будет проблем из-за санкций. Коллеги-аналитики взялись изучить доступные платформы.
Я поделюсь результатами этой работы и совместными выводами. Но главным образом разберу процесс интеграции Google AdMob и Yandex SDK, их плюсы и минусы, шаги интеграции, и расскажу, почему мы выбрали Yandex SDK.
Сегодня использовать зарубежные решения не столько сложно, сколько бессмысленно, если пользователи находятся в России. Многие провайдеры уходят из страны и отказываются выплачивать доход от рекламы, бизнес теряет деньги. Статья будет полезна Android-разработчикам, которые столкнулись с выбором SDK.
Содержание:
6 видов рекламы в мобильных приложениях
При выборе платформы тут же возникают вопросы, какой тип рекламы подойдет лучше всего и как его правильно интегрировать в приложение? Рассмотрим, какие виды рекламы встречаются и какие особенности имеют.
Баннеры — самый популярный вид рекламы. У вас будет специальный компонент View, который вы должны разместить в своем приложении и получать деньги за каждый показ.
Межстраничные блоки — полноэкранный видеоформат. Существует два вида таких блоков:
Video Interstitial — пользователь может пропустить его, нажав на крестик.
Rich Interstitial — пользователь не может закрыть.
Реклама с вознаграждением — видеореклама со счетчиком в правом верхнем углу. Дождавшись, когда счетчик дойдет до конца, пользователь получает награду, которую задумал разработчик.
Нативная реклама — ее можно кастомизировать под ваше приложение. Главное — соблюдать правило, что реклама в любом ее виде не должна терять никакого контента.
Интерактивная реклама — реклама в игровой форме, где пользователь может взаимодействовать как-либо с контентом, предоставленным рекламодателем.
InStream-реклама — формат, который позволяет монетизировать приложение через показ рекламы во время воспроизведения видеоконтента.
Самые популярные SDK для интеграции рекламы
Google AdMob — это мобильная платформа рекламы, созданная Google для разработчиков приложений, чтобы монетизировать их для Android и iOS. Она позволяет показывать рекламу в своих приложениях и зарабатывать деньги от кликов, показов и других действий. AdMob интегрируется с Google AdSense, что означает, что разработчики приложений могут показывать рекламу из обширной сети рекламодателей Google. Рекламодатели могут выбирать конкретные демографические и географические группы, чтобы эффективно достигать своей желаемой аудитории. Также AdMob предоставляет подробную аналитику, что позволяет разработчикам приложений отслеживать свой доход от рекламы, ее показы и коэффициенты кликов.
Yandex Mobile Ads — мобильная платформа, предлагаемая Yandex. Позволяет разработчикам приложений и рекламодателям монетизировать свои мобильные приложения с помощью встраиваемой рекламы. Одна из ключевых особенностей Yandex Mobile Ads — возможность таргетинга. Рекламодатели могут таргетировать пользователей на основе различных факторов, таких как демография, местоположение, интересы и поведение, что гарантирует достижение правильной аудитории.
Mail.ru MyTarget — платформа от Mail.ru Group. Предлагает полный набор инструментов для управления и анализа кампаний рекламы, включая подробные отчеты и реальные метрики. Кроме того, MyTarget предлагает интеграцию с популярными сетями рекламы, например, с Google Ads для многоканальной рекламы. Это позволяет рекламодателям легко отслеживать эффективность своих кампаний на различных каналах и делать необходимые корректировки. Мощная и гибкая платформа, которая помогает рекламодателям достигать желаемых результатов на устройствах Android.
UnityAds — платформа для мобильных приложений, которая помогает разработчикам монетизировать свои приложения с помощью встраиваемой рекламы. Для использования в своем приложении UnitiAds предлагает различные инструменты аналитики и отчетности, которые позволяют разработчикам отслеживать эффективность своих рекламных кампаний и оптимизировать их для максимальной прибыли. Удобный и эффективный способ монетизировать мобильные приложения с помощью встроенной рекламы на Android.
Теперь, когда мы изучили самые популярные решения на рынке и определились с тем, какие виды рекламы нам необходимы, мы можем изучить таблицу и сделать выбор, какое решение мы будем интегрировать в наше Android-приложение.
Баннеры |
Межстраничные блоки |
Реклама с вознаграждением |
Интерактивна |
Нативная |
InStream |
|
Google Ads |
+ |
+ |
+ |
+ |
+ |
- |
Yandex Mobile Ads |
+ |
+ |
+ |
+ |
+ |
+ |
Mail.ru MyTarget |
+ |
+ |
+ |
+ |
+ |
+ |
UnityAds |
+ |
+ |
+ |
+ |
- |
- |
Из таблицы выше можно понять, что максимальное количество возможных видов рекламы предоставляют отечественные продукты — Яндекс.Директ и Mail.ru MyTarget. Они предоставляют отличное SDK для интеграции рекламы и личный кабинет, где дается аналитика показов в мобильном приложении и можно построить дальнейший план по виду использования рекламы.
Рассмотрим интеграцию двух решений — от Yandex как самого популярного в России, и AdMob как самого популярного за рубежом.
Интеграция Yandex Mobile Ads
Что нужно для старта? Для интеграции Yandex Mobile Ads необходимо интегрировать в приложение Mobile Ads SDK. Библиотека Yandex Mobile Ads предоставляется в формате AAR, и поэтому нам достаточно добавить ее в зависимости нашего приложения и указать в Manifest.xml разрешение на показ рекламы.
<uses-permission android:name="com.google.android.gms.permission.AD_ID" tools:node="remove"/>
dependencies {
...
implementation 'com.yandex.android:mobileads:$yandexMobileAdsVersion'
}
На старте приложения необходимо инициализировать MobileAds, иначе показ рекламы не будет возможен.
class YandexAdsExampleApp: Application() {
override fun onCreate() {
super.onCreate()
// Инициализация рекламного SDK от Яндекс
MobileAds.initialize(this)
// Включаем предзагрузку рекламы до ее показа
MobileInstreamAds.setAdGroupPreloading(true)
// Включаем логирование, чтобы следить за состоянием рекламы
MobileAds.enableLogging(true)
}
}
Теперь рассмотрим то, как мы можем подключить здесь самые популярные виды рекламы.
Любой показ рекламы будет включать в себя настройку AdRequest — таргетированный запрос для показа рекламы. Для его создания Яндекс предусмотрел специальный класс AdRequest, который создается через Builder() и может хранить в себе нужные настройки.
val adRequest = AdRequest.Builder()
.setAge() // Передаем возраст пользователя приложения
.setGender() // Передаем пол пользователя приложения
.setLocation() // Передаем локацию пользователя
.setContextQuery() // Передаем поисковый запрос пользователя
.setBiddingData() // Передает Bidding Data
.setContextTags() // Список тегов, которые описывают пользователя
.setParameters() // Список дополнительных параметров
.setPreferredTheme() // Задает тему - AdTheme
.build()
Для действий, привязанных к жизненному циклу Яндекс добавил возможность повесить Listener на каждый из видов их рекламы. Это всегда будет наследник интерфейса, который принимает рекламное решение в метод setBannerAdEventListener().
Баннер
Добавляем в xml BannerAdView, который будет являться контейнером для рекламы. Сам BannerView является наследником RelativeLayout, и это нужно помнить, чтобы не создавать лишней вложенности при верстке экрана.
<com.yandex.mobile.ads.banner.BannerAdView
android:id="@+id/yandexAdBanner"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
И загружаем в него рекламу, используя метод loadAd(adRequest: AdRequest):
val adRequest = AdRequest.Builder().build()
binding.yandexAdBanner.loadAd(adRequest)
Также можем создать баннер программно, без использования xml
val yandexBannerAd = BannerAdView(this).apply {
// Добавляем id для баннера
id = R.id.yandexAdBanner
// Устанавливаем наш рекламный id
setAdUnitId("demo-banner-yandex")
// Устанавливаем размер баннера
// Есть два вида баннеров - Sticky и Flex
// Для каждого вида баннеров есть своя реализация AdSize
// Sticky - setAdSize(AdSize.stickySize(width))
// Flex - setAdSize(AdSize.flexibleSize(width, height))
setAdSize(AdSize....)
//Вешаем слушатель для действий на ЖЦ баннера
setBannerAdEventListener(eventLogger)
}
Межстраничные блоки
Для реализации межстраничной рекламы у Яндекса есть класс — InterstitialAd(context: Context). Чтобы отобразить межстраничную рекламу, достаточно сделать следующее:
// Создаем инстанс межстраничной рекламы
val interstitialAd = InterstitialAd(context)
// Устанавливаем рекламный идентификатор
interstitialAd.setAdUnitId("demo-interstitial-yandex")
// Устанавливаем слушатель событий
interstitialAd.setInterstitialAdEventListener(object : InterstitialAdEventListener {
//После того, как реклама загрузится сразу ее отображаем
override fun onAdLoaded() {
interstitialAd.show()
}
...
})
// Загружаем рекламу
interstitialAd.loadAd(AdRequest.Builder().build())
Реклама с вознаграждением
Реклама с вознаграждением отображается в полноэкранном режиме, возможность скрыть ее и получить награду появляется после истечения таймера в верхней части страницы.
// Создаем инстанс рекламы с вознаграждением
val rewardedAd = RewardedAd(context)
// Устанавливаем рекламный идентификатор
rewardedAd.setAdUnitId("demo-rewarded-yandex")
// Устанавливаем слушатель событий
rewardedAd.setRewardedAdEventListener(object : RewardedAdEventListener {
// После загрузки сразу отображаем рекламу с вознаграждением
override fun onAdLoaded() {
rewardedAd.show()
}
})
// Начинаем загрузку рекламы
rewardedAd.loadAd(AdRequest.Builder().build())
Советы по интеграции:
Следить за вложенностью добавляемых элементов на экран
Передавать только Activity context для показа рекламы
Делать все только на главном потоке
Интеграция Google AdMob
Для начала работы с AdMob необходимо добавить в gradle зависимость:
implementation 'com.google.android.gms:play-services-ads:adMobVersion'
Добавить в манифест meta-data, и указать там в android:value уникальный идентификатор приложения:
<application>
<meta-data
android:name="com.google.android.gms.ads.APPLICATION_ID"
android:value="ca-app-pub-3940256099942544~3347511713"/>
</application>
В Application классе инициализируем рекламу:
override fun onCreate() {
super.onCreate()
// Инициализируем AdMob
MobileAds.initialize(this) {}
}
Для рекламного реквеста в AdMob используется класс AdRequest.
AdRequest позволяет создать таргетированный запрос на рекламу.
AdRequest.Builder()
// Добавляет ключевые слова для определения контекста страница
.addKeyword()
// Дополнительные рекламные события
.addCustomEventExtrasBundle()
// Передача доп. параметров в рекламные сети
.addNetworkExtrasBundle()
// Настройка для точного показа определенной рекламы
.setAdString()
// Установить URL адрес контента
.setContentUrl()
// Установить таймаут для загрузки рекламы
.setHttpTimeoutMillis()
// Список подходящих адресов для рекламы
.setNeighboringContentUrls()
// Установить агента для отслеживания показа
.setRequestAgent()
.build()
Баннер
AdMob предлагает нам две версии баннера Anchored и Inline. Inline считается более современным и продвинутым решением для баннеров, в то время как Anchored максимально простой и выполняет только одну функцию.
Разберем их подробнее. Для их реализации нам нужна одна и та же View — AdView. При ее создании через XML необходимо указать app:adSize — размер баннера. И app:adUnitId — уникальный рекламный идентификатор.
<com.google.android.gms.ads.AdView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/adView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:adSize="BANNER"
app:adUnitId="ca-app-pub-3940256099942544/6300978111">
</com.google.android.gms.ads.AdView>
Anchored-баннер мы рассмотрим на примере создания из xml
— на нашу view
нужно использовать метод loadAd(),
который загрузит и отобразит рекламу на баннере.
Используется это так:
binding.adView.loadAd(AdRequest.Builder().build())
После этого реклама отобразится на баннере, и ничего делать больше не нужно.
Для того чтобы логировать события, связанные с баннером, необходимо положить в View AdListener — абстрактный класс, созданный гуглом для нас. Сделать это можно просто через присвоение полю нужной реализации.
binding.adView.adListener = adListenerImpl
Для Inline баннера рассмотрим создание View из кода. Делать это лучше из-за того, что указывать для AdView его размер можно только один раз, или в xml или в коде, иначе реклама показана не будет.
// Создаем AdView
val adView = AdView(context)
// Добавляем размеры для адаптивной ориентации
adView.setAdSize(AdSize.getCurrentOrientationInlineAdaptiveBannerAdSize(
context, 320))
// Добавляем рекламный идентификатор
adView.adUnitId = "ca-app-pub-3940256099942544/6300978111"
// Вешаем слушатель событий
adView.adListener = adListenerImpl
//После настройки View остается только запустить загрузку рекламы.
adView.loadAd(AdRequest.Builder().build())
В чем же разница между этими двумя баннерами?
Anchored-баннер в AdMob для Android является более статичным по сравнению с Inline-баннером. Anchored-баннер является более крупным, часто размещается в верхней или нижней части экрана и остается на месте даже при прокрутке страницы.
Inline-баннер, с другой стороны, является более динамичным и может перемещаться вместе со страницей в зависимости от того, как пользователь прокручивает страницу. Inline-баннеры обычно меньше по размеру, чем Anchored-баннеры, и могут быть размещены по центру страницы или в других местах для большего удобства для пользователя.
Межстраничные блоки
Для создания межстраничной рекламы AdMob требует доступа к Activity, поэтому простым Context тут не отделаться.
Запускается все довольно просто, через один метод у класса InterstitialAd:
//Вызываем метод загрузки
InterstitialAd.load(
//Передаем Activity
activity,
//Передаем рекламный идентификатор
"ca-app-pub-3940256099942544/1033173712",
//Посылаем таргетированный запрос
AdRequest.Builder().build(),
//Слушатель загрузки рекламы
object : InterstitialAdLoadCallback() {
//Метод, который срабатывает после того, как реклама успешно загрузилась
override fun onAdLoaded(loadedInterstitialAd: InterstitialAd) {
super.onAdLoaded(loadedInterstitialAd)
//Как реклама загрузится сразу ее показываем
loadedInterstitialAd.show(context)
}
//Метод для отлова ошибок
override fun onAdFailedToLoad(interstitialAdLoadError: LoadAdError) {
super.onAdFailedToLoad(interstitialAdLoadError)
}
}
)
Реклама с вознаграждением
Реклама с вознаграждением также требует доступа к Activity. Запускается также просто с использованием одного метода у класса — RewardedAd.
//Вызываем метод загрузки
RewardedAd.load(
//Передаем Activity
activity,
//Передаем рекламный идентификатор
"ca-app-pub-3940256099942544/5224354917",
//Создаем таргетированный запрос
AdManagerAdRequest.Builder().build(),
//Слушатель на загрузку рекламы
object : RewardedAdLoadCallback() {
//Метод срабатывает при успешной загрузке рекламы
override fun onAdLoaded(loadedRewardedAd: RewardedAd) {
super.onAdLoaded(loadedRewardedAd)
//После загрузки сразу отображаем рекламу, в лямбду передаем действие, которое должно сработать после того, как пользователь досмотрит рекламу
loadedRewardedAd.show(
context
) { }
}
override fun onAdFailedToLoad(rewardedAdLoadError: LoadAdError) {
super.onAdFailedToLoad(rewardedAdLoadError)
}
}
)
Сравнение Google AdMob и Yandex Mobile Ads
Посмотрим на платформы в разрезе трех самых популярных рекламных форматов, сравнив ключевые возможности настройки:
Баннеры |
Межстраничная реклама |
Реклама с вознаграждением |
Таргетинг | ||
Обе платформы имеют возможность использования таргетинга, который позволяет определять аудиторию рекламы по разным параметрам, таким как местоположение, устройство и поведение. По нашему опыту, Яндекс предлагает более точный таргетинг по пользователям из России, так как собирает данные о поведении пользователей не только в поисковых системах, но и множестве других онлайн-сервисов. У Google для российской аудитории таких сервисов меньше | ||
Форматы объявлений | ||
У AdMob и Яндекс широкий выбор форматов, включая статические баннеры, анимированные GIF-изображения, HTML5-баннеры и другие |
У Яндекса выбор шире, включая картинки, видео, html5-баннеры, полноэкранные баннеры и другие. У AdMob более ограниченный набор, но есть форматы для использования в мультиплатформе |
У AdMob и Яндекса широкий выбор форматов Rewarded Ad, включая видеоролики, игровые задания, опросы и другие. Также библиотеки позволяют разработчикам интегрировать свои собственные форматы рекламы в свои приложения |
Размеры баннеров | ||
У Яндекса и AdMob есть различные размеры для мобильных устройств. У Яндекса больше размеров баннеров, чем у AdMob, включая широкоформатные и полноэкранные |
||
Preview для AdMob | ||
При использовании AdMob AdSize должен быть установлен только один раз и не может быть переопределен. Из-за этого возникает необходимость указывать все данные о рекламе в xml, потому что иначе у нас не будет работать preview |
||
Работа с Context | ||
Для работы Yandex достаточно Activity Context |
Для интеграции AdMob требует для себя доступ к Activity, что сразу делает решение не гибким |
|
Logging | ||
Форматы от Яндекса обладают большим количеством методов для отслеживания жизненного цикла рекламы |
Итоги и преимущества инструментов
С точки зрения технических характеристик Yandex SDK и AdMob являются библиотеками для интеграции рекламы в мобильные приложения на платформе Android. Обе платформы предоставляют разработчикам удобные инструменты для настройки и управления рекламными кампаниями в приложении. Главным образом ваш выбор будет зависеть от страны работы и расположения пользователей, но есть и другие особенности.
Преимущества Yandex SDK:
Нет ограничений для работы в РФ. Яндекс является отечественной компанией, и на его работу не повлияют никакие из санкций.
Более точное таргетирование. Yandex SDK использует технологию Smart banners, которая позволяет показывать объявления только тем пользователям, которые действительно заинтересованы в конкретном товаре или услуге. Это повышает вероятность клика и конверсии.
Наличие инструмента для анализа рекламной кампании. В Yandex SDK доступен инструмент Яндекс.Метрика, который позволяет отслеживать и анализировать эффективность рекламных кампаний в реальном времени. При этом Метрику возможно кастомизировать под свои запросы так, что она не будет уступать Google Analytics. Это позволяет разработчикам оптимизировать настройки кампании по запросам маркетинга и повысить доходность рекламы.
Широкий выбор рекламных форматов. Yandex SDK предлагает различные форматы рекламы, включая баннеры, интеллектуальные объявления и видеорекламу. Это позволяет разработчикам выбирать наиболее подходящий формат для своего приложения и аудитории.
Более удобный подход для интеграции, отсутствие необходимости иметь доступ к Activity для показа межстраничных рекламных объявление и объявлений с наградой.
Приятное SDK, которое кардинально не отличается от повсеместно используемого AdMob, и местами даже наиболее хорошо документировано и имеет положительный фидбек в сообществе.
Если же ваше приложение распространяется не только на российский рынок, но на ближнее зарубежье и международный рынок, то переход от AdMob может быть не лучшим решением. Но у него его свои сильные стороны.
Преимущества AdMob:
Международное покрытие. AdMob является одной из крупнейших мобильных платформ, предлагающих глобальное покрытие рекламой, что означает, что ваше приложение может генерировать доход от мировой аудитории.
Интеграция с другими продуктами Google. AdMob является частью экосистемы Google и интегрируется с другими продуктами Google, такими как Google Analytics и Google Play. Это может предоставлять разработчикам дополнительные инструменты и данные для оптимизации монетизации и улучшения пользовательского опыта.
Гибкая настройка. AdMob предлагает разработчикам большую гибкость в настройке рекламных кампаний, включая настройку таргетинга, оптимизацию объявлений и контроль за рекламным контентом. Это позволяет лучше контролировать процесс монетизации и адаптировать его под потребности приложения
Доходность. AdMob известен своей высокой доходностью благодаря широкому спектру рекламных форматов, международному покрытию и интеграции с другими продуктами Google. AdMob также предлагает возможность участия в аукционе между рекламными сетями (Ad Network Mediation), что может помочь максимизировать доходы от различных рекламодателей.
Таким образом, если ваше приложение распространяется на рынке РФ, то имеет смысл как можно быстрее переходить/интегрировать в себя именно Yandex SDK. Если вы сейчас используете AdMob как решение своих потребностей в рекламе внутри мобильного приложения, то переход на Yandex SDK не займет много времени и сил у разработки. Решения работают практически по одинаковой логике, где Яндекс выигрывает в некоторых моментах благодаря гибкости SDK и базы для таргета.
Спасибо за внимание!
Больше полезных материалов для mobile-разработчиков мы также публикуем в наших соцсетях – ВК и Telegram.
KursikS
И почему в статье ни слова про медиаторы вроде IronSource или AppLovin? К AppLovin можно прикрутить и Яндекс, и гугл, и унити, и май таргет. Пахнет рекламной статьей. Ибо с Яндексом я наелся говнеца. Мало того, что он немецким пользователям может показывать рекламу на русском так у них куча технических проблем. Медиация у меня не работает от слова совсем. (В двух приложениях идентично настроена реклама, в одном работает, в другом нет). Написал в поддержку, выслал логи запросов и тишина. Совершенно не логичное ценообразование. Они мне несколько месяцев начисляли по 1 рублю за несколько сотен показов баннера с вознаграждением и оправдывались такими рыночными условиями. В сравнении с неработающими России Гуглом он очевидно лучше, но с таким успехом можно было сравнить с чайником