找不到类 "com.google.firebase.provider.FirebaseInitProvider"?

171

应用程序启动时出现以下异常。

java.lang.RuntimeException: Unable to get provider com.google.firebase.provider.FirebaseInitProvider: java.lang.ClassNotFoundException: Didn't find class "com.google.firebase.provider.FirebaseInitProvider" on path: DexPathList[[zip file "/data/app/com.vfirst.ifbagro-1.apk"],nativeLibraryDirectories=[/data/app-lib/com.vfirst.ifbagro-1, /vendor/lib, /system/lib]]
at android.app.ActivityThread.installProvider(ActivityThread.java:4993)
at android.app.ActivityThread.installContentProviders(ActivityThread.java:4596)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4536)
at android.app.ActivityThread.access$1300(ActivityThread.java:149)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1353)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5214)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:525)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:739)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:555)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.ClassNotFoundException: Didn't find class "com.google.firebase.provider.FirebaseInitProvider" on path: DexPathList[[zip file "/data/app/com.vfirst.ifbagro-1.apk"],nativeLibraryDirectories=[/data/app-lib/com.vfirst.ifbagro-1, /vendor/lib, /system/lib]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:53)
at java.lang.ClassLoader.loadClass(ClassLoader.java:501)
at java.lang.ClassLoader.loadClass(ClassLoader.java:461)
at android.app.ActivityThread.installProvider(ActivityThread.java:4978)
at android.app.ActivityThread.installContentProviders(ActivityThread.java:4596) 
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4536) 
at android.app.ActivityThread.access$1300(ActivityThread.java:149) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1353) 
at android.os.Handler.dispatchMessage(Handler.java:99) 
at android.os.Looper.loop(Looper.java:137) 
at android.app.ActivityThread.main(ActivityThread.java:5214) 
at java.lang.reflect.Method.invokeNative(Native Method) 

这是应用程序级别的build.gradle文件

apply plugin: 'com.android.application'
apply plugin: 'android-apt' 

android {
compileSdkVersion 24
buildToolsVersion "24.0.1"

defaultConfig {
    applicationId "com.vfirst.ifbagro"
    minSdkVersion 17
    targetSdkVersion 24
    versionCode 1
    versionName "1.0"
    multiDexEnabled true
}
buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}
}

dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])


compile 'com.android.support:appcompat-v7:24.2.1'
compile 'com.android.support:design:24.2.1'
compile 'com.android.support:support-v4:24.2.1'
compile 'com.google.android.gms:play-services-gcm:9.4.0'
compile 'com.google.android.gms:play-services-location:9.4.0'
compile 'com.android.support:multidex:1.0.1'
compile 'com.google.firebase:firebase-messaging:9.4.0'
compile 'com.google.android.gms:play-services:9.4.0'
testCompile 'junit:junit:4.12'
}

apply plugin: 'com.google.gms.google-services'

这是我的应用程序级别的build.gradle。
// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
repositories {
    jcenter()
    mavenCentral()
}
dependencies {
    classpath 'com.android.tools.build:gradle:2.2.0'
    classpath 'com.google.gms:google-services:3.0.0'
    classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
    classpath 'com.google.gms:google-services:3.0.0'

    // NOTE: Do not place your application dependencies here; they belong
    // in the individual module build.gradle files
}
}

allprojects {
repositories {
    jcenter()
}
}

task clean(type: Delete) {
     delete rootProject.buildDir
}

如何解决这个问题?


您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Jay Rathod
我已经尝试了所有那些答案,但都没有成功。 - WISHY
你的清单文件或google-services.json似乎存在问题,请确保它们是正确的。你能发一下你的清单文件吗? - Rushi M Thakker
6
你是否已经进行了所需的清单文件更改以使用MultiDex:android:name="android.support.multidex.MultiDexApplication"?如果MultiDex已正确配置,则您将在应用程序初始化期间看到类似于此消息的logcat消息:I/MultiDex: install done - Bob Snyder
检查即时运行是否启用,如果是,则禁用即时运行。 - Prathap Badavath
22个回答

158

我也遇到了同样的错误,我使用 MultiDex 解决了它,就像在这个链接中描述的一样: https://developer.android.com/studio/build/multidex.html


有时仅启用 MultiDex 是不够的。

如果在主 DEX 文件中没有提供启动期间所需的任何类,则您的应用程序将因错误 java.lang.NoClassDefFoundError 而崩溃。 https://developer.android.com/studio/build/multidex#keep

FirebaseInitProvider 在启动期间是必需的。

因此,您必须手动将 FirebaseInitProvider 指定为主 DEX 文件中所需的内容。

build.gradle 文件

android {
    buildTypes {
        release {
            multiDexKeepFile file('multidex-config.txt')
            ...
        }
    }
}

multidex-config.txt(与build.gradle文件在同一目录中)

com/google/firebase/provider/FirebaseInitProvider.class

