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 版本或对应发布构建,确认:
AndroidManifest.xml中的 AdMob App ID 与后台应用一致。- 代码中的广告单元 ID 属于该应用,并与请求的广告格式一致。
- Android 构建没有误用 iOS 广告单元。
- 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、测试广告结果,以及后台应用和投放状态。现有日志缺少这些信息,还不能确认继续等待或升级依赖是否能解决问题。
备注:内容仅供参考。
