Android生产APK中expo-notifications无法接收推送构建报错
问题根因
手动添加com.google.firebase:firebase-iid:17.0.2触发重复类构建错误,是因为你参考的旧方案适配的是低版本expo-notifications,当前Expo SDK45配套的expo-notifications@0.15.4内置的firebase-messaging:22.0.0已经合并了firebase-iid的所有类,额外引入旧版iid必然冲突。
2周前突发的Android生产构建无法生成推送令牌问题,核心诱因有两个:一是你app.json里的expo-notifications插件配置位置错误,写在了expo配置块外部,EAS构建时不会加载对应的原生推送配置;二是构建时Firebase依赖存在版本漂移,导致推送模块初始化失败,iOS平台不受这两个因素影响,所以功能正常。
修复步骤
- 彻底删除你之前在各个build.gradle文件中手动添加的
implementation 'com.google.firebase:firebase-iid:17.0.2'代码,这个依赖在当前版本下完全不需要。 - 修正app.json配置结构:把外层的plugins节点移动到expo配置块内部,确保EAS构建时能正确加载expo-notifications的原生配置,修正后的结构如下,其他原有配置保持不变即可:
{ "expo": { // 原有name、slug、version、ios、android等配置全部保留 "plugins": [ [ "expo-notifications", { "icon": "./assets/icon.png", "color": "#ffffff", "sounds": [ "./local/assets/notification-sound.mp3" ] } ] ] } }
- 锁定Firebase依赖版本,避免构建时拉取到不兼容的版本。直接在package.json的resolutions节点添加版本强制规则,不需要修改原生gradle文件:
"resolutions": { "expo-modules-autolinking": "~0.8.1", "com.google.firebase:firebase-messaging": "22.0.0" }
- 清理缓存后重新执行本地构建:
# 先删除旧依赖和缓存 rm -rf node_modules .expo android/build npm install # 加--clear-cache参数强制EAS重新执行原生预构建,不要用之前的缓存 eas build --profile=preview --local --clear-cache
验证说明
新构建的APK安装后,首次启动授予通知权限,调用getExpoPushTokenAsync()即可正常返回Expo推送令牌,不会出现生成失败的问题。拿到令牌后发送测试推送,Android端可正常接收,构建过程不会再出现重复类的依赖冲突报错。
不要尝试手动降级firebase-messaging版本,也不要额外引入firebase-iid相关依赖,所有Firebase相关依赖版本需要和当前使用的Expo SDK官方适配版本保持一致,避免引发其他原生兼容问题。
内容的提问来源于stack exchange,提问作者Hershy Heilpern
相关产品推荐
相关产品推荐