26
嘿,这个异常:Caused by: java.lang.ClassNotFoundException: Didn't find class "com.google.firebase.provider.FirebaseInitProvider" 与启用multidex没有任何关系,事实上,如果您查看问题的build.gradle,multiDexEnabled是已启用的! - Jorgesys
4
这个错误是来自multidex,他只是没有完成所有步骤,因为你无法看到他的清单或主类。 - AMAN77
4
这个方法有效。我在gradle文件中启用了multidex,但是缺少了Android清单部分! - krikara
这个回答应该得到更多的赞同,正如之前所述,这与multidex无关,可能会让人们对multidex的真正含义和何时需要关注它感到困惑。据我所知,在Android 5.0 API之前,您不需要添加任何依赖项或配置来使用multidex。 - 4gus71n
3
请确保您的Application类继承自MultiDexApplication()。在我的情况下,这个步骤被遗漏了。 - Nelson Almendra
显示剩余2条评论

87

我也遇到了同样的问题,并最终通过在Android Studio中禁用Instant Run来解决它。

设置 → 构建、执行、部署 → Instant Run,然后取消选中启用Instant Run

更新:

在最新的Android Studio 3.5+中没有Instant Run选项。它只适用于旧版本。


9
我也是。这就是问题的原因——不是 multidex 或任何其他答案。 - Stevey
3
似乎这是Android Studio 2.3的问题。禁用即时运行对我也管用,但这并不是理想的解决方案 :( - Tharaka Devinda
1
我从另一家公司继承了两个项目。代码库、清单和Gradle配置几乎相同,只有几个小项不同。其中一个项目可以正常构建和运行,而另一个则不能。关闭Instant Run后,它们现在都可以运行。奇怪的是,这是使用Android Studio 2.3。 - kopi32
3
我在使用AS 3.1和运行API 26的模拟器时遇到了同样的问题。在此之前,使用API 19-25没有遇到任何问题。禁用即时运行确实让我能够运行应用程序。谢谢。 - Marcin Jedynak
2
禁用即时运行对我来说并不能解决这个问题。 - Alyoshak
显示剩余9条评论

50
在 build.gradle(Module:app) 文件中的 defaultConfig 中插入下面的代码:
  defaultConfig {
        applicationId "com.***.****"
minSdkVersion 15
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
        multiDexEnabled true
    }

并插入到依赖项中:

implementation 'com.android.support:multidex:2.0.1'

然后在清单文件中添加代码:

<application 
    android:name="android.support.multidex.MultiDexApplication"

1
我正在尝试,如果它能够工作,我会点赞并评论。 - Kamil Ibadov

50

我在我的(YouTube播放器项目)遇到了同样的问题...以下方法解决了我的问题:

  1. Add this code into your build.gradle (module: app) inside defaultConfing:

    defaultConfig {
        ....
        ....
        multiDexEnabled = true
    }
    
  2. Add this code into your build.gradle (module: app) inside dependencies:

    dependencies {
        compile 'com.android.support:multidex:1.0.1'
        .....
        .....
    }
    
  3. Open AndroidManifest.xml and within application:

    <application
        android:name="android.support.multidex.MultiDexApplication"
        .....
        .....
    </application>
    

    or if you have your App class, extend it from MultiDexApplication like:

    public class MyApp extends MultiDexApplication {
    .....
    

最后,我认为你应该在SDK管理器Extras中下载Android支持存储库


1
我使用了 "MultiDex.install(this);" 但没有起作用。将应用程序类扩展为 MultiDexApplication 就解决了问题。 - Safeer

36

只需在您的应用程序类中覆盖以下方法即可。

public class YourApplication extends Application {

    @Override
    protected void attachBaseContext(Context context) {
        super.attachBaseContext(context);
        MultiDex.install(this);
    }
    @Override
    public void onCreate() {
        super.onCreate();
        Realm.init(this); //initialize other plugins 

    }
}

加一分,因为没有被 Manifest 中的 android:name 所迷惑。 - Chisko
1
最简单且最好的答案 - kader kabore
如果您正在使用自定义的Application类,那么这就是答案。其他答案无法解决此问题。 - makkhay gurung

35
当您的应用程序及其引用的库超过65,536个方法时,您会遇到构建错误,表明您的应用程序已达到Android构建架构的限制。为避免此限制,您需要为您的应用程序配置multidex
如果您的minSdkVersion设置为21或更高版本,则只需在模块级build.gradle文件中将multiDexEnabled设置为true,如下所示:
android {
    defaultConfig {
        ...
        minSdkVersion 21 
        multiDexEnabled true
    }
    ...   
}

否则,如果你的minSdkVersion设置为20或更低,则必须按以下方式使用multidex支持库:

1.Modify the module-level build.gradle file to enable multidex and add the multidex library as a dependency, as shown here:

android {
    defaultConfig {
        ...
        minSdkVersion 15 
        multiDexEnabled true
    }
    ...
 }

dependencies {
        implementation 'com.android.support:multidex:1.0.3'
}

2.Depending on whether you override the Application class, perform one of the following:

  • If you do not override the Application class, edit your manifest file to set android:name in the tag as follows:

    <application
        android:name="android.support.multidex.MultiDexApplication" >
        ...
    </application>
  • Else If you do override the Application class, change it to extend MultiDexApplication (if possible) as follows:

   public class MyApplication extends MultiDexApplication { ... }
  • Else you do override the Application class but it's not possible to change the base class, then you can instead override the attachBaseContext() method and call MultiDex.install(this) to enable multidex:

   public class MyApplication extends SomeOtherApplication {
     @Override
     protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        MultiDex.install(this);
     }
   }

应用程序为什么需要扩展MultiDexApplication? - Jason
2
MultiDexApplication是一个支持库类。它实现了Application类并覆盖了一个名为attachBaseContext的方法来完成MultiDex注册的工作。如果您重写attachBaseContext方法,则无需扩展此类。 - Sokmean Pon
1
这个方法在2019年的React Native中对我有用,但是MainApplication.java文件缺少两个导入:import android.content.Context;import android.support.multidex.MultiDex; - xaphod
2
你的回答帮助我使我的应用程序向后兼容。 - Alok Vishwakarma

18

启用 multidex 不是一个好的解决方案,因为在 Android 上 multidex 有另外一种用途,请参阅此答案 what is multidex

解决方案是禁用即时运行,如 @Shylendra Madda 所说

设置 → 构建、执行、部署 → 即时运行,并取消选中启用即时运行

我认为这个问题的原因是当启用即时运行时,Android Studio 不会将诸如 firebase 这样的库放入生成的 apk 中,以缩短项目构建时间,因为 firebase 库和其他库(例如 mapsothers)都存在于 Play 服务中,而 Play 服务已安装在 Android 设备上,因此如果启用即时运行,则无需将它们放入生成的 apk 中以使构建时间更快。

因此,当您提取 apk 并在另一个设备上安装它时,您将看到此异常


1
这是完美的解决方案。 - Ghanshyam Bagul
禁用即时运行对我来说并不能解决问题。 - Alyoshak
在Android Studio 3.5.1中,构建、执行、部署部分中没有即时运行项目。 - Vergiliy
@Vergiliy,他们用“应用更改”替换了它,请参阅发布博客文章https://android-developers.googleblog.com/2019/08/android-studio-35-project-marble-goes.html以获取更多信息,并参阅文档https://developer.android.com/studio/run#apply-changes以获取有关“应用更改”的更多信息。 - Edalat Feizi

15

我也遇到了同样的问题,尝试了所有的解决方案后,我发现以下解决方案:

如果您已经应用了Proguard规则,请在Proguard规则中添加以下行:

-keep class com.google.firebase.provider.FirebaseInitProvider

并且解决了我的问题。


@gunavant patel 兄弟,请告诉我如何将其添加到 Proguard 中。 - Gowthaman M
1
@gunavant patel,我认为这将解决我的问题...您能否请发布示例代码,告诉我在哪里保留此行“-keep class com.google.firebase.provider.FirebaseInitProvider”? - Gowthaman M
首先,请检查您是否在app/build.gradle文件中启用了proguard。如果已启用,则在app/proguard-rules.pro中找到proguard规则文件,并添加上述行。 如果您没有启用proguard,则无法帮助您。 - Gunavant Patel
构建类型 { 发行版 { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } }请告诉我如何启用。 - Gowthaman M
如果您尚未启用Proguard,则问题不同。但我会向您展示如何启用它。 在发布中添加“minifyEnabled true”,如果您想为调试启用它,则也需要在调试类型中添加。 - Gunavant Patel

8

1: 进入gradle启用multiDexEnabled并在依赖中添加multidex库。

android {
   ...
   defaultConfig {
      multiDexEnabled true
      ...
   }
}

dependencies {
  // add dependency 
  implementation 'com.android.support:multidex:1.0.1'
}

2: 打开清单文件,写入 android:name=".MyApplication"(类名(MyApplication)是可选的,您可以写任何想要的名称)。

    <application
        android:name=".MyApplication"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        .
        .
        .
        .
        .
    </application>

3: 当你在Manifest文件的Application标签中写入android:name=".MyApplication"时,如果你没有创建MyApplication类,会出现错误。创建MyApplication类并将其扩展为“application”类或者简单地点击.MyApplication,在语法左侧会出现一个小红气球,点击它,你将看到菜单中的(create MyApplication class),点击它并在该类中包含以下方法。

    public class MyApplication extends Application {

    @Override 
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        MultiDex.install(this);
    } 

如果您想获取更多信息,请点击此链接:https://developer.android.com/studio/build/multidex.html

希望这对您有所帮助。


7
首先将以下内容添加到 build.gradle(Module:app) 文件中 ---->
defaultConfig{
..
multiDexEnabled true
..
}

然后在同一个文件中添加以下内容

dependencies{
...
compile 'com.android.support:multidex:1.0.1'
...
}

然后在 AndroidManifest.xml 中写入以下内容:

<application
    android:name="android.support.multidex.MultiDexApplication"
    .....
    .....
</application>

就是这样。它一定会起作用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接