Flutter应用Android启动崩溃 Firebase NoSuchMethodError报错排查
Flutter Android端启动即崩溃:Firebase Messaging初始化报NoSuchMethodError
问题定位
从崩溃堆栈可以直接定位根因:Firebase原生SDK版本冲突。
堆栈中明确显示firebase-messaging@@20.3.0初始化时,调用com.google.firebase.iid.GmsRpc的构造方法失败,当前APK中打包的firebase-iid组件版本过低,缺少对应入参的构造方法,抛出java.lang.NoSuchMethodError。
这类问题基本都是以下原因导致的:
- 手动在安卓构建配置中写死Firebase各组件版本,版本号之间不兼容
- 项目引入的其他Flutter/原生插件传递依赖了不同版本的Firebase SDK,Gradle依赖解析时拉取了不匹配的版本组合
- 构建缓存残留,旧版本依赖没有被正确替换
修复方案
按以下顺序操作即可解决:
- 第一步:移除手动指定的Firebase SDK固定版本号
打开android/app/build.gradle,检查dependencies块,如果有类似implementation 'com.google.firebase:firebase-messaging:20.3.0'这种单独写死版本的Firebase依赖,优先删掉版本号,改用Firebase官方推荐的BoM方式统一管理版本:
如果你是通过Flutter官方的dependencies { // 引入Firebase BoM,仅需指定BoM版本,所有Firebase组件版本自动对齐 implementation platform('com.google.firebase:firebase-bom:32.7.0') // 所有Firebase组件不需要再写版本号 implementation 'com.google.firebase:firebase-messaging' }firebase_messaging插件接入推送,直接把pubspec.yaml中对应插件升级到最新稳定版本即可,插件会自动绑定兼容的原生SDK版本,不要手动在原生配置中锁死Firebase SDK版本。 - 第二步:排查传递依赖冲突
执行命令打印安卓依赖树,定位冲突的依赖来源:
在输出结果中搜索cd android ./gradlew app:dependenciesfirebase-iid,如果存在多个版本被引入的情况,可以通过resolutionStrategy强制对齐版本:// 在android/app/build.gradle的android块同级添加 configurations.all { resolutionStrategy { // 强制指定和firebase-messaging匹配的firebase-iid版本,使用BoM时不需要加这段 force 'com.google.firebase:firebase-iid:20.3.0' } } - 第三步:清理缓存重新构建
执行以下命令清理所有构建缓存,避免旧包残留:flutter clean cd android && ./gradlew clean cd .. flutter pub get flutter run
崩溃堆栈参考
√ Built build\app\outputs\flutter-apk\app-debug.apk. E/AndroidRuntime(31208): FATAL EXCEPTION: main E/AndroidRuntime(31208): Process: com.a2meeamanora.parentsapp, PID: 31208 E/AndroidRuntime(31208): java.lang.NoSuchMethodError: No direct method <init>(Lcom/google/firebase/FirebaseApp;Lcom/google/firebase/iid/Metadata;Lcom/google/firebase/platforminfo/UserAgentPublisher;Lcom/google/firebase/heartbeatinfo/HeartBeatInfo;Lcom/google/firebase/installations/FirebaseInstallationsApi;)V in class Lcom/google/firebase/iid/GmsRpc; or its super classes (declaration of 'com.google.firebase.iid.GmsRpc' appears in /data/app/com.a2meeamanora.parentsapp-QBK-qAIbuN0wwRvjbwIR2A==/base.apk!classes2.dex) E/AndroidRuntime(31208): at com.google.firebase.messaging.TopicsSubscriber.createInstance(com.google.firebase:firebase-messaging@@20.3.0:1) E/AndroidRuntime(31208): at com.google.firebase.messaging.FirebaseMessaging.<init>(com.google.firebase:firebase-messaging@@20.3.0:12) E/AndroidRuntime(31208): at com.google.firebase.messaging.FirebaseMessagingRegistrar.lambda$getComponents$0$FirebaseMessagingRegistrar(com.google.firebase:firebase-messaging@@20.3.0:25) E/AndroidRuntime(31208): at com.google.firebase.messaging.FirebaseMessagingRegistrar$$Lambda$0.create(Unknown Source:0) E/AndroidRuntime(31208): at com.google.firebase.components.ComponentRuntime.lambda$discoverComponents$0(ComponentRuntime.java:132) E/AndroidRuntime(31208): at com.google.firebase.components.ComponentRuntime$$Lambda$1.get(Unknown Source:4) E/AndroidRuntime(31208): at com.google.firebase.components.Lazy.get(Lazy.java:53) E/AndroidRuntime(31208): at com.google.firebase.components.ComponentRuntime.doInitializeEagerComponents(ComponentRuntime.java:291) E/AndroidRuntime(31208): at com.google.firebase.components.ComponentRuntime.initializeEagerComponents(ComponentRuntime.java:281) E/AndroidRuntime(31208): at com.google.firebase.FirebaseApp.initializeAllApis(FirebaseApp.java:584) E/AndroidRuntime(31208): at com.google.firebase.FirebaseApp.initializeApp(FirebaseApp.java:303) E/AndroidRuntime(31208): at com.google.firebase.FirebaseApp.initializeApp(FirebaseApp.java:267) E/AndroidRuntime(31208): at com.google.firebase.FirebaseApp.initializeApp(FirebaseApp.java:252) E/AndroidRuntime(31208): at com.google.firebase.provider.FirebaseInitProvider.onCreate(FirebaseInitProvider.java:51) E/AndroidRuntime(31208): at android.content.ContentProvider.attachInfo(ContentProvider.java:2064) E/AndroidRuntime(31208): at android.content.ContentProvider.attachInfo(ContentProvider.java:2039) E/AndroidRuntime(31208): at com.google.firebase.provider.FirebaseInitProvider.attachInfo(FirebaseInitProvider.java:45) E/AndroidRuntime(31208): at android.app.ActivityThread.installProvider(ActivityThread.java:6487) E/AndroidRuntime(31208): at android.app.ActivityThread.installContentProviders(ActivityThread.java:6039) E/AndroidRuntime(31208): at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5951) E/AndroidRuntime(31208): at android.app.ActivityThread.-wrap1(Unknown Source:0) E/AndroidRuntime(31208): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1774) E/AndroidRuntime(31208): at android.os.Handler.dispatchMessage(Handler.java:106) E/AndroidRuntime(31208): at android.os.Looper.loop(Looper.java:192) E/AndroidRuntime(31208): at android.app.ActivityThread.main(ActivityThread.java:6759) E/AndroidRuntime(31208): at java.lang.reflect.Method.invoke(Native Method) E/AndroidRuntime(31208): at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:556) E/AndroidRuntime(31208): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:875)
内容的提问来源于stack exchange,提问作者Khushwant Pratap yadav
相关产品推荐
相关产品推荐

