- Как диагностировать проблемы интеграции SDK. Опыт команды разработки Yandex Mobile Ads SDK
- П одстановка новой реализации SDK в приложение
- Д изассемблирование DEX-файлов приложения в smali
- П реобразование новой версии SDK в smali
- П одмена реализации SDK
- А лгоритм подмены реализации SDK в приложении с одним DEX
- А лгоритм подмены реализации SDK в приложении с MultiDex
- П ересборка приложения c новой версией SDK
- Н едостатки
- И тоги
- yandexmobile / yandex-ads-sdk-android Go PK Goto Github PK
- yandex-ads-sdk-android’s Introduction
- Contributors
- Stargazers
- Watchers
- Forkers
- yandex-ads-sdk-android’s Issues
- «No ads available» for mediation demo banner blocks in example
- java.lang.NegativeArraySizeException at com.yandex.mobile.ads.network.core.f.a(SourceFile:320)
- ConcurrentModificationException at com.yandex.mobile.ads.nativeads.p$1.a(SourceFile:1091)
- SecurityException WifiService: Neither user 10113 nor current process has android.permission.ACCESS_WIFI_STATE.
- Banner AdSize question
- Adview в ViewHolder RecyclerView
- Можно ли использовать с нативной рекламой Яндекс Метрику версии 3.1.0?
- Не работает с Android 9
- Test blockId for an NativeImageAd
- Ошибки линта в логах
- Memory leak
- 400 error code
- спасибо, локализировали причину «android.database.sqlite.SQLiteException: table httpauth already exists», проблема будет исправлена в ближайшем обновлении SDK.
- Fatal Exception: java.lang.NullPointerException: name == null
- ios ad on android
- Доступна ли в MapKit кластеризация?
- Failed to allocate a 1395484020 byte
- Проблемы с навигацией по документации
- Memory leak
- ANR Executing service ru.mamba.client/com.yandex.metrica.ConfigurationService
- Не всегда срабатывают методы слушателя InterstitialEventListener
- NativeAdView inheritance
- isLoading for NativeAd
- Unexpected response code 400
- ANR Executing service my.package/com.yandex.metrica.MetricaService
- Черный экран вместо рекламы SDK 2.62 Android 4.1.2
- NullPointerException at com.yandex.mobile.ads.g.e.e (SourceFile:1082)
- Возможно ли вручную хендлить click по Native баннеру?
- OutOfMemoryError: java.util.HashMap$HashMapEntry[] of length 1073741824 would overflow at com.yandex.mobile.ads.network.core.f.d (SourceFile:556)
- WindowManager$BadTokenException
- Не получается подключить к xamarin проекту
- android.database.sqlite.SQLiteException
- If com.yandex.mobile.ads.AdActivity destroyed when onAdLeftApplication, onInterstitialDismissed is called. But when i press back i can see interstitial.
- Пакет для flutter
- NPE in NativeLoadListener
- Когда будет либа для windows 10 mobile?
- java.lang.NegativeArraySizeException
- How to disable separated process
- Пустой экран при возврате на полноэкранную рекламу
- Fatal Exception: java.lang.NullPointerException
- RuntimeException: Package manager has died at at com.yandex.mobile.ads.k.a.a(SourceFile:22)
- Некорректно определяется область объявления в нативном формате
- Не хватает метода unbindAd?
- NullPointerException в методе WebViewClassic.loadDataWithBaseURL SDK v. 2.61
- Proguard
- java.util.concurrent.RejectedExecutionException
- java.lang.NoClassDefFoundError: com/yandex/mobile/ads/r (wrong name: com/yandex/mobile/ads/R)
- Enabling a feedback button in NativeBannerView
- Ad Activity into the AndroidManifest.xml is integrated wrong
- Recommend Projects
- React
- Vue.js
- Typescript
- TensorFlow
- Django
- Laravel
- Recommend Topics
- javascript
- server
- Machine learning
- Visualization
- Recently View Projects
- yandex-ads-sdk-android
- bip39
- Awesome-Profile-README-templates
- buster95
- fragile
Как диагностировать проблемы интеграции SDK. Опыт команды разработки Yandex Mobile Ads SDK
Всем привет! Меня зовут Дмитрий Фисько, я разрабатываю Yandex Mobile Ads SDK. Наша библиотека предназначена для монетизации мобильных приложений на платформе Android и iOS. Сегодня я хочу рассказать вам о том, как мы упростили разбор сложных ошибок интеграции SDK в Android-приложения. Возможно, наш опыт пригодится и вам.
Наши пользователи — разработчики мобильных приложений — не всегда читают документацию, так что иногда придумывают заковыристые способы использования SDK. Неправильная интеграция может снизить эффективность размещения рекламных объявлений, а значит, уменьшить доход разработчика. Чтобы помочь разработчикам лучше монетизировать приложения, мы создали превентивную систему мониторингов, которая анализирует показатели мобильного приложения. Если по мониторингам мы узнаём о проблеме, то связываемся с разработчиками и помогаем им найти источник проблемы и решить её.
К сожалению, не все ошибки интеграции SDK можно определить по мониторингам. Если такая ситуация возникает, мы обращаемся к партнёру, чтобы уточнить детали интеграции. Затем мы стараемся определить причину проблем и помочь их решить. Если даже этой информации недостаточно, чтобы определить причину ошибок, мы запрашиваем у партнёра разрешение на реверс-инжиниринг приложения. После разрешения мы начинаем смотреть на работу рекламного SDK в приложении как на чёрный ящик. Просматриваем сетевую активность через proxy, проверяем отображение рекламных view через Layout Inspector и др.
Просматривать сетевую активность приложения начиная с Android 7.0 проблематично, так как система по умолчанию не доверяет сертификатам, установленным пользователем. Установка сертификата необходима для просмотра SSL-трафика приложения через proxy. Решит проблему либо запуск приложения на версии Android младше 7.0, либо добавление network_security_config в приложение, например через Apktool. Просмотреть отображение рекламных view можно через утилиту Layout Inspector, запустив приложение на эмуляторе или на устройстве. При этом необходимо модифицировать файл AndroidManifest.xml, добавив через Apktool атрибут debuggable=true.
Если метода чёрного ящика оказалось недостаточно и воспроизвести проблему не удалось, можно посмотреть на логику работы приложения. Для этого можно воспользоваться утилитами для декомпиляции APK, такими как JADX, Bytecode Viewer. Но зачастую такой подход требует слишком много времени и не всегда приводит к результату. Поэтому, чтобы быстрее понимать, как приложение использует SDK изнутри, мы сделали скрипт для подстановки новой реализации SDK в уже собранное приложение.
П одстановка новой реализации SDK в приложение
Подмена кода SDK позволяет через классы изменённой версии SDK внедрить в приложение произвольный код и, например, включить режим дополнительного логирования. Алгоритм работы следующий. Скрипт:
- дизассемблирует DEX-файлы приложения в smali;
- преобразует JAR-файл новой версии SDK в smali;
- подменяет реализацию smali-файлов SDK в smali-файлах приложения;
- пересобирает приложение c новой версией SDK.
Д изассемблирование DEX-файлов приложения в smali
Нужно декомпозировать приложение, разделить его на более мелкие единицы, чтобы появилась возможность изменять код классов SDK, не меняя при этом код приложения. Как подступиться к собранному приложению? Дизассемблируем DEX в smali-файлы.
В Android приложение хранит код в DEX-файлах. Извлечь их из приложения можно через утилиту unzip, так как APK — обычный архив с структурированным содержимым. У DEX-файлов бинарный формат для более плотной по сравнению с JAR упаковки кода. Из-за бинарности DEX нечеловекочитаем, поэтому изменять сам DEX нерационально. Первое, что приходит на ум, — декомпилировать DEX в Java. Такое преобразование возможно, но оно нетривиально и происходит с потерями работоспособности кода. Поэтому воспользуемся трансляцией в smali-код. Преобразование в smali позволяет точно передать инструкции из DEX в человекочитаемом виде с возможностью последующей конвертации в работоспособный код.
Вызов утилиты smali преобразует DEX в набор классов в smali-коде. При этом исходное расположении классов по подпакетам сохраняется.
П реобразование новой версии SDK в smali
Подготовим версию SDK на замену. Чтобы гарантировать воспроизводимость проблемы, версию SDK с включённым логированием создадим на основе той же версии, которая уже интегрирована в приложение. Один из простых способов узнать подключённую версию Yandex Mobile Ads SDK в приложении — просмотреть содержимое метода в классе MobileAds.getLibraryVersion() через Apk Analizer в Android Studio. Узнав используемую версию рекламного SDK, мы переключаемся на ветку данного релиза и собираем версию библиотеки с дополнительным логированием. В результате получаем AAR-файл. Он содержит ресурсы и код библиотеки. Нас в AAR-файле интересует лишь код в JAR-файле, так как в нашем SDK нет внешних ресурсов: все ресурсы заинлайнены непосредственно в код или приходят с бэкенда. Отсутствие файлов с ресурсами упрощает интеграцию SDK в IDE без поддержки современных систем сборки.
Чтобы сменить версию SDK в приложении на новую, приведём AAR к тому же состоянию, что и дизассемблированное приложение, т. е. из AAR получим набор smali-файлов. Преобразование происходит по цепочке: AAR → JAR → DEX → SMALI:
- из AAR с помощью утилиты unzip извлекаем JAR с кодом;
- JAR преобразуем в DEX через утилиту dxdump из Android SDK Tools;
- файлы в smali-коде получаем с помощью утилиты smali с DEX-файлом в качестве параметра.
П одмена реализации SDK
Получив smali-файлы приложения и SDK с логами, заменяем реализацию SDK новой. После чего пересобираем приложение. При трансляции в smali получаемые классы сохраняют расположение по подпакетам. Поэтому, если известен пакет, где лежат классы SDK, легко отличить класс библиотеки от классов приложения. Классы SDK могут быть распределены по нескольким DEX. Так что алгоритм, по которому подменяется реализация SDK, различается для приложения с одним DEX-файлом или несколькими.
А лгоритм подмены реализации SDK в приложении с одним DEX
В приложении с одним DEX мы просто скопируем новые smali-классы SDK поверх всех классов приложения и сгенерируем модифицированный DEX. Сгенерировать DEX-файл можно с помощью утилиты baksmali. На вход утилите подаётся директория с разбитыми по пакетам файлами классов в smali-коде. Пропустив через baksmali объединённые smali-файлы приложения и нового SDK, получаем модифицированный DEX-файл с изменённой логикой SDK.
А лгоритм подмены реализации SDK в приложении с MultiDex
Для приложения с MultiDex добавим отдельным DEX новый код SDK и удалим предыдущую версию SDK из остальных DEX-файлов приложения. Добавление новой версии SDK отдельным DEX позволит обойти ограничение количества методов в формате DEX. MultiDex автоматически догрузит добавленный DEX-файл с кодом SDK при его корректном наименовании. MultiDex ищет DEX-файлы по очереди, используя индекс в конце файла: сначала dex1, затем dex2 — и т. д. Если назвать файл c инкрементированным индексом, то MultiDex автоматически догрузит его в виртуальную машину. Таким образом через baksmali cгенерируем DEX-файлы на основе ранее полученных smali-файлов приложения, но с удалёнными классами старой версии SDK. А также соберём дополнительный DEX-файл с изменённой версией SDK, инкрементируя индекс в названии DEX-файла.
П ересборка приложения c новой версией SDK
Мы получили DEX-файлы приложения с изменённой версией SDK. Дело за малым: заменим DEX-файлы в первоначально распакованном APK-файле приложения модифицированными DEX-файлами. И вызовом команды zip получим финальную версию APK, которую осталось лишь подписать. Подпишем отладочным ключом через apksigner, чтобы приложение можно было установить на устройство. Приложение с изменённой логикой SDK готово.
Н едостатки
Алгоритм работает для большинства случаев, но иногда подменить реализацию SDK в приложении не получится. Причины этого:
- Обфускация ProGuard. Правила в consumer-файле библиотеки не дают ProGuard перемещать классы SDK. Но если разработчик отменит эти инструкции, то часть классов библиотеки может изменить свой пакет. В этом случае алгоритм не сработает, так как скрипт не найдёт расположение классов старого SDK.
- Ограничение формата DEX. Если весь код в приложении хранится в одном DEX-файле, который почти полностью исчерпал лимит используемых методов. При замене в приложении версии SDK версией с дополнительным логированием количество методов возрастёт. Лимит будет превышен. По формату DEX ограничение равно 2^16.
- Защита приложения от изменения. В приложение встроены механизмы борьбы с модификацией. Например, через валидацию подписи приложения. Изменяя APK, мы, соответственно, изменяем его подпись. При старте приложения оно сверяет подпись с эталонной и выбрасывает исключение. Особенно сложно убрать эту проверку, если она вынесена в нативную часть.
И тоги
Шаги, описанные в статье, мы автоматизировали простым bash-скриптом. У скрипта есть недостатки, однако он сильно ускоряет разбор сложных проблем при интеграции SDK в приложения партнёров. Хотя, мы редко применяем этот подход, так как зачастую находим решение на более ранних стадиях.
Из преобразования в smali можно извлечь дополнительную пользу: smali-файлы позволяют отлаживать приложение без исходников. Для запуска отладки нужно на основе smali-файлов приложения сгенерировать проект в Android Studio и приаттачить дебаггер к интересующему процессу. Подробнее написано в этой статье.
Источник
yandexmobile / yandex-ads-sdk-android Go PK Goto Github PK
yandex-ads-sdk-android’s Introduction
Yandex Advertising Network Mobile
This package contains Yandex Advertising Network Mobile SDK and source code of samples of SDK usage.
Documentation could be found at the [official website] DOCUMENTATION
EULA is available at [EULA website] LICENSE
Quick start in Android Studio
1. Running Android Studio 1.0 or higher
2. Import one of example projects:
Mediation through AdMob
Mediation through MoPub
3. Build and run.
For the integration of YandexMobileAds SDK need:
1. compile YandexMobileAds SDK:
2. compile AppMetrica SDK:
Contributors
Stargazers
Watchers
Forkers
yandex-ads-sdk-android’s Issues
«No ads available» for mediation demo banner blocks in example
Lines 26 to 31 in fabbd27
private static final String ADFOX_BLOCK_ID = » adf-279013/966631 » ; |
private static final String ADMOB_BLOCK_ID = » adf-279013/975926 » ; |
private static final String FACEBOOK_BLOCK_ID = » adf-279013/975929 » ; |
private static final String MOPUB_BLOCK_ID = » adf-279013/975927 » ; |
private static final String MYTARGET_BLOCK_ID = » adf-279013/975928 » ; |
private static final String STARTAPP_BLOCK_ID = » adf-279013/1004807 » ; |
Only ADFOX_BLOCK_ID works properly, attempts to use any other always end with error Ad request completed successfully, but there are no ads available . Does it should work like this? I think demo blocks should always show us something so that we can test their rendering and behavior.
java.lang.NegativeArraySizeException at com.yandex.mobile.ads.network.core.f.a(SourceFile:320)
Произошло на андроиде 4.4.
Сборка с версией:
java.lang.NegativeArraySizeException: -1348009530
at com.yandex.mobile.ads.network.core.f.a(SourceFile:320)
at com.yandex.mobile.ads.network.core.f.c(SourceFile:538)
at com.yandex.mobile.ads.network.core.f.d(SourceFile:560)
at com.yandex.mobile.ads.network.core.f$a.a(SourceFile:401)
at com.yandex.mobile.ads.network.core.f.a(SourceFile:154)
at com.yandex.mobile.ads.network.core.d.run(SourceFile:84)
ConcurrentModificationException at com.yandex.mobile.ads.nativeads.p$1.a(SourceFile:1091)
Версии: mobileads:2.61
mobmetricalib:2.77
Стало часто падать приложение: #0. Crashed: main: 0 0 0x0000000000000000
at java.util.HashMap$HashIterator.nextEntry(HashMap.java:787)
at java.util.HashMap$KeyIterator.next(HashMap.java:814)
at com.yandex.mobile.ads.nativeads.p$1.a(SourceFile:1091)
at com.yandex.mobile.ads.ac$1$1.a(SourceFile:95)
at com.yandex.mobile.ads.ac$1$1.a(SourceFile:88)
at com.yandex.mobile.ads.g.a.b.g$3.run(SourceFile:477)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:168)
at android.app.ActivityThread.main(ActivityThread.java:5885)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:797)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:687)
Полные логи можно посмотреть в приложенном файле.
Версии ОС: от 4 до 7, устройства разных брендов.
crash_logs.txt
Как поступить с этой проблемой? Спасибо за помощь!
SecurityException WifiService: Neither user 10113 nor current process has android.permission.ACCESS_WIFI_STATE.
I had five crashes on HTC Desire 616 dual sim with Android 4.2.2. Logs from fabric.io:
Version of libraries:
Banner AdSize question
Подскажите пожалуйста по работе с баннерами.
В аккаунте установлены разрешенные размеры для баннера: 320×100, 320×50.
Какой размер баннера нужно указать программно, чтобы показывались все разрешенные форматы: 320×100, 320×50?
Adview в ViewHolder RecyclerView
При использовании AdView в RecyclerView с разными BlockId и параметрами при переиспользовании вьюхи вылетает ошибка Block ID can’t be set twice. Как корректно переиспользовать AdView в recyclerview?
Можно ли использовать с нативной рекламой Яндекс Метрику версии 3.1.0?
Добрый день.
Мы используем библиотеку com.yandex.android:mobileads:2.72 для показа нативной рекламы.
У вас в документации приведен пример, что Яндекс Метрика должна быть com.yandex.android:mobmetricalib:2.73 или выше.
Можем ли мы использовать Яндекс Метрику com.yandex.android:mobmetricalib:3.1.0 и будут ли засчитаны показы рекламы, если мы будем использовать данную версию Яндекс Метрики?
Не работает с Android 9
implementation ‘com.yandex.android:mobmetricalib:3.2.2’
implementation ‘com.yandex.android:mobileads:2.72’
Помогает добавление в AndroidManifest.xml
Test blockId for an NativeImageAd
Hi, I’m implementing support of the nativeImageAd in my app. Now I’d like to test it’s appearance, but there are only two test blockId: one for a ContentAd and another for a AppInstallAd.
How can I check appearance of an nativeImageAd banner?
Thanks in advance!
Ошибки линта в логах
Постоянно вижу при сборке ошибки линта, это нормально? Как исправить?
Версии либ:
com.yandex.android:mobileads:2.100
com.yandex.ads.mediation:mobileads-mytarget:1.3.0
Версия AGP: 3.4.2
Версия Lint: com.android.tools.lint:lint:26.4.2
Could not load custom lint check jar file /gradle/caches/transforms-2/files-2.1/ec0890a7c6a3950f89d2d7c53b60969f/jars/lint.jar
java.lang.ClassNotFoundException: com.yandex.mobileads.lint.mobileads.MobileAdsIssueRegistryTest
at com.intellij.util.lang.UrlClassLoader.findClass(UrlClassLoader.java:241)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:348)
at com.android.tools.lint.client.api.JarFileIssueRegistry$Factory.loadIssueRegistry(JarFileIssueRegistry.kt:194)
at com.android.tools.lint.client.api.JarFileIssueRegistry$Factory.get(JarFileIssueRegistry.kt:152)
at com.android.tools.lint.client.api.JarFileIssueRegistry$Factory.get(JarFileIssueRegistry.kt:116)
at com.android.tools.lint.client.api.LintDriver.registerCustomDetectors(LintDriver.kt:464)
at com.android.tools.lint.client.api.LintDriver.analyze(LintDriver.kt:384)
at com.android.tools.lint.LintCliClient.run(LintCliClient.java:237)
at com.android.tools.lint.gradle.LintGradleClient.run(LintGradleClient.java:243)
at com.android.tools.lint.gradle.LintGradleExecution.runLint(LintGradleExecution.java:301)
at com.android.tools.lint.gradle.LintGradleExecution.lintSingleVariant(LintGradleExecution.java:385)
at com.android.tools.lint.gradle.LintGradleExecution.analyze(LintGradleExecution.java:91)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.android.tools.lint.gradle.api.ReflectiveLintRunner.runLint(ReflectiveLintRunner.kt:38)
at com.android.build.gradle.tasks.LintBaseTask.runLint(LintBaseTask.java:95)
at com.android.build.gradle.tasks.LintPerVariantTask.lint(LintPerVariantTask.java:57)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:103)
at org.gradle.api.internal.project.taskfactory.StandardTaskAction.doExecute(StandardTaskAction.java:48)
at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:41)
at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:28)
at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:702)
at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:669)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$5.run(ExecuteActionsTaskExecuter.java:401)
at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:402)
at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:394)
at org.gradle.internal.operations.DefaultBuildOperationExecutor$1.execute(DefaultBuildOperationExecutor.java:165)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:250)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:158)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:92)
at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:390)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:373)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.access$200(ExecuteActionsTaskExecuter.java:79)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$TaskExecution.execute(ExecuteActionsTaskExecuter.java:210)
at org.gradle.internal.execution.steps.ExecuteStep.lambda$execute$1(ExecuteStep.java:33)
at java.util.Optional.orElseGet(Optional.java:267)
at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:33)
at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:26)
at org.gradle.internal.execution.steps.CleanupOutputsStep.execute(CleanupOutputsStep.java:58)
at org.gradle.internal.execution.steps.CleanupOutputsStep.execute(CleanupOutputsStep.java:35)
at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:48)
at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:33)
at org.gradle.internal.execution.steps.CancelExecutionStep.execute(CancelExecutionStep.java:39)
at org.gradle.internal.execution.steps.TimeoutStep.executeWithoutTimeout(TimeoutStep.java:73)
at org.gradle.internal.execution.steps.TimeoutStep.execute(TimeoutStep.java:54)
at org.gradle.internal.execution.steps.CatchExceptionStep.execute(CatchExceptionStep.java:35)
at org.gradle.internal.execution.steps.CreateOutputsStep.execute(CreateOutputsStep.java:51)
at org.gradle.internal.execution.steps.SnapshotOutputsStep.execute(SnapshotOutputsStep.java:45)
at org.gradle.internal.execution.steps.SnapshotOutputsStep.execute(SnapshotOutputsStep.java:31)
at org.gradle.internal.execution.steps.CacheStep.executeWithoutCache(CacheStep.java:201)
at org.gradle.internal.execution.steps.CacheStep.execute(CacheStep.java:70)
at org.gradle.internal.execution.steps.CacheStep.execute(CacheStep.java:45)
at org.gradle.internal.execution.steps.BroadcastChangingOutputsStep.execute(BroadcastChangingOutputsStep.java:49)
at org.gradle.internal.execution.steps.StoreSnapshotsStep.execute(StoreSnapshotsStep.java:43)
at org.gradle.internal.execution.steps.StoreSnapshotsStep.execute(StoreSnapshotsStep.java:32)
at org.gradle.internal.execution.steps.RecordOutputsStep.execute(RecordOutputsStep.java:38)
at org.gradle.internal.execution.steps.RecordOutputsStep.execute(RecordOutputsStep.java:24)
at org.gradle.internal.execution.steps.SkipUpToDateStep.executeBecause(SkipUpToDateStep.java:96)
at org.gradle.internal.execution.steps.SkipUpToDateStep.lambda$execute$0(SkipUpToDateStep.java:89)
at java.util.Optional.map(Optional.java:215)
at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:54)
at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:38)
at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:77)
at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:37)
at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:36)
at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:26)
at org.gradle.internal.execution.steps.ResolveCachingStateStep.execute(ResolveCachingStateStep.java:90)
at org.gradle.internal.execution.steps.ResolveCachingStateStep.execute(ResolveCachingStateStep.java:48)
at org.gradle.internal.execution.impl.DefaultWorkExecutor.execute(DefaultWorkExecutor.java:33)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:117)
at org.gradle.api.internal.tasks.execution.ResolveBeforeExecutionStateTaskExecuter.execute(ResolveBeforeExecutionStateTaskExecuter.java:75)
at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:62)
at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:108)
at org.gradle.api.internal.tasks.execution.ResolveBeforeExecutionOutputsTaskExecuter.execute(ResolveBeforeExecutionOutputsTaskExecuter.java:67)
at org.gradle.api.internal.tasks.execution.StartSnapshotTaskInputsBuildOperationTaskExecuter.execute(StartSnapshotTaskInputsBuildOperationTaskExecuter.java:62)
at org.gradle.api.internal.tasks.execution.ResolveAfterPreviousExecutionStateTaskExecuter.execute(ResolveAfterPreviousExecutionStateTaskExecuter.java:46)
at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:94)
at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46)
at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:95)
at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57)
at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:56)
at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36)
at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:73)
at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52)
at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:49)
at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:416)
at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:406)
at org.gradle.internal.operations.DefaultBuildOperationExecutor$1.execute(DefaultBuildOperationExecutor.java:165)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:250)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:158)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:102)
at org.gradle.internal.operations.DelegatingBuildOperationExecutor.call(DelegatingBuildOperationExecutor.java:36)
at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:49)
at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:43)
at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:355)
at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:343)
at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:336)
at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:322)
at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker$1.execute(DefaultPlanExecutor.java:134)
at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker$1.execute(DefaultPlanExecutor.java:129)
at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:202)
at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.executeNextNode(DefaultPlanExecutor.java:193)
at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:129)
at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63)
at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:46)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55)
at java.lang.Thread.run(Thread.java:748)
Memory leak
В библиотеке версии 2.50 (и предыдущих версиях) присутствует утечка Activity — объект NativeContentAd имеет ссылку на NativeContentAdView , а View , в свою очередь, на Activity .
Дамп утечки полученный с помощью LeakCanary:
400 error code
После создания и добавления блоков прошло около 30 минут. Тестовая реклама показывается, действительная — нет. Используется баннер и полноэкранная.
Android sdk 29
implementation ‘com.yandex.android:mobmetricalib:3.8.0’
implementation ‘com.yandex.android:mobileads:2.110’
2019-11-03 16:32:04.147 6541-6630/com.sunraylabs.socialtags W/Gralloc3: mapper 3.x is not supported 2019-11-03 16:32:04.146 6541-6541/com.sunraylabs.socialtags W/RenderThread: type=1400 audit(0.0:9105): avc: denied < read >for name=»u:object_r:vendor_default_prop:s0″ dev=»tmpfs» ino=17561 scontext=u:r:untrusted_app:s0:c103,c258,c512,c768 tcontext=u:object_r:vendor_default_prop:s0 tclass=file permissive=0 2019-11-03 16:32:04.150 6541-6630/com.sunraylabs.socialtags E/libc: Access denied finding property «vendor.gralloc.disable_ahardware_buffer» 2019-11-03 16:32:04.170 6541-6541/com.sunraylabs.socialtags D/SocialHashTags: YANDEX testForceAttempts: 10 2019-11-03 16:32:04.189 6541-6735/com.sunraylabs.socialtags I/AppMetrica: Initializing of Metrica, Release type, Version 3.8.0, API Level 85, Dated 08.10.2019. 2019-11-03 16:32:04.194 6541-6541/com.sunraylabs.socialtags D/SocialHashTags: YANDEX testForceAttempts: 10 2019-11-03 16:32:04.206 6541-6735/com.sunraylabs.socialtags I/AppMetrica: Activate reporter with APIKey 334a75fn-xxxx-xxxx-xxxx-xxxxxxxx1d86 2019-11-03 16:32:04.239 6541-6541/com.sunraylabs.socialtags E/initMoPub: onInitializationFinished() 2019-11-03 16:32:04.295 6541-6768/com.sunraylabs.socialtags D/Volley: [13213] qw.a: Changing log tag to Yandex Mobile Ads 2019-11-03 16:32:04.412 6541-6541/com.sunraylabs.socialtags W/labs.socialtag: Accessing hidden method Lsun/misc/Unsafe;->compareAndSwapObject(Ljava/lang/Object;JLjava/lang/Object;Ljava/lang/Object;)Z (greylist, linking, allowed) 2019-11-03 16:32:04.511 6541-6779/com.sunraylabs.socialtags E/Yandex Mobile Ads: [13217] rf.a: Unexpected response code 400 for https://mobile.yandexadexchange.net/v4/ad 2019-11-03 16:32:04.513 6541-6541/com.sunraylabs.socialtags D/SocialHashTags AdsError: AdsError
спасибо, локализировали причину «android.database.sqlite.SQLiteException: table httpauth already exists», проблема будет исправлена в ближайшем обновлении SDK.
Здравствуйте, @dmitryfisko , прошу помощи. Получаю такую же ошибку у примерно 2% пользователей. сдк 2.91. Интер не использую, только банер.
Текст ошибки из файрбейс вот такой:
Fatal Exception: android.database.sqlite.SQLiteException
table httpauth already exists (code 1)
android.database.sqlite.SQLiteConnection.nativeExecuteForChangedRowCount (SQLiteConnection.java)
android.database.sqlite.SQLiteConnection.executeForChangedRowCount (SQLiteConnection.java:744)
android.database.sqlite.SQLiteSession.executeForChangedRowCount (SQLiteSession.java:754)
android.database.sqlite.SQLiteStatement.executeUpdateDelete (SQLiteStatement.java:64)
android.database.sqlite.SQLiteDatabase.executeSql (SQLiteDatabase.java:1676)
android.database.sqlite.SQLiteDatabase.execSQL (SQLiteDatabase.java:1605)
org.chromium.android_webview.HttpAuthDatabase$1.run (HttpAuthDatabase.java:1132)
Fatal Exception: java.lang.NullPointerException: name == null
Краш словлен на:
Девайс: MI 8 Explorer Edition
Android: 8.1.0
Версии либ:
com.yandex.ads.mediation:mobileads-mytarget:1.3.0
com.yandex.android:mobileads:2.100
com.yandex.android:mobmetricalib:3.6.4
Fatal Exception: java.lang.NullPointerException: name == null
at java.lang.Thread.setName + 1128(Thread.java:1128)
at java.lang.Thread.init + 411(Thread.java:411)
at java.lang.Thread.(Thread.java:566)
at com.yandex.mobile.ads.impl.dg.newThread + 31(dg.java:31)
at java.util.concurrent.ThreadPoolExecutor$Worker.(ThreadPoolExecutor.java:631)
at java.util.concurrent.ThreadPoolExecutor.addWorker + 945(ThreadPoolExecutor.java:945)
at java.util.concurrent.ThreadPoolExecutor.execute + 1377(ThreadPoolExecutor.java:1377)
at java.util.concurrent.Executors$DelegatedExecutorService.execute + 620(Executors.java:620)
at com.yandex.mobile.ads.impl.km.a + 69(km.java:69)
at com.yandex.mobile.ads.nativeads.t.a + 90(t.java:90)
at com.yandex.mobile.ads.mediation.nativeads.s.a + 54(s.java:54)
at com.yandex.mobile.ads.nativeads.t.a + 83(t.java:83)
at com.yandex.mobile.ads.nativeads.t.a + 38(t.java:38)
at com.yandex.mobile.ads.impl.qa.b + 38(qa.java:38)
at com.yandex.mobile.ads.impl.ot$a.run + 105(ot.java:105)
at android.os.Handler.handleCallback + 2(Handler.java:2)
at android.os.Handler.dispatchMessage + 4(Handler.java:4)
at android.os.Looper.loop + 139(Looper.java:139)
at android.app.ActivityThread.main + 65(ActivityThread.java:65)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run + 11(RuntimeInit.java:11)
at com.android.internal.os.ZygoteInit.main + 335(ZygoteInit.java:335)
ios ad on android
Почему на Android устройстве показывается реклама для iOS?
Доступна ли в MapKit кластеризация?
Failed to allocate a 1395484020 byte
Достаточно редко происходит. Количество разрядов запрошенной памяти слишком большое, столько на устройстве не получить.
Fatal Exception: java.lang.OutOfMemoryError: Failed to allocate a 1395484020 byte allocation with 4194304 free bytes and 234MB until OOM
at com.yandex.mobile.ads.network.core.f.a(SourceFile:320)
at com.yandex.mobile.ads.network.core.f.c(SourceFile:538)
at com.yandex.mobile.ads.network.core.f.d(SourceFile:561)
at com.yandex.mobile.ads.network.core.f$a.a(SourceFile:401)
at com.yandex.mobile.ads.network.core.f.a(SourceFile:154)
at com.yandex.mobile.ads.network.core.d.run(SourceFile:84)
java.lang.OutOfMemoryError: Failed to allocate a 856174776 byte allocation with 4194304 free bytes and 241MB until OOM
at com.yandex.mobile.ads.network.core.f.a(SourceFile:320)
at com.yandex.mobile.ads.network.core.f.c(SourceFile:538)
at com.yandex.mobile.ads.network.core.f.d(SourceFile:560)
at com.yandex.mobile.ads.network.core.f$a.a(SourceFile:401)
at com.yandex.mobile.ads.network.core.f.a(SourceFile:154)
at com.yandex.mobile.ads.network.core.d.run(SourceFile:84)
Проблемы с навигацией по документации
Здравствуйте! Вопрос не по теме, но не нашел, куда можно написать еще.
Пытался посмотреть документацию на сайте, но при переключении вкладок через навигационное меню появляется пустой экран.
https://tech.yandex.ru/mobile-ads/doc/dg/android/quick-start/native-docpage/
Memory leak
В версии 2.100 Activity всё еще утекает. В глубине NativeContentAd всё еще содержит ссылку на NativeContentAdView. Таким образом NativeContentAdView утекает через WeakHashMap в static объекте в глубине библиотеки, т.к. NativeContentAd является «значением» в ней, что блокирует gc для «ключа» NativeContentAdView.
ANR Executing service ru.mamba.client/com.yandex.metrica.ConfigurationService
Используем версии библиотек для отображения нативной рекламы:
compile ‘com.yandex.android:mobmetricalib:2.78’
compile ‘com.yandex.android:mobileads:2.62’
Наблюдаем рост ANR отчётов нашего приложения:
Судя по всему затронуты устройства на Андроид 4.*:
Отключение инициализации Метрики и отображения нативной рекламы от Яндекса проблему не решает. Наличие зависимостей (компиляция ConfigurationService в Манифест) ведёт к ANR-происшествиям.
Не всегда срабатывают методы слушателя InterstitialEventListener
Делаю все как написано в справке по подключению Yandex Ads Mobile
Мне важно получить событие когда полноэкранная реклама закрывается, но это событие onInterstitialDismissed срабатывает далеко не всегда. А события onInterstitialLoaded, onAdClosed и onAdOpened вообще никогда не вызываются. И еще, довольно часто реклама просто не показывается. Думаю какой-то тайм-аут должен быть и должно выходить событие onInterstitialFailedToLoad, но его нет. Ждал больше минуты. Как быть в обоих случаях?
NativeAdView inheritance
Хотел бы иметь возможность наследоваться от NativeAdView и реализовать inflate дочерних view внутри него.
Это нужно чтобы показывать пользователю NativeAdView бесшовно, устанавливая предварительно стандартную иконку, заголовок и др. до загрузки самой рекламы. По факту я это делаю извне NativeAdView, что не удобно. К примеру у AdMob есть класс UnifiedNativeAdView с методами доступа к дочерним view, им можно программно назначить начальное значение.
isLoading for NativeAd
Использую нативную рекламу в RecyclerView, делаю свою реализацию View без использования templates.
Я не могу найти метода, который бы позволил определить что нативная реклама сейчас в процессе загрузки/кэширования данных.
Я хочу избежать сценарий, когда пользователь очень быстро прокручивает список, как результат будет много запросов но мало показов.
Например у AdMob есть метод adLoader.isLoading() . Если он true, я жду и не делаю новый запрос.
Или мне нужно отменять предыдущий запрос перед показом новой рекламы?
nativeAdLoader.cancelLoading(); nativeAdLoader.loadAd(adRequest);
Unexpected response code 400
В приложении добавлен банер. С тестовым id успешно показывает рекламу для iphone (надеюсь в реальной будет показываться для Android?).
Когда добавляю реальную id для своего приложения реклама не показывается.
есть ошибка:
ANR Executing service my.package/com.yandex.metrica.MetricaService
Добрый день. Получил достаточное количество ANR из GooglePlay.
Метрика не используется, идет как обязательная библиотека к нативной рекламе.
build.gradle:
Эта проблема присутствует только на Андроид 5.0 и 5.1
Лог потоков
Черный экран вместо рекламы SDK 2.62 Android 4.1.2
Устройство Motorola Droid Bionik.
В разные периоды времени с разной частотой (порой более 50% показов) наблюдается непрогруженная реклама. Выглядит это так:
То же самое и на последней версии SDK 2.72
NullPointerException at com.yandex.mobile.ads.g.e.e (SourceFile:1082)
Добрый день.
Получил крешлог. Эти падения единичные, рута на устройствах не обнаружено.
Пока происходит только на устройствах с андроидом 4.4.2
В проекте используется :
com.yandex.android:mobmetricalib:2.73
com.yandex.android:mobileads:2.60
Fatal Exception: java.lang.NullPointerException
at android.os.Parcel.readException(Parcel.java:1478)
at android.os.Parcel.readException(Parcel.java:1426)
at android.os.storage.IMountService$Stub$Proxy.mkdirs(IMountService.java:769)
at android.app.ContextImpl.ensureDirsExistOrFilter(ContextImpl.java:2628)
at android.app.ContextImpl.getExternalCacheDirs(ContextImpl.java:1258)
at android.app.ContextImpl.getExternalCacheDir(ContextImpl.java:1247)
at android.content.ContextWrapper.getExternalCacheDir(ContextWrapper.java:247)
at com.yandex.mobile.ads.g.e.e(SourceFile:1082)
at com.yandex.mobile.ads.g.e.a(SourceFile:59)
at com.yandex.mobile.ads.ao.a(SourceFile:37)
at com.yandex.mobile.ads.ap.a(SourceFile:1054)
at com.yandex.mobile.ads.t.a(SourceFile:7122)
at com.yandex.mobile.ads.t$1.run(SourceFile:115)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:841)
Возможно ли вручную хендлить click по Native баннеру?
OutOfMemoryError: java.util.HashMap$HashMapEntry[] of length 1073741824 would overflow at com.yandex.mobile.ads.network.core.f.d (SourceFile:556)
В версиях библиотек:
Fatal Exception: java.lang.OutOfMemoryError: java.util.HashMap$HashMapEntry[] of length 1073741824 would overflow
at java.util.HashMap.makeTable(HashMap.java:550)
at java.util.HashMap.(HashMap.java:158)
at com.yandex.mobile.ads.network.core.f.d(SourceFile:556)
at com.yandex.mobile.ads.network.core.f$a.a(SourceFile:401)
at com.yandex.mobile.ads.network.core.f.a(SourceFile:154)
at com.yandex.mobile.ads.network.core.d.run(SourceFile:84)
WindowManager$BadTokenException
Обновился до версии Yandex Ads SDK 2.60.
И получил следующее падение:
Как воспроизвести не знаю, падает на устройствах пользователей.
Падает на Android 4.4.2 и 4.4.4
Падает не очень часто. Так что возможно не обязательно разбираться, что это и почему. Как минимум хотелось бы поставить try/catch в нужном месте чтобы SDK не роняло моё приложение в такой ситуации.
До этого пользовался версию Yandex Ads SDK 2.41, в нём такого падения не было. Так что наверное пока откачусь обратно на неё.
Не получается подключить к xamarin проекту
Пытался подключить в android xamarin проект но безуспешно.
Получается инициализировать библиотеку
YandexMetrica.activate(getApplicationContext(), API_KEY);
Получается создать реквест
AdRequest.builder().withParameters(parameters).build()
Но не получается добавить банер
NativeBannerView
потому как он не импортируется из jar
Не импортируется по причине обфускации.
Класс наследуется от z класса и из за этого проблема.
Есть ли у вас желание настроить обфускацию таким образом чтобы вашу библиотеку можно было бы подключать к xamarin проектам?
android.database.sqlite.SQLiteException
Доброго времени суток.
У 30% пользователей падает приложение. Ниже стек из «ANR и сбои»:
android.database.sqlite.SQLiteException:
at android.database.sqlite.SQLiteConnection.nativeExecuteForChangedRowCount (Native Method)
at android.database.sqlite.SQLiteConnection.executeForChangedRowCount (SQLiteConnection.java:732)
at android.database.sqlite.SQLiteSession.executeForChangedRowCount (SQLiteSession.java:754)
at android.database.sqlite.SQLiteStatement.executeUpdateDelete (SQLiteStatement.java:64)
at android.database.sqlite.SQLiteDatabase.executeSql (SQLiteDatabase.java:1676)
at android.database.sqlite.SQLiteDatabase.execSQL (SQLiteDatabase.java:1605)
at org.chromium.android_webview.HttpAuthDatabase$1.run (HttpAuthDatabase.java:19)
Инструмент разработчика установлен корректно, по справке. Яндекс метрика в классе приложения не инициализируется, а работает только как вспомогательная библиотека.
Приложение поддерживает Андроид от 4.1 до 8.1
If com.yandex.mobile.ads.AdActivity destroyed when onAdLeftApplication, onInterstitialDismissed is called. But when i press back i can see interstitial.
It can be reproduced by setting Don’t keep activities in dev settings and not destroying interstitial in onDestroy callback in activity.
Пакет для flutter
Планируется ли реализовать обёртку для flutter?
И если да, то когда её ожидать?
NPE in NativeLoadListener
Это происходит, если обнулить listener после отмены загрузки
Когда будет либа для windows 10 mobile?
Сорян если не по адресу, просто блин что за несправедливость? UWP приложения тоже хотят вашей монетезации!
java.lang.NegativeArraySizeException
How to disable separated process
Замечено, что в приложении появляется отдельный процесс после добавления implementation ‘com.yandex.android:mobmetricalib:3.6.4’
Можно ли убрать отдельный процесс и зачем он нужен? В приложении уже могут быть другие процессы, а тут от SDK появляется. Каждый процесс — это дополнительная нагрузка на память. Хочется легковесной SDK.
Пустой экран при возврате на полноэкранную рекламу
Добрый день.
Обнаружена проблема с полноэкранной рекламой — при возвращении из браузера в приложение, отображается активити полноэкранной рекламы с пустым контентом.
Воспроизводится иногда, гарантированного(100%) воспроизведения добиться не удалось.
Воспроизводилось на устройствах:
- Sony F5121 Android 7.1.1
- HTC Desire 530 Android 6.0.1
- Samsung Galaxy s6 edge SM-G925F Android 6.0.1
- Samsung Galaxy A5 (2016) SM-A510F Android 7.0
Шаги для воспроизведения:
- Отобразить полноэкранный баннер;
- Кликнуть на него(происходит переход в браузер устройства);
- Вернуться обратно из браузера в приложение хардварной кнопкой назад.
Скриншот:
Fatal Exception: java.lang.NullPointerException
Добрый день. Ребята, вылезла одна ошибка. Первый раз, видимо, редкая.
RuntimeException: Package manager has died at at com.yandex.mobile.ads.k.a.a(SourceFile:22)
Добрый день.
Получил крешлог. Падения единичные.
Происходит в основном на рутированных устройствах.
В проекте используется :
com.yandex.android:mobmetricalib:2.73
com.yandex.android:mobileads:2.60
Некорректно определяется область объявления в нативном формате
Последняя версия SDK 2.140.
Проблема наблюдается с объявлениями, в которых отсутствуют данные для Subview warning .
- Большая часть объявления скрыта, все ок.
- Вид полного объявления, рамка зеленая.
- Скрыта незначительная часть объявления — рамка красная.
Так же хотелось бы описать, почему нативный формат мобильной рекламы Yandex имеет наихудшую кастомизацию относительно AdMob и MyTarget:
- Изображения разнообразных соотношений сторон. При нативном виде на всю ширину экрана — объявление может занимать весь экран. Обрезать изображения более 20% запрещено требованиями. В то же самое время такие изображения в web объявлениях обрезаются.
- В 99% случаев для контентных объявлений отсутствует callToAction . Свой дефолтный, например «Перейти», либо просто кнопку со стрелкой поставить нельзя.
- Нельзя кастомизировать внешний вид причин закрытия для feedback .
- Жестко привязаны все View к определенным классам. К примеру нельзя использовать ImageButton для feedback , т.к. он требует Button .
- Тестовые блоки имеют только один вид объявления, в результате чего на них проверить все варианты нельзя. Отображение реальных объявлений (без засчитывания) было бы куда лучше.
- Нельзя загружать сразу несколько объявлений одним запросом.
- Для контентных объявлений нет иконок.
Не хватает метода unbindAd?
Добрый день.
При использовании NativeAppInstallAd и NativeContentAd в RecyclerView столкнулись с такой проблемой.
Поскольку RecyclerView переиспользует View при прокрутке; в случае, если прокрутка списка происходит быстрее, чем загрузка изображений, на карточке рекламы может на какое-то время появляться нерелевантное изображение (из предыдущей рекламы).
Есть ли какой-то способ прерывать загрузку изображений?
NullPointerException в методе WebViewClassic.loadDataWithBaseURL SDK v. 2.61
В Firebase консоли приходят ошибки с следующим стектрейсом:
Exception java.lang.NullPointerException:
android.webkit.WebViewClassic.loadDataWithBaseURL (WebViewClassic.java:3702)
android.webkit.WebView.loadDataWithBaseURL (WebView.java:864)
com.yandex.mobile.ads.t.b (SourceFile:121)
com.yandex.mobile.ads.y.b (SourceFile:43)
com.yandex.mobile.ads.d.b.a.a (SourceFile:31)
com.yandex.mobile.ads.d.b.c$1.a (SourceFile:77)
com.yandex.mobile.ads.d.b.e$1.a (SourceFile:1048)
com.yandex.mobile.ads.g.a.b.k.b (SourceFile:1060)
com.yandex.mobile.ads.g.a.d$a.run (SourceFile:105)
android.os.Handler.handleCallback (Handler.java:615)
android.os.Handler.dispatchMessage (Handler.java:92)
android.os.Looper.loop (Looper.java:174)
android.app.ActivityThread.main (ActivityThread.java:4952)
java.lang.reflect.Method.invokeNative (Method.java)
java.lang.reflect.Method.invoke (Method.java:511)
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:1027)
com.android.internal.os.ZygoteInit.main (ZygoteInit.java:794)
dalvik.system.NativeStart.main (NativeStart.java)
Код который вызывает ошибку:
public void b(String paramString) <
String str = paramString; paramString = this; paramString = str + paramString.b() + «»;
loadDataWithBaseURL(«https://yandex.ru», paramString, «text/html», «UTF-8», null);
>
API level: 16, 17 18
Список устройств:
GT-I8552 6
GT-S7262 3
Lenovo S580 3
HTC Desire 500 dual sim 3
GT-S6312 3
K00Z 3
GT-I8262 3
MediaPad T1 8.0 2
ETL-S4521 2
Proguard
Очень хочется, чтобы в библиотеке появился разумный proguard конфиг.
Что мне нужно: чтобы proguard удалял из моего apk все классы, которые мне не нужны. Например в библиотеке есть полноэкранная реклама, native реклама. Я ими не пользуюсь соответственно хочу, чтобы они не занимали зря место в моём apk. Кроме них уверен что proguard найдёт ещё много чего интересного, что можно легко вырезать.
Что есть сейчас: вы в конфиге указали, чтобы proguard вашей библиотеки вообще не касался. То есть все классы, которые для работы моего приложения не нужны, будут всё-равно в него запакованы. Возможно вы просто перестраховались и необходимости в этом нет совсем.
Что я предлагаю сделать: удалить строку keep class com.yandex.mobile.ads.** . Собрать и протестировать что получится. Возможно обнаружатся какие-то классы, которые нам нужны, но proguard их ошибочно вырезал. Вот только их и указать в конфиге. Хотя таких классов может и нет совсем.
Что мне не нужно: обфускация. Я обфускацией не пользуюсь так что меня не волнует, если вы в конфиге запретите обфускацию имён классов. Возможно кому-то другому это и нужно, но лично для меня это не актуально сейчас. Всё что я пишу касается только фазы shrink, то есть вырезания из apk неиспользуемых классов https://stuff.mit.edu/afs/sipb/project/android/sdk/android-sdk-linux/tools/proguard/docs/index.html#manual/introduction.html.
Почему для меня это важно: Я стараюсь, чтобы моё приложение было более компактным. И гугл нам постоянно напоминает обращать на это внимание. Меня расстраивает, когда каждая из используемых библиотек с каждым обновлением становится всё больше и больше. Изменения размера конечно обычно не большие, но они постоянно накапливаются. Хотя бы proguard помогает с этим как-то справлять. Но не в вашем случае к сожалению. Очень надеюсь на исправление.
java.util.concurrent.RejectedExecutionException
Здравствуйте.
В версии 2.61 появилась ошибка, которой в 2.41 не было. До 2.61 версии не пробовал, возможно, ошибка появилась ранее. Используется совместно с метрикой 2.73.
java.util.concurrent.RejectedExecutionException: at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:2011)
at java.util.concurrent.ThreadPoolExecutor.reject (ThreadPoolExecutor.java:793)
at java.util.concurrent.ThreadPoolExecutor.execute (ThreadPoolExecutor.java:1339)
at java.util.concurrent.Executors$DelegatedExecutorService.execute (Executors.java:583)
at com.yandex.mobile.ads.s.a (s.java)
at com.yandex.mobile.ads.s.b (s.java)
at com.yandex.mobile.ads.s.a (s.java)
at com.yandex.mobile.ads.ad.loadAd (ad.java)
at com.yandex.mobile.ads.AdView.loadAd (AdView.java)
Android 5.1 | 16 | 36,4 %
Android 6.0 | 10 | 22,7 %
Android 5.0 | 6 | 13,6 %
Android 4.2 | 5 | 11,4 %
Android 7.1 | 3 | 6,8 %
Android 7.0 | 2 | 4,5 %
Android 4.4 | 2 | 4,5 %
java.lang.NoClassDefFoundError: com/yandex/mobile/ads/r (wrong name: com/yandex/mobile/ads/R)
Добрый день.
Проблема: андроид студио не может «нарисовать» и скомпилировать яндекс AdView.
compile ‘com.yandex.android:mobileads:2.60’
compile ‘com.yandex.android:mobmetricalib:2.62’
import com.yandex.mobile.ads.*;
.
adViewInfoYandex = (com.yandex.mobile.ads.AdView)view.findViewById(R.id.adViewInfoYandex);
adViewInfoYandex.setBlockId(«R-M-225492-2»);
adViewInfoYandex.setAdSize(AdSize.BANNER_320x50);
final com.yandex.mobile.ads.AdRequest adRequest = new com.yandex.mobile.ads.AdRequest.Builder().build();
adViewInfoYandex.setAdEventListener(new AdEventListener.SimpleAdEventListener() <
@OverRide
public void onAdLoaded() <
Log.d(«YandexAds», «Loaded..»);
//.
>
>);
adViewInfoYandex.loadAd(adRequest);
Проблема проявляется уже в Layout Designer — выдает ошибку:
The following classes could not be instantiated:
— com.yandex.mobile.ads.AdView (Open Class, Show Exception, Clear Cache)
Tip: Use View.isInEditMode() in your custom views to skip code or show sample data when shown in the IDE. If this is an unexpected error you can also try to build the project, then manually refresh the layout.
Exception Details:
java.lang.ClassNotFoundException: org.json.JSONException at java.lang.ClassLoader.loadClass(ClassLoader.java:424) at java.lang.ClassLoader.loadClass(ClassLoader.java:357) at com.yandex.mobile.ads.j.b. . (SourceFile:43) at com.yandex.mobile.ads.ap.(SourceFile:37) at com.yandex.mobile.ads.t.(SourceFile:93) at com.yandex.mobile.ads.y.(SourceFile:27) at com.yandex.mobile.ads.aq.(SourceFile:37) at com.yandex.mobile.ads.am.(SourceFile:25) at com.yandex.mobile.ads.q.(SourceFile:35) at com.yandex.mobile.ads.af.a(SourceFile:221) at com.yandex.mobile.ads.af.(SourceFile:37) at com.yandex.mobile.ads.AdView.(SourceFile:40) at java.lang.reflect.Constructor.newInstance(Constructor.java:423) at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:727) at android.view.LayoutInflater.rInflate_Original(LayoutInflater.java:858) at android.view.LayoutInflater_Delegate.rInflate(LayoutInflater_Delegate.java:70) at android.view.LayoutInflater.rInflate(LayoutInflater.java:834) at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:821) at android.view.LayoutInflater.inflate(LayoutInflater.java:518) at android.view.LayoutInflater.inflate(LayoutInflater.java:397) Copy stack to clipboard
Проект чистил, ребилдил, андроид студио перезапускал, компьютер перезагружал.
В чем может быть проблема?
Enabling a feedback button in NativeBannerView
Hi! I’d like to know if it’s possible to enable a feedbackButton in a standard NativeBannerView? Thanks in advance!
Ad Activity into the AndroidManifest.xml is integrated wrong
Вынес ошибку отдельно.
Вылетает на строке в методе OnCreate() главной активности:
периодически вылетает java.lang.NullPointerException:
Recommend Projects
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
TensorFlow
An Open Source Machine Learning Framework for Everyone
Django
The Web framework for perfectionists with deadlines.
Laravel
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
Recommend Topics
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
server
A server is a program made to process requests and deliver data to clients.
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Visualization
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
Recently View Projects
yandex-ads-sdk-android
bip39
JavaScript implementation of Bitcoin BIP39: Mnemonic code for generating deterministic keys
Awesome-Profile-README-templates
A collection of awesome readme templates to display on your profile
buster95
fragile
Framework for building algorithms based on FractalAI theory
Источник