一次移动端广告链路排查:从“不展示”到定位无填充
这次排查的起点很简单: 页面上预留了 Banner 区域,但用户始终看不到广告。最开始大家直觉上都以为是广告位 ID 配错了, 但真正把链路拆开后,问题远比“配错参数”复杂一些。
第一步:先确认请求有没有发出去
遇到“广告不显示”这种问题,最怕的是一开始就盯着样式调。因为 UI 层就算留足了高度,如果底层请求根本没发出去, 再怎么改边距都不会有结果。所以第一件事不是改前端布局,而是看日志、看广告位、看回调。
当我把原生日志补全以后,发现请求其实已经到达 SDK,广告位也传对了。也就是说,问题不是“根本没请求”, 而是“请求之后为什么没有被正确渲染”。
第二步:把初始化时机和视图创建拆开看
很多原生广告接入在 Flutter 里都容易踩到一个坑:页面一渲染,`AndroidView` 就先创建了,但 SDK 还没真正完成初始化。 这时就会出现首帧失败、偶发成功、日志难看懂的情况。看起来像不稳定,其实只是顺序不对。
后来的处理方式很明确:先确认 SDK ready,再去创建原生视图。如果 SDK 没准备好,就先留出一个稳定的占位区域, 等初始化完成后再把原生视图挂进去。这个改动不大,但很关键,因为它把“初始化失败”和“渲染失败”这两个问题区分开了。
第三步:把失败原因回传到 Flutter
之前最大的障碍,是 Flutter 侧只能知道“显示了”或者“没显示”,却不知道没显示的真正原因。于是我在原生层补了 失败回调和异常日志,再把失败原因通过状态通道回传到 Flutter。这样一来,问题就从“玄学不显示”变成了可验证的错误链路。
最终拿到的关键信息是广告平台返回 `code 1009`,含义不是前端没渲染,也不是初始化没成功,而是当前时刻没有合适广告可填充。 这时问题的性质就完全变了:它已经不是代码层的阻塞,而是流量、广告位状态或者平台库存问题。
这次排查留下来的经验
- 先分层定位,再动代码,不要一上来就改 UI 或猜测配置。
- 混合开发场景里,初始化顺序和原生视图生命周期必须单独验证。
- 失败原因必须透传,否则 Flutter 层永远只能看到“没出来”。
- “无填充”是业务状态,不是工程错误,处理方式和代码 bug 不一样。
这类问题真正难的地方,不在于某一行代码,而在于要把链路一段一段拆清楚。只要状态足够可见,定位速度会快很多。