使用AdMob插屏广告时出现ANR问题及日志详情
针对你遇到的AdMob插屏广告触发ANR的问题,我来帮你梳理具体的排查方向和可行的解决方案:
问题核心定位
从ANR日志可以看出,阻塞主线程的操作来自AdMob广告缓存模块的com.google.android.gms.ads.internal.cache.b.c方法,属于AdMob动态库(版本17.1.21)的内部逻辑。这类问题通常和SDK版本、线程调度或设备资源紧张有关。
ANR日志详情
ANR Detected at com.google.android.gms.ads.internal.cache.b.c(:com.google.android.gms.dynamite_adsdynamite@17121050@17.1.21 (040406-245070773):42)
at com.google.android.gms.ads.internal.cache.a.run(:com.google.android.gms.dynamite_adsdynamite@17121050@17.1.21 (040406-245070773):3)
at android.os.Handler.handleCallback(Handler.java:790)
at android.os.Handler.dispatchMessage(Handler.java:99)
at vq.a(:com.google.android.gms.dynamite_adsdynamite@17121050@17.1.21 (040406-245070773):5)
at com.google.android.gms.ads.internal.util.f.a(:com.google.android.gms.dynamite_adsdynamite@17121050@17.1.21 (040406-245070773):8)
at vq.dispatchMessage(:com.google.android.gms.dynamite_adsdynamite@17121050@17.1.21 (040406-245070773):4)
at android.os.Looper.loop(Looper.java:192)
at android.app.ActivityThread.main(ActivityThread.java:6760)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:826)
设备环境信息
- 设备品牌/型号: vivo 1724
- Android版本: 8.1.0 (API 27)
- App版本: 2.2.4 [136]
- AdMob动态库版本: 17.1.21
- 当前网络: WiFi
- 可用内存: 1188MB(总内存2976MB)
具体解决方案
1. 优先升级AdMob SDK版本
你使用的17.1.21版本是比较老旧的版本,Google后续修复了大量ANR相关的底层bug。直接升级到最新稳定版是最有效的解决方式:
在build.gradle中更新依赖:
implementation 'com.google.android.gms:play-services-ads:22.6.0' // 替换为当前最新稳定版本
同步项目后重新测试,大部分这类ANR问题都能通过版本升级解决。
2. 确保广告加载在后台线程执行
日志显示缓存操作跑到了主线程,导致阻塞。建议把广告加载逻辑放到后台线程:
// 示例:在后台线程加载插屏广告 new Thread(() -> { InterstitialAd.load(context, "你的插屏广告ID", new AdRequest.Builder().build(), new InterstitialAdLoadCallback() { @Override public void onAdLoaded(@NonNull InterstitialAd interstitialAd) { // 广告加载成功后,存储实例备用 mInterstitialAd = interstitialAd; } @Override public void onAdFailedToLoad(@NonNull LoadAdError loadAdError) { // 处理加载失败逻辑 mInterstitialAd = null; } }); }).start();
3. 规避低内存场景加载广告
从设备信息看,可用内存已经接近低阈值,内存不足时AdMob的缓存操作容易因系统资源紧张阻塞。建议:
- 在加载广告前检查设备内存状态,内存不足时暂时跳过广告加载
- 优化App自身内存占用,及时释放无用资源(比如Bitmap、未使用的对象)
4. 调整广告展示时机
避免在主线程繁忙时(比如页面初始化、数据加载中)展示广告。可以延迟展示,给主线程腾出处理时间:
// 延迟1秒展示,确保主线程空闲 new Handler(Looper.getMainLooper()).postDelayed(() -> { if (mInterstitialAd != null && !activity.isFinishing()) { mInterstitialAd.show(activity); } }, 1000);
5. 检查广告回调的耗时操作
如果你在onAdLoaded、onAdFailedToLoad等回调中执行了数据库读写、网络请求等耗时操作,也会导致ANR。确保回调中只做轻量级逻辑,耗时任务放到后台线程处理。
总结
先尝试升级AdMob SDK到最新版本,这是解决这类ANR最直接的方法。如果问题仍存在,再结合线程优化、内存检查等方式逐一排查。
内容的提问来源于stack exchange,提问作者Parth Patel

