找不到类“ com.google.firebase.provider.FirebaseInitProvider”吗?


156

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

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
}

该如何解决呢?



我已经尝试了所有这些答案。没有任何结果
WISHY 16-10-3

您的清单或google-services.json中似乎有问题,请确保它们是正确的。您可以发布清单文件吗?
Rushi M Thakker '16

6
您是否做了MultiDex所需的清单更改android:name="android.support.multidex.MultiDexApplication"?如果MultiDex配置正确,你将应用程序初始化像这样的过程中看到logcat的消息:I/MultiDex: install done
Bob Snyder

如果启用,请检查即时运行启用,禁用即时运行。
Prathap Badavath,2016年

Answers:


145

我遇到了相同的错误,并使用MultiDex解决了该错误,如此链接中所述:https : //developer.android.com/studio/build/multidex.html


有时仅启用MultiDex还不够。

如果主DEX文件中未提供启动过程中所需的任何类,则您的应用程序崩溃,错误为java.lang.NoClassDefFoundErrorhttps://developer.android.com/studio/build/multidex#keep

启动过程中需要FirebaseInitProvider

因此,您必须根据需要在主DEX文件中手动指定FirebaseInitProvider

build.gradle文件

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

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

com/google/firebase/provider/FirebaseInitProvider.class

1
您非常了不起<3非常感谢您保存了我的一天<3
Mohamed Atef

24
嘿,这个异常:原因:java.lang.ClassNotFoundException:找不到类“ com.google.firebase.provider.FirebaseInitProvider” 与启用multidex无关,实际上,如果您看到问题build.gradle multiDexEnabled已启用!
Jorgesys '16

3
没有这个错误来自multidex,他只是没有完成所有步骤,因为您看不到他的清单或主要班级。
AMAN77'3

3
这工作了。我在gradle文件中启用了multidex,但缺少了Android Manifest部分!
krikara

3
另外,请确保您的Application班级从扩展MultiDexApplication()。在我的情况下,这是丢失的。
尼尔森·阿尔门德拉

86

我也遇到过同样的问题,最后通过Instant Run在android studio中禁用它来解决了。

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

更新:

最新的Android Studio 3.5+中没有即时运行选项。它仅适用于旧版本。


8
我也是。这是问题的原因-不是multidex或其他任何答案。
user3562927

3
似乎这是Android Studio 2.3的问题。禁用即时运行对我也确实有效,但这不是理想的解决方案:(
Tharaka Devinda

1
我从另一家公司继承了两个项目。对于几个次要项目,代码库,清单和gradle配置实际上是相同的。一个项目可以构建并正常运行,而另一个则不能。关闭“即时运行”,它们都现在运行。奇怪。这是使用Android Studio。2.3。
joeblow23 '17

3
我在AS 3.1和运行API 26的仿真器中也遇到了同样的问题。在我未遇到API 19-25的任何问题之前。禁用即时运行确实可以让我运行该应用程序。谢谢。
Marcin Jedynak '18

1
禁用即时运行无法为我解决此问题。
Alyoshak

49

在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 '17

45

我在我的YouTube播放器项目中遇到了同样的问题,以下问题为我解决了这个问题:

  1. 将此代码添加到您的build.gradle(模块:应用)中defaultConfing

    defaultConfig {
        ....
        ....
        multiDexEnabled = true
    }
  2. 将此代码添加到您的build.gradle(模块:应用)中dependencies

    dependencies {
        compile 'com.android.support:multidex:1.0.1'
        .....
        .....
    }
  3. 打开AndroidManifest.xml并在application

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

    或者,如果您拥有App类,则从MultiDexApplication扩展它,例如:

    public class MyApp extends MultiDexApplication {
    .....

最后,我认为您应该在SDK ManagerExtras中下载了Android Support Repository


1
我做了“ MultiDex.install(this);” 但这没用。使用MultiDexApplication扩展应用程序类可以达到目的。
安全的

33

只需在应用程序类中重写以下方法。

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 

    }
}

加上一项不android:name因清单中的物品而掉落的原因
Chisko

最简单,最好的答案
kader kabore

如果您使用的是自定义Application类,那么这就是答案。其他答案无法解决问题。
makkhay gurung

25

当您的应用程序及其引用的库超过65,536个方法时,您会遇到一个构建错误,表明您的应用程序已达到Android构建体系结构的限制

为了避免此限制,您必须为Multidex配置应用程序

