yandexmobile / yandex-ads-sdk-android

Other
80 stars 22 forks source link

ANR - взаимная блокировка между главным потоком и вызовом NativeLoader.loadAdd() в фоновом потоке #131

Closed tommototom closed 2 years ago

tommototom commented 2 years ago

Версии библиотек:

com.yandex.android:mobileads:4.3.0
com.yandex.android:mobmetricalib:3.20.1

Дампы потоков:

main (blocked)
tid=1 systid=25324 | waiting to lock <0x09aa223e> (java.lang.Object) held by thread 269
com.yandex.mobile.ads.nativeads.z.a (SourceFile:55)
com.yandex.mobile.ads.nativeads.ab.a (SourceFile:46)
com.yandex.mobile.ads.nativeads.af$1.run (SourceFile:110)
android.os.Handler.handleCallback (Handler.java:938)
android.os.Handler.dispatchMessage (Handler.java:99)
android.os.Looper.loopOnce (Looper.java:226)
android.os.Looper.loop (Looper.java:313)
android.app.ActivityThread.main (ActivityThread.java:8663)
java.lang.reflect.Method.invoke (Method.java)
com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:567)
com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1135)
RxCachedThreadScheduler-153 (blocked)
tid=269 systid=23633 | waiting to lock <0x0dd3a89f> (java.lang.Object) held by thread 1
com.yandex.mobile.ads.nativeads.af.a (SourceFile:68)
com.yandex.mobile.ads.nativeads.y.a (SourceFile:188)
com.yandex.mobile.ads.nativeads.ab.a (SourceFile:66)
com.yandex.mobile.ads.nativeads.z.a (SourceFile:64)
com.yandex.mobile.ads.nativeads.NativeAdLoader.setNativeAdLoadListener (SourceFile:49)
com.avito.android.serp.ad.YandexBannerLoaderImpl.loadBanner$lambda-1$lambda-0 (YandexBannerLoaderImpl.java:54)

На фоновом потоке выполняется примерно такой код:

val adLoader = NativeAdLoader(context)
adLoader.setNativeAdLoadListener(AdLoaderListener(emitter))
adLoader.loadAd(banner.createConfiguration())

Судя по дампам, происходит взаимная блокировка. Сейчас это топ-1 ANR, который аффектит большое количество пользователей. Не увидел в документации ничего о том, что NativeLoader.loadAdd() и сопутствующее ему должно вызываться на главном потоке, возможно, я нарушил этот контракт и ссзб.

Для исправления на стороне клиента унёс всю работу на главный поток, должно помочь, через неделю смогу сказать точно. Хотел бы узнать, известная ли это проблема, планируете её решить?

mobile-ads-github commented 2 years ago

Добрый вечер, спасибо! Поправим ошибку в SDK в ближайшем релизе. Релиз SDK планируем в середине следующей недели. Перенос работы с NativeAdLoader на главный поток, должен решить проблему, без ожидания релиза SDK.

mobile-ads-github commented 2 years ago

Здравствуйте, исправили в версии 5.1.0