Android release构建无法接收Firebase控制台FCM推送通知问题
问题描述
debug构建版本可正常接收Firebase控制台下发的FCM通知,但Android release构建版本无法接收FCM推送
已完成的配置项:
- 已在Firebase控制台添加SHA-1密钥,下载
google-services.json文件放置到Android项目的app目录下 - 已在ProGuard规则中添加如下配置:
-keep class com.google.firebase.** { *; } - 已在AndroidManifest中添加服务配置:
<service android:name=".fcm.MyFirebaseMessagingService" android:enabled="true" android:exported="false"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT" /> </intent-filter> </service>
其余相关依赖均已正确添加,debug构建下推送功能完全正常,release构建下始终无法接收推送。
排查解决方案
按优先级逐一排查以下配置疏漏:
- 补全签名密钥配置
绝大多数此类问题都是签名密钥配置不全导致:- 不要只加SHA-1,必须同时把release签名的SHA-1、SHA-256两个哈希值都添加到Firebase控制台的项目设置中,Firebase当前的服务校验需要两个值
- 如果上架Google Play并开启了Play应用签名,必须额外添加Google Play控制台给出的应用签名密钥的两个哈希值,仅添加本地生成的上传密钥哈希无效
- 密钥添加完成后,重新下载最新的
google-services.json替换项目中的旧文件
- 补全R8/ProGuard混淆规则
你当前配置的规则只保留了Firebase官方库的类,没有保留你自定义的消息服务类。release构建开启代码压缩后,R8会将自定义的MyFirebaseMessagingService重命名,甚至判定为无用代码直接移除,导致FCM消息无法回调到你的服务。在混淆规则文件中追加以下配置:# 保留自定义FCM消息服务 -keep class 替换为你的应用包名.fcm.MyFirebaseMessagingService { *; } # 如果使用自定义实体类解析FCM消息负载,也要保留对应类,避免混淆导致JSON解析失败 -keep class 替换为你的应用包名.fcm.entity.** { *; } - 校验构建变体配置匹配
如果项目配置了多渠道、多构建Flavor,确认release变体对应的google-services.json和当前release包的包名、签名完全匹配,不要错用debug环境的配置文件。 - 检查合并后的最终Manifest
打开构建产物目录下的app/build/intermediates/merged_manifests/release/路径,查看最终打包进APK的Manifest文件,搜索com.google.firebase.MESSAGING_EVENT,确认该intent-filter只绑定你自定义的MyFirebaseMessagingService,没有被其他引入的依赖库中的服务抢占覆盖。 - 校验权限与网络配置
- 若为release构建单独配置了
networkSecurityConfig网络安全规则,确认没有拦截FCM服务的相关域名 - 安卓13(API 33)及以上版本需要动态申请
POST_NOTIFICATIONS通知权限,部分ROM对debug包默认授予该权限,但对release包默认禁用,先到系统应用设置页确认当前release包的通知权限已开启 - 检查系统省电、后台运行限制,确认没有拦截应用的FCM后台进程
- 若为release构建单独配置了
- 用单设备定向推送验证
不要直接用主题推送、全量推送测试,先在release包中打印当前生成的FCM注册token,在Firebase控制台的测试推送功能中填入该token定向发消息,先确认token本身有效、服务端可以正常识别到设备。
内容的提问来源于stack exchange,提问作者Abhishek Jha
相关产品推荐
相关产品推荐

