开启代码混淆(isMinifyEnabled=true)后Firebase Notification(HTTP v1 API)AccessToken获取失败导致推送失效
兄弟,我之前踩过一模一样的坑!安卓聊天应用用Firebase推送,关混淆一切正常,一开混淆就掉链子,日志里还报GoogleAuthException: Error getting access token for service account: 400 Bad Request,对吧?别慌,这大概率是代码混淆把Firebase推送的核心类给误删或者重命名了,咱们来一步步解决:
添加Firebase核心类的混淆保护规则
打开你的proguard-rules.pro文件,把下面这些规则加进去,确保Firebase OAuth2、消息推送相关的类不被混淆或移除:# 保护Google OAuth2服务账户相关类,避免AccessToken获取失败 -keep class com.google.auth.oauth2.** { *; } # 保护Firebase消息推送核心类 -keep class com.google.firebase.messaging.** { *; } # 保留JSON解析相关类,AccessToken获取依赖这些类做序列化/反序列化 -keep class org.json.** { *; } -keep class com.google.gson.** { *; } # 保留Google API客户端相关类 -keep class com.google.api.client.** { *; }为啥要加这些?因为Firebase推送的AccessToken获取流程里,很多类是通过反射调用的,混淆后系统找不到这些类,自然就拿不到Token,推送就失败了。
调整资源收缩设置
你现在开了isShrinkResources = true,这个选项会移除它认为“未被使用”的资源,但有时候会误删Firebase依赖的配置文件(比如google-services.json里的关键配置)。可以先把它改成false试试,如果推送恢复正常了,再慢慢调整资源收缩的规则,或者手动保留Firebase相关的资源。换用更温和的默认混淆文件
你当前用的是proguard-android-optimize.txt,这个版本的混淆规则优化更激进,可能会把一些关键的代码逻辑给优化掉。可以换成proguard-android.txt试试,这个是基础版的混淆文件,兼容性更好:proguardFiles(getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro")验证混淆结果
可以用Android Studio的Analyze -> Inspect Code工具检查混淆后的代码,看看有没有Firebase相关的类被错误移除;也可以查看build/outputs/mapping/debug/mapping.txt文件,确认核心类没有被重命名,确保反射能正常找到它们。
备注:内容来源于stack exchange,提问作者Rup Sarma