如果minSdkVersion设置为21或更高,则只需在模块级build.gradle文件中将multiDexEnabled设置为true,如下所示:

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

否则,如果您的minSdkVersion设置为20或更低,则必须使用multidex支持库,如下所示:

1.修改模块级别的build.gradle文件以启用multidex并将multidex库添加为依赖项,如下所示:

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

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

2。根据是否覆盖Application类,执行以下操作之一:

  • 如果不覆盖Application类,请编辑清单文件以在标记中设置android:name,如下所示:

    <application
        android:name="android.support.multidex.MultiDexApplication" >
        ...
    </application>
  • 否则,如果您确实重写Application类,请如下进行更改以扩展MultiDexApplication(如果可能):

   public class MyApplication extends MultiDexApplication { ... }
  • 否则,您确实覆盖了Application类,但是无法更改基类,那么您可以替代重写attachBaseContext()方法并调用MultiDex.install(this)以启用multidex:

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

为什么应用程序需要扩展MultiDexApplication?
杰森

1
MultiDexApplication是支持类的库。它实现Application类,并重写方法名称attachBaseContext来完成MultiDex注册的工作。如果重写attachBaseContext方法,则无需扩展此类。
Sokmean Pon

1
这在2019年使用React Native为我修复了它,但是在MainApplication.java中缺少2个导入:import android.content.Context;import android.support.multidex.MultiDex;
xaphod

1
您的回答帮助我使我的应用重新兼容。
Alok Vishwakarma

18

启用 multidex不是一个好的解决方案,因为multidex在Android中还有其他用法请参见此答案什么是multidex

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

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

我认为这个问题的原因是,启用即时运行后,Android Studio不会将诸如库之类的文件firebase放入生成的apk中,以减少项目的构建时间,因为该firebase 库和其他库(例如maps他人是存在于游戏服务,游戏服务安装在Android设备上运行,因此如果启用了即时运行,则无需将其放入生成的APK中以加快构建时间。

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


1
这是完美的解决方案
Ghanshyam Bagul

禁用即时运行无法为我解决问题。
Alyoshak

在Android Studio 3.5.1中,“构建,执行,部署”部分中没有“即时运行”项。
Vergiliy

@Vergiliy他们取代它与应用更改请参见发行的博客文章android-developers.googleblog.com/2019/08/...更多的信息和文档developer.android.com/studio/run#apply-changes更多信息有关申请变化
Edalat Feizi

14

在尝试了以下解决方案后,我也遇到了相同的问题。

如果您已应用Proguard规则,则在ProGuard Rules中添加以下行

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

并解决了我的问题。


@gunavant patel bro,请告诉我如何添加到proguard中
Gowthaman M

1
@gunavant patel我认为这将解决我的问题...您能在示例代码中保留此行-keep class com.google.firebase.provider.FirebaseInitProvider
吗?

@GowthamanM首先检查您是否在app / build.gradle文件中启用了proguard。如果启用,那么您会在app / proguard-rules.pro中找到proguard-rules文件,在该文件中添加以上行。如果您未启用proguard,则不会帮助您。
Gunavant Patel

buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } }如何启用,请告诉我,先生
Gowthaman M

如果您尚未启用proguard,则问题会有所不同。但我向您展示了如何启用它。在发行版中添加“ minifyEnabled true”,或者如果要启用调试,则还添加调试类型。
Gunavant Patel

8

1:转到gradle enable 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:正如您在清单文件中编写android:name =“。MyApplication”内部应用程序一样。它会给您一个错误,因为您没有创建MyApplication类。创建MyApplication类可以通过“应用程序”类对其进行扩展,或者只需单击。MyApplication,在语法的左侧出现一个红色的小气球,单击它,您将在菜单中看到(创建MyApplication类),单击它并包含在该类内的方法下面。

    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>

而已。肯定会的


6

如果您在App Gradle中使用MultiDex,则更改扩展应用程序以在应用程序类中扩展MultiDexApplication。它将反抗地工作


4

我遇到了同样的问题,只需添加一段代码即可解决,如果遇到此问题,则意味着您已经完成了使用Firebase的所有步骤。您只需要创建一个扩展Application的类(公共类Application_CrashReport扩展Application),然后将此类添加到mainifest文件中,就可以在该类中重写以下方法

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

并添加MultiDex.install(this); 用这种方法意味着

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

注意:- 不要忘记执行上述步骤


2

这是由于MultiDex。

