没找到"com.google.firebase.provider.FirebaseInitProvider"课程?

WIS*_*SHY 138 android firebase

我在应用程序启动时遇到以下异常.

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) 
Run Code Online (Sandbox Code Playgroud)

这是app level 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'
Run Code Online (Sandbox Code Playgroud)

这是我的应用程序级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
}
Run Code Online (Sandbox Code Playgroud)

如何解决这个问题?

joh*_*nvs 136

我有同样的错误,我使用MultiDex解决了它,如此链接所述:https: //developer.android.com/studio/build/multidex.html


有时仅仅启用MultiDex是不够的.

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

启动期间需要FirebaseInitProvider.

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

build.gradle文件

android {
    buildTypes {
        release {
            multiDexKeepFile file('multidex-config.txt')
            ...
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

com/google/firebase/provider/FirebaseInitProvider.class
Run Code Online (Sandbox Code Playgroud)

  • 嘿这个例外:引起:java.lang.ClassNotFoundException:没有找到类"com.google.firebase.provider.FirebaseInitProvider"**与启用multidex无关,事实上如果你看到问题构建.gradle multiDexEnabled已启用!** (21认同)
  • 没有这个错误来自multidex,他只是没有完成所有的步骤,因为你无法看到他的清单或他的主要类. (3认同)
  • 这很有效.我在gradle文件中启用了multidex,但错过了Android Manifest部分! (3认同)
  • 另外,请确保您的“Application”类扩展自“MultiDexApplication()”。我的案例中缺少这一点。 (3认同)
  • 你太棒了 <3 非常感谢你拯救了我的一天 <3 (2认同)

Shy*_*dda 87

我也面临同样的问题,最后通过Instant Run在android studio中禁用来解决它.

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

  • 我也是.这是问题的原因 - 不是multidex或任何其他答案. (8认同)
  • 似乎这是Android Studio 2.3的一个问题.禁用即时运行也对我有用,但这不是理想的解决方案:( (3认同)
  • 我在AS 3.1和运行API 26的模拟器上遇到了同样的问题.在我没有遇到API 19-25的任何问题之前.禁用即时运行确实让我运行应用程序.谢谢. (3认同)
  • 禁用即时运行并不能解决我的这个问题。 (2认同)

小智 46

在build.gradle(Module:app)文件中,将下面的代码插入defaultConfig:

  defaultConfig {
        applicationId "com.***.****"
minSdkVersion 15
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
        multiDexEnabled true
    }
Run Code Online (Sandbox Code Playgroud)

并插入依赖项:

compile 'com.android.support:multidex:1.0.1'
Run Code Online (Sandbox Code Playgroud)

然后将代码添加到清单:

<application 
    android:name="android.support.multidex.MultiDexApplication"
Run Code Online (Sandbox Code Playgroud)


小智 41

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

  1. 将此代码添加到您的build.gradle(module:app)里面defaultConfing:

    defaultConfig {
        ....
        ....
        multiDexEnabled = true
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 将此代码添加到您的build.gradle(module:app)里面dependencies:

    dependencies {
        compile 'com.android.support:multidex:1.0.1'
        .....
        .....
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 开放式AndroidManifest.xml内部application:

    <application
        android:name="android.support.multidex.MultiDexApplication"
        .....
        .....
    </application>
    
    Run Code Online (Sandbox Code Playgroud)

    或者如果您有App类,请从MultiDexApplication扩展它,如:

    public class MyApp extends MultiDexApplication {
    .....
    
    Run Code Online (Sandbox Code Playgroud)

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


小智 28

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

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 

    }
}
Run Code Online (Sandbox Code Playgroud)


Eda*_*izi 18

启用multidex不是一个好的解决方案因为multidex在android中有另一个用法看到这个答案什么是multidex

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

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

我觉得这个问题的原因是启用了即时来看,Android的工作室不要把库如firebase成生成APK以减少项目建设时间,因为firebase 库和其他库,如maps他人是存在于游戏服务和游戏服务安装在Android设备上所以如果启用即时运行不需要将它们放在生成的apk中,以使构建时间更快.

因此,当您解压缩apk并将其安装在另一台设备上时,您将看到此异常


Sok*_*Pon 18

当您的应用及其引用的库超过65,536种方法时,您会遇到构建错误,表明您的应用已达到Android构建架构的限制

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

如果你的minSdkVersion设置为21或更高,你需要做的就是在你的模块级build.gradle文件中将multiDexEnabled设置为true,如下所示:

android {
    defaultConfig {
        ...
        minSdkVersion 21 
        multiDexEnabled true
    }
    ...   
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

dependencies {
        implementation 'com.android.support:multidex:1.0.3'
}
Run Code Online (Sandbox Code Playgroud)

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

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

    <application
        android:name="android.support.multidex.MultiDexApplication" >
        ...
    </application>
Run Code Online (Sandbox Code Playgroud)
  • 如果您覆盖Application类,请将其更改为扩展MultiDexApplication(如果可能),如下所示:

   public class MyApplication extends MultiDexApplication { ... }
Run Code Online (Sandbox Code Playgroud)
  • 或者,如果您覆盖Application类但无法更改基类,则可以改为覆盖attachBaseContext()方法并调用MultiDex.install(this)以启用multidex:

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

  • MultiDexApplication 是支持库类。它实现了 Application 类并覆盖了一个方法名称 attachBaseContext 来完成 MultiDex 注册的工作。如果覆盖 attachBaseContext 方法,则不需要扩展此类。 (2认同)
  • 您的回答帮助我使我的应用程序恢复兼容。 (2认同)

Gun*_*tel 11

在尝试所有解决方案后,我也遇到了同样的问题,我找到了以下解决方案.

如果您已应用了proguard规则,请在ProGuard规则中添加以下行

-keep class com.google.firebase.provider.FirebaseInitProvider
Run Code Online (Sandbox Code Playgroud)

它解决了我的问题.


Opr*_*day 7

1:转到gradle enable multiDexEnabled并在依赖项中添加multidex库。

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

dependencies {
  // add dependency 
  implementation 'com.android.support:multidex:1.0.1'
}
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

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);
    } 
Run Code Online (Sandbox Code Playgroud)

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

希望它为您工作。


小智 6

如果您在App Gradle中使用MultiDex,则更改扩展应用程序以在您的应用程序类中扩展MultiDexApplication.它将极具挑战性


小智 5

首先将以下内容添加到build.gradle(Module:app)---->中

defaultConfig{
..
multiDexEnabled true
..
}
Run Code Online (Sandbox Code Playgroud)

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

dependencies{
...
compile 'com.android.support:multidex:1.0.1'
...
}
Run Code Online (Sandbox Code Playgroud)

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

<application
    android:name="android.support.multidex.MultiDexApplication"
    .....
    .....
</application>
Run Code Online (Sandbox Code Playgroud)

而已.它肯定会奏效