You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用AdMob插屏广告时出现ANR问题及日志详情

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:35:15