解决步骤:

  1. 在gradle-> dependencies->(compile'c​​om.android.support:multidex:1.0.1')中将此添加到依赖项中

  2. 在您的项目中,应用程序类像这样扩展MultiDexApplication(公共类MyApplication扩展MultiDexApplication)

  3. 运行并检查


2

对于那些进来的人来说有点晚了,但是请检查您的保镖规则!我在此上浪费了很多时间。您的保卫规则可能是将名称更改为重要的Firebase文件。这确实只证明了在生产和即时运行中存在问题:)

proguard-rules.pro

-keep class com.google.firebase.** { *; }
-keep class com.firebase.** { *; }
-keep class org.apache.** { *; }
-keepnames class com.fasterxml.jackson.** { *; }
-keepnames class javax.servlet.** { *; }
-keepnames class org.ietf.jgss.** { *; }
-dontwarn org.apache.**
-dontwarn org.w3c.dom.**

这样就成功了,启用Multidex只会浪费时间!
Magnus W

2

如前所述,这是一个问题multidex:您应该在build.gradle和中添加实现MainApplication.java。但是,添加的内容实际上取决于您是否支持AndroidX。这是解决此问题所需的条件:

  1. 如果您支持AndroidX

将这些代码行放入您的build.gradle(android / app / build.gradle):

defaultConfig {
  applicationId "com.your.application"
  versionCode 1
  versionName "1.0"
  ...
  multiDexEnabled true // <-- THIS LINE
}
...
...
dependencies {
  ...
  implementation "androidx.multidex:multidex:2.0.1" // <-- THIS LINE
  ...
}

将这些行放入您的MainApplication.java(android / app / src / main / java /.../ MainApplication.java)中:

package com.your.package;

import androidx.multidex.MultiDexApplication; // <-- THIS LINE
...
...
public class MainApplication extends MultiDexApplication { ... } // <-- THIS LINE
  1. 如果您不支持AndroidX

将这些代码行放入您的build.gradle(android / app / build.gradle):

defaultConfig {
  applicationId "com.your.application"
  versionCode 1
  versionName "1.0"
  ...
  multiDexEnabled true // <-- THIS LINE
}
...
...
dependencies {
  ...
  implementation "com.android.support:multidex:1.0.3" // <-- THIS LINE
  ...
}

将这些行放入您的MainApplication.java(android / app / src / main / java /.../ MainApplication.java)中:

package com.your.package;

import android.support.multidex.MultiDex;; // <-- THIS LINE
...
...
public class MainApplication extends MultiDexApplication { ... } // <-- THIS LINE


0

当我使用Android Gradle插件3.4.0切换到Android Studio 3.4时,会发生此问题。与R8编译器一起使用。

Android Gradle插件包括其他预定义的ProGuard规则文件,但建议您使用proguard-android-optimize.txt。更多信息在这里

buildTypes {
    release {
        minifyEnabled true
        proguardFiles getDefaultProguardFile(
          'proguard-android-optimize.txt'),
          // List additional ProGuard rules for the given build type here. By default,
          // Android Studio creates and includes an empty rules file for you (located
          // at the root directory of each module).
          'proguard-rules.pro'
    }
}

0

我遇到了同样的问题,并且通过将fireabseStorage版本更改为与Firebase数据库版本相同的方式解决了此问题

 implementation 'com.google.firebase:firebase-core:16.0.8'
 implementation 'com.google.firebase:firebase-database:16.0.1'
 implementation 'com.google.firebase:firebase-storage:17.0.0'

 implementation 'com.google.firebase:firebase-core:16.0.8'
 implementation 'com.google.firebase:firebase-database:16.0.1'
 implementation 'com.google.firebase:firebase-storage:16.0.1'

0

如果您的版本> 20 minsdkversion,则需要使用最新的Firebase Auth版本,即

实施'com.google.firebase:firebase-auth:18.1.0'

如果您实际上不需要,则无需设置多dex。

当我从Firebase帮助程序中使用16.0.5时遇到了这个问题,但是当我更新到18.1.0时便能够修复它。



-6

在项目根路径中添加google-services.json

dependencies {
compile 'com.android.support:support-v4:25.0.1'
**compile 'com.google.firebase:firebase-ads:9.0.2'**
compile files('libs/StartAppInApp-3.5.0.jar')
compile 'com.android.support:multidex:1.0.1'
  }
apply plugin: 'com.google.gms.google-services'

考虑为您的答案添加一些信息,并且此代码不会对任何人有所帮助
Ashu Kumar
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.