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

时间:2016-10-03 06:20:27

标签: 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) 

这是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'

这是我的应用程序级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
}

如何解决问题?

21 个答案:

答案 0 :(得分:123)

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

仅仅启用MultiDex是不够的。

  

如果主要DEX文件中未提供主要DEX文件中所需的 ,则您的应用程序会因错误 java.lang而崩溃.NoClassDefFoundError 。   

启动时需要

FirebaseInitProvider

因此,您必须根据主要DEX文件的要求手动指定 FirebaseInitProvider

build.gradle文件

com/google/firebase/provider/FirebaseInitProvider.class

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

<div class="modal fade in" id="undelivered-item-modal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" style="display: block;">

答案 1 :(得分:82)

我也面临同样的问题,最后通过在android studio中禁用Instant Run解决了这个问题。

  

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

答案 2 :(得分:43)

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

  defaultConfig {
        applicationId "com.***.****"
minSdkVersion 15
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
        multiDexEnabled true
    }

并插入依赖项:

compile 'com.android.support:multidex:1.0.1'

然后将代码添加到清单:

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

答案 3 :(得分:37)

我在(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 {
    .....
    
  4. 最后,我认为您应该在 SDK Manager 附加功能中下载 Android支持存储库

答案 4 :(得分:21)

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

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 

    }
}

答案 5 :(得分:14)

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

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

  

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

我认为这个问题的原因是当启用即时运行时,Android Studio不会将firebase等库放入生成的apk中以减少项目构建时间,因为firebase库和其他库等由于mapsothers存在于播放服务中,并且播放服务安装在Android设备上,因此如果启用即时运行,则不需要将它们放入生成的apk中以使构建时间更快。

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

答案 6 :(得分:10)

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

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

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

它解决了我的问题。

答案 7 :(得分:10)

  

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

     

To avoid this limitation you have to configure your app for 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);
  }
}

答案 8 :(得分:6)

如果您在App Gradle中使用MultiDex,请在应用程序类中将扩展应用程序更改为扩展MultiDexApplication 。它会顽强地工作

答案 9 :(得分:5)

首先将以下内容添加到build.gradle(Module:app)----&gt;

defaultConfig{
..
multiDexEnabled true
..
}

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

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

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

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

那就是它。它肯定会起作用

答案 10 :(得分:4)

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

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

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

2:转到清单文件并编写android:name =&#34; .MyApplication&#34; (类名(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 =&#34; .MyApplication&#34;在Manifest文件中的内部应用程序。它会给你一个错误,因为你没有创建MyApplication类。创建MyApplication类通过&#34; application&#34;扩展它。 class或者只需单击.MyApplication,在语法单击左侧会出现一个小红色气球,您将在菜单中看到(创建MyApplication类),单击它并包含在该类的Method Inside下面。

    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]

希望它适合你。

答案 11 :(得分:3)

我遇到了同样的问题并解决了只需添加一段代码,如果您遇到此问题意味着您已经完成了使用Firebase所需的所有步骤。您只需要创建一个扩展Application (公共类Application_CrashReport扩展应用程序)的类,并在 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);
}

注意 : - 不要忘记按照上述步骤

答案 12 :(得分:2)

这是由于MultiDex。

要解决的步骤:

  1. 在gradle-&gt;依赖项 - &gt;(compile'c​​om.android.support:multidex:1.0.1') 在依赖项中添加它

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

  3. 运行并检查

答案 13 :(得分:1)

您应该使用MultiDexApplication而不是Application扩展您的Application类。

答案 14 :(得分:1)

对于那些进来的人来说有点晚了,但是请检查您的保镖规则!我为此浪费了很多时间。您的保卫规则可能是将名称更改为重要的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.**

答案 15 :(得分:0)

如前所述,这是multidex的问题:您应将实现添加到build.gradleMainApplication.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

答案 16 :(得分:0)

如果您使用的是Xamarin.Forms,则可能要签出Didn't find class "com.google.firebase.provider.FirebaseInitProvider"?,因为它捕获了启动时google firebase出现dex错误的问题(目前尚未解决)。

我已经恢复到短期不收缩,并计划在R8更稳定之前使用ProGuard。

答案 17 :(得分:0)

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

  

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

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

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

答案 18 :(得分: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'

答案 19 :(得分:0)

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

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

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'
    }
}

答案 20 :(得分:-5)

添加项目根路径 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'