PAYATHON 2026

Flutter 应用上线 Google Play 后 AdMob 广告不显示,如何排查?

数据小陈

先获取完整加载错误,再决定是否等待

仅凭现有日志,无法确定广告停止展示的唯一原因,也不能保证再等一天就会恢复。先记录完整的 LoadAdError,在发布配置下验证测试广告,再检查 AdMob 后台的应用状态、投放限制和广告单元配置。

Android Google Mobile Ads SDK 的错误码 3 通常对应 ERROR_CODE_NO_FILL,表示没有返回可用广告。判断具体原因还需要结合错误域和错误消息,不能据此认定所有配置都正确。官方错误说明

日志中的信息分别说明什么?

这次问题发生在应用发布并关联 AdMob 之后。发布前能展示广告,只能证明当时的构建和请求条件曾经可用,线上版本仍需检查实际使用的配置。

相关日志是:

Received error HTTP response code: 400
Ad failed to load : 3

HTTP 400 表示某次 HTTP 请求收到了错误响应。由于日志没有提供响应正文和完整的请求上下文,不能仅凭相邻两行就断定广告单元 ID 错误,也不能确定它与错误码 3 的具体关系。

其他几条信息可以这样理解:

  • Use RequestConfiguration.Builder().setTestDeviceIds(...):这是配置测试设备的提示,不代表当前请求已经启用测试模式。
  • The Google Mobile Ads SDK will not integrate with Firebase:这条日志说明 Firebase 集成未成功。现有信息不足以证明它导致了广告加载失败,不应仅为消除警告而添加 Firebase 依赖。
  • SDK 过期提示:需要核对 Flutter 插件版本及其实际引入的 Android SDK 版本。提示本身不能证明此次失败由版本问题引起,也不要直接将日志中的长版本字符串当作 Flutter 插件版本。
  • Not retrying to fetch app settings 和 jsLoaded:单独看都不足以确定根因;脚本加载完成也不等于广告加载成功。

1. 在 Flutter 回调中记录完整错误

至少记录 domain、code、message 和 responseInfo。这些字段比 logcat 中的单个数字更有诊断价值。Flutter 加载错误文档

如果使用 google_mobile_ads 的 BannerAd,可以将下面的监听器接入现有广告加载代码;其他广告格式应使用各自的失败回调:

listener: BannerAdListener(
  onAdLoaded: (ad) {
    debugPrint('Ad loaded');
  },
  onAdFailedToLoad: (ad, error) {
    debugPrint('domain: ${error.domain}');
    debugPrint('code: ${error.code}');
    debugPrint('message: ${error.message}');
    debugPrint('responseInfo: ${error.responseInfo}');
    ad.dispose();
  },
),

这是一个监听器片段,使用前需导入项目所需的 Flutter 和 google_mobile_ads 包。如果项目所用插件版本的 API 不同,应按对应版本调整。

2. 用测试广告验证发布配置

在本地测试构建中,尽量保持与线上一致的 flavor、初始化流程和广告展示逻辑,临时替换为 Google 提供的测试广告单元。测试单元需要与 Android 平台及广告格式匹配。

也可以使用自己的广告单元,在发起请求前注册测试设备。针对日志中的设备,Flutter 配置示例为:

await MobileAds.instance.updateRequestConfiguration(
  RequestConfiguration(
    testDeviceIds: [
      '7B09E9E505F21D8552AD47ABBF4E2398',
    ],
  ),
);

Google 提供的测试广告单元不关联你的 AdMob 账号,可以先用它验证基础接入。测试广告能加载,说明基础加载链路可用,但不能保证自己的广告单元会获得真实广告填充。测试完成后,发布包应恢复正式广告单元配置。测试广告配置说明

根据测试结果继续排查:

  • 测试广告也加载失败:优先检查完整错误、初始化、网络和发布构建使用的配置。
  • 测试广告加载成功,正式广告持续失败:重点检查自己的广告单元、账号和应用投放状态,并结合错误消息判断原因。
  • 触发 onAdLoaded,界面仍无广告:检查展示逻辑。如果是横幅广告,确认 AdWidget 已加入界面且有足够的布局空间。横幅广告接入说明

3. 核对发布包中的 ID

检查实际安装的 Google Play 版本或对应发布构建,确认:

  1. AndroidManifest.xml 中的 AdMob App ID 与后台应用一致。
  2. 代码中的广告单元 ID 属于该应用,并与请求的广告格式一致。
  3. Android 构建没有误用 iOS 广告单元。
  4. flavor、环境变量或资源覆盖没有让 release 构建使用另一套 ID。

AdMob App ID 通常包含 ~,广告单元 ID 通常包含 /。两者用途不同,不能互换。

4. 分别检查应用就绪、投放限制和 app-ads.txt

先确认后台显示的是应用状态 Ready,还是仅某项验证成功。如果应用确实为 Ready,就不宜继续把“仍在首次就绪审核”当作默认解释。还应查看政策中心、账号通知及是否存在其他投放限制。Ready 表示应用已具备投放条件,不保证每次请求都有广告。应用就绪状态说明

“在应用中添加了 app-ads.txt”也需要确认具体含义。文件应发布在 Google Play 商店资料所填写的开发者网站根路径,例如:

https://example.com/app-ads.txt

如果只是把文件放进 Flutter 项目或打包进 APK/AAB,不能代替网站部署。还需要核对发布商 ID,并查看 AdMob 后台的抓取和验证状态。官方提到的至少 24 小时是抓取验证的等待时间,不是广告必定开始展示的承诺。app-ads.txt 部署说明

5. 哪些情况可以等待?

如果后台明确显示审核或验证仍在进行,可以按对应提示等待;如果后台要求修复配置或处理政策问题,就需要先完成处理。

如果应用已就绪、测试广告正常、配置核对无误,而完整错误消息仍为 No fill,则可能是当次请求没有合适的广告需求。此时可以使用 Ad Inspector 查看请求详情,避免在失败回调里立即循环重试。官方错误排查建议

如果广告持续无法展示,提交排查信息时应提供插件版本、实际 Android SDK 依赖版本、完整 LoadAdError、测试广告结果,以及后台应用和投放状态。现有日志缺少这些信息,还不能确认继续等待或升级依赖是否能解决问题。

备注:内容仅供参考。