Flutter发布版本Admob广告无法显示问题求助
针对你遇到的Debug版本AdMob广告正常、Release版本无广告的问题,结合你提供的配置,给出以下具体排查和解决步骤:
1. 补充完善ProGuard规则
当前的ProGuard规则覆盖范围不足,AdMob和Firebase的部分核心类、回调、注解可能被混淆移除,建议更新proguard-rules.pro为:
# 保留AdMob核心类及回调、监听器 -keep public class com.google.android.gms.ads.** { *; } -keep public class com.google.android.gms.ads.**$Callbacks { *; } -keep public class com.google.android.gms.ads.**Listener { *; } # 保留Firebase相关类及关键属性 -keep class com.google.firebase.** { *; } -keepnames class com.google.firebase.** -keepattributes Signature, InnerClasses, EnclosingMethod, *Annotation* # 保留Parcelable实现类的CREATOR -keepclassmembers class * implements android.os.Parcelable { public static final android.os.Parcelable$Creator CREATOR; } # 保留Flutter google_mobile_ads插件类(若使用该插件) -keep class io.flutter.plugins.googlemobileads.** { *; }
2. 确认Release版本SHA-1已添加到AdMob控制台
Debug和Release版本使用不同签名密钥,对应的SHA-1指纹不同,AdMob会验证该指纹:
- 获取Release签名SHA-1:执行命令
keytool -list -v -keystore 你的release密钥库路径 -alias 密钥别名 - 登录AdMob控制台,找到对应应用,在应用设置中添加该Release的SHA-1指纹
3. 临时关闭R8优化排查
Android Gradle插件默认用R8做代码优化,其规则比ProGuard更激进。可在项目根目录gradle.properties中添加:
android.enableR8=false
构建Release版本测试,若广告正常显示,说明是R8优化导致的,再针对性调整ProGuard规则。
4. 检查shrinkResources的影响
开启shrinkResources=true可能误删AdMob依赖的资源文件,可临时将其设为false测试:
release { shrinkResources false // 其他配置不变 }
若恢复正常,可创建res/raw/keep.xml手动保留AdMob所需资源:
<?xml version="1.0" encoding="utf-8"?> <resources xmlns:tools="http://schemas.android.com/tools" tools:keep="@layout/admob_*,@drawable/admob_*,@string/admob_*" />
5. 查看Release版本的AdMob日志
通过adb抓取Release版本的AdMob日志,定位具体错误:
adb logcat -s Ads
重点关注ClassNotFoundException、Initialization failed、Ad request failed等关键字段,这些会直接指出问题根源。
6. 核对依赖版本兼容性
你使用的Firebase BOM版本31.0.2,建议明确添加匹配的AdMob依赖:
implementation 'com.google.android.gms:play-services-ads:22.4.0'
该版本与Firebase BOM 31.0.2完全兼容。
7. 确认包名一致性
注意到build.gradle中的applicationId为com.buzzr.psl,但AndroidManifest.xml的package为com.iqonic.news_flutter。虽然applicationId是最终生效的包名,但建议确保AdMob控制台注册的应用包名与applicationId一致,避免潜在配置冲突。
内容的提问来源于stack exchange,提问作者Shaun Fortmann

