无法获得提供商com.google.firebase.provider.FirebaseInitProvider


160

我正在测试新的崩溃工具:https : //firebase.google.com/docs/crash/

完成这些步骤后,该应用程序将启动并崩溃,提示:

05-18 17:28:18.870 28743 28743 E AndroidRuntime: java.lang.RuntimeException: Unable to get provider com.google.firebase.provider.FirebaseInitProvider: java.lang.IllegalStateException: Incorrect provider authority in manifest. Most likely due to a missing applicationId variable in application's build.gradle.
05-18 17:28:18.870 28743 28743 E AndroidRuntime:    at android.app.ActivityThread.installProvider(ActivityThread.java:5156)
05-18 17:28:18.870 28743 28743 E AndroidRuntime:    at android.app.ActivityThread.installContentProviders(ActivityThread.java:4748)
05-18 17:28:18.870 28743 28743 E AndroidRuntime:    at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4688)
05-18 17:28:18.870 28743 28743 E AndroidRuntime:    at android.app.ActivityThread.-wrap1(ActivityThread.java)
05-18 17:28:18.870 28743 28743 E AndroidRuntime:    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1405)
05-18 17:28:18.870 28743 28743 E AndroidRuntime:    at android.os.Handler.dispatchMessage(Handler.java:102)
05-18 17:28:18.870 28743 28743 E AndroidRuntime:    at android.os.Looper.loop(Looper.java:148)
05-18 17:28:18.870 28743 28743 E AndroidRuntime:    at android.app.ActivityThread.main(ActivityThread.java:5417)
05-18 17:28:18.870 28743 28743 E AndroidRuntime:    at java.lang.reflect.Method.invoke(Native Method)
05-18 17:28:18.870 28743 28743 E AndroidRuntime:    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
05-18 17:28:18.870 28743 28743 E AndroidRuntime:    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
05-18 17:28:18.870 28743 28743 E AndroidRuntime: Caused by: java.lang.IllegalStateException: Incorrect provider authority in manifest. Most likely due to a missing applicationId variable in application's build.gradle.
05-18 17:28:18.870 28743 28743 E AndroidRuntime:    at com.google.firebase.provider.FirebaseInitProvider.zza(Unknown Source)
05-18 17:28:18.870 28743 28743 E AndroidRuntime:    at com.google.firebase.provider.FirebaseInitProvider.attachInfo(Unknown Source)
05-18 17:28:18.870 28743 28743 E AndroidRuntime:    at android.app.ActivityThread.installProvider(ActivityThread.java:5153)
05-18 17:28:18.870 28743 28743 E AndroidRuntime:    ... 10 more

1
您的build.gradle中有一个applicationID吗?
伊恩·巴伯

1
@IanBarber:哇,在编辑build.gradle时,我将其删除了。我的错。
Macarse '16


8
尝试Android studio> Build>Clean Project
Ujjwal辛格

我通过在应用程序的gradle defaultConfig中将multiDexEnabled为true时,使我的应用程序类扩展MultiDexApplication来解决此问题。
赫尔曼

Answers:


145

1。

applicationId添加到应用程序的build.gradle中:

android {
    ...
    defaultConfig {
        applicationId "com.example.my.app"
        ...
    }
}

而且比Clean Project-> Build or Rebuild Project


2.如果您的minSdkVersion <= 20(https://developer.android.com/studio/build/multidex

正确使用Multidex。

应用程序的build.gradle

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

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

manifest.xml

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

3。

如果您使用自定义Application类

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

manifest.xml

<application
    ...
    android:name="com.example.my.app.MyApplication" >
    ...

1
我遇到了同样的错误,该错误已由解决方案解决。我不知道为什么,但是可以。
富士五郎

这为我节省了一天。我尝试在Android设备上运行Cordova应用程序时出错。
manosim '16

1
我在build.gradle上遇到了相同的问题和applicationId。在这种情况下我该怎么办?
玛丽亚·梅赛德斯·怀斯·阿尔瓦雷斯

@ekonstantinidis您如何为您的cordova应用程序进行修复?可以在生成build.gradle时将其添加到可以正确添加的配置中吗?(期间cordova platform add android)?
扎克

@Zach我不这么认为。我跑步后加了它cordova platform add android。我想一旦科尔多瓦得到更新,它将得到修复?附言 我根本不使用Firebase。
manosim '16

93

我在SDK <22的设备中遇到了同样的问题,但是对我来说,原因是MultiDex,MultiDex.install必须在attachBaseContext方法中。

如果您使用的是MultiDex,请尝试以下操作:

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 

    }
}

app / build.gradle:

android {

    compileSdkVersion 24
    buildToolsVersion "24.0.2"

    defaultConfig {
        applicationId "com.test.app"
        minSdkVersion 16
        targetSdkVersion 24
        versionCode 1
        versionName "1.0"
        multiDexEnabled true

    }

    dexOptions {
        javaMaxHeapSize "4g"
    }

....
}

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

        compile 'com.android.support:appcompat-v7:24.2.1'
        ...
        compile 'com.google.firebase:firebase-messaging:9.6.1'
        compile 'com.google.android.gms:play-services:9.6.1'
        compile 'com.android.support:multidex:1.0.1'

    }
...

4
它的工作原理,但有一类特殊的要做到这一点,而不是覆盖一个功能,它被称为MultiDexApplication,见下面的答案stackoverflow.com/questions/37312103/...
GregoryK

是的,它也为我工作,我总是在onCreate()方法中编写MultiDex.install(this),谢谢dude
dara

就我而言,我只是将编译'com.android.support:multidex:1.0.1'更新为最新可用版本
Aleksey Timoshchenko,

这应该是公认的答案。我尝试了所有其他答案,并遵循了Google和Firebase指南,但这是正确的方法,您真是太好了!
blueware

谢谢,如何找到它?但我的问题是我的代码行应用程序不高于65000,为什么我应该使用它multudex以及为什么我在sdk> 22上工作并且为什么我在sdk <22上不工作?
milad salimi

75

接受的答案不能解决我的问题。

如果您使用Multidex,则您的应用程序应该扩展MultiDexApplication而不是Application

MyApplication.java

public class MyApplication extends MultiDexApplication{
     ...
}

AndroidManifest.xml

<application
      android:name="your.package.name.MyApplication"
      android:allowBackup="true"
      android:icon="@mipmap/ic_launcher"
      ...
      />

希望能帮助到你。


工作完美!非常感谢:)
解决方案精神

3
你怎么知道这些东西?谁告诉你???更新到Android Studio 3并安装“调试”应用程序后,我才开始遇到此问题。“发行”版本运行良好。现在,您的解决方案也可以使用“调试”版本。我很高兴像你这样的人存在!

那是完美的答案
androidXP '18

在所有这些答案中,没有人真正说明添加multidex实际能解决问题的方法(面对这样的问题,这是一件非常棘手的事情)
Aditya Anand

36

如果您遇到相同的问题,但已经applicationId设置了build.gradle,则也可以尝试以下操作:

  • 在Android Studio中:Build>Clean Project
  • 在其他IDE中:清理,重建等

3
如果仍然有问题,请删除构建目录,然后重试。我被困住了,直到我这样做:)
劳伦斯·莫洛尼

只有删除build目录对我有用。好像是由于我从回购交易中获得的最后一笔收益而搞砸了。
Sevastyan Savanyuk

17

我在Pre Lollipop装置中遇到了同样的问题。为了解决这个问题,我做了如下。同时,我在项目中使用multiDex。

1.在模块:app中为build.gradle添加它

multiDexEnabled = true

dexOptions {
    javaMaxHeapSize "4g"
}

2.增加这种依赖性

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

3.然后在MainApplication中

public class MainApplication extends MultiDexApplication {

private static MainApplication mainApplication;

@Override
public void onCreate() {
    super.onCreate();
    mainApplication = this;
}

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


public static synchronized MainApplication getInstance() {
    return mainApplication;
}
}

4,清单文件中

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

这对我有用。希望这也对您有帮助:)


4
您不应该做所有三个工作(扩展MultiDexApplication,实现attacheBaseContext并更改清单文件),以便仅启用一项就足以启用multidex:D。developer.android.com/studio/build/multidex.html
侯赛因·沙杜斯特

如果您的minSdk为21或更高,则无需执行任何操作,因为文档说默认情况下已启用它。但是,minSdk = 21时,这个问题对我来说正要解决,对此有什么解决方案吗?
Aditya Anand


7

不要包括整个播放服务库,而是使用所需的库,将其替换为build.gradle

compile 'com.google.android.gms:play-services:9.6.1'

并使用Google Play服务API中的相应API,例如:

compile 'com.google.android.gms:play-services-gcm:9.6.1'

7

将此添加到您的模块级build.gradle:

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

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

如果您覆盖Application类,则将其从扩展MultiDexApplication

YourApplicationClass extends MultiDexApplication

如果您不能从MultiDexApplication类扩展它,则重写attachBaseContext()方法如下:

protected void attachBaseContext(Context base) {
     super.attachBaseContext(context);
     Multidex.install(this);
  }

并且不要运行任何东西 MultiDex.install(this)执行。

如果您不重写Application该类,则只需按以下步骤编辑清单文件:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    .......>
     <application
         ......
            android:name="android.support.multidex.MultiDexApplication" >
        ...
    </application>
    ......
</manifest>

3

这应该工作:

第1步:

defaultConfig {
    applicationId "service.ingreens.com.gpsautoon"
    minSdkVersion 17
    targetSdkVersion 25
    versionCode 1
    versionName "1.0"
    multiDexEnabled true
    testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}

第2步:

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

步骤3:参加其他课程

public class MyApplication extends MultiDexApplication {
}

步骤4:在清单上添加此行

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

2

就我而言,通过将以下行添加到模块build.gradle中,解决了该问题:

//在底部添加此内容

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

资源


我收到“找不到ID为'com.google.gms.play-services'的插件”。
kaleemsagard '16

@kaleemsagard将此放在您的项目中build.gradle dependencies { classpath 'com.google.gms:google-services:3.0.0' }
Borja

1

就我而言,问题是在我们迁移到AndroidX之后发生的。由于某种原因,应用程序通过反射调用MultiDex.install():

    final Class<?> clazz = Class.forName("android.support.multidex.MultiDex");
    final Method method = clazz.getDeclaredMethod("install", Context.class);
    method.invoke(null, this);

我将包从更改android.support.multidex.MultiDexandroidx.multidex.MultiDex。有效。


0

而不是在软件包上手动添加软件包名称 build.gradle,您可以通过以下方式进行操作:

首先在开始时添加此行

import java.util.regex.Pattern

然后将其添加到defaultConfig

android {
    ...
    defaultConfig {
        ...
        applicationId = doExtractStringFromManifest("package")
        ...
    }
    ...
}

最后添加doExtractStringFromManifest方法

def doExtractStringFromManifest(name) {
     def manifestFile = file(android.sourceSets.main.manifest.srcFile)
     def pattern = Pattern.compile(name + "=\"(\\S+)\"")
     def matcher = pattern.matcher(manifestFile.getText())
     matcher.find()
     return matcher.group(1)
}

由于科尔多瓦对此答案有很多评论,如果您正在使用科尔多瓦,则不应该build.gradle自己编辑自己,它在开始时会说一句话

//生成的文件!不要编辑!

因此,如果您使用的是Cordova,最好的办法是将已存在此更改的地方更新到cordova-android 5.1.0或更高版本。


0

我的原因是因为Gradle文件中的Firebase SDK设置为错误的数字版本。

我从Gradle中删除了Firebase Deb,然后使用重新安装 Firebase Assistant


0

转到android studio设置(通过Ctrl+Alt+S在Windows中按),搜索Instant Run并取消选中Enable Instant Run

通过禁用Instant Run并再次运行您的应用程序,问题将得到解决。


0

对于React Native应用,错误是 java.lang.RuntimeException: Unable to get provider com.google.firebase.provider.FirebaseInitProvider: java.lang.ClassNotFoundException: Didn't find class "com.google.firebase.provider.FirebaseInitProvider" 仅适用于Android版本<〜4.4的设备

只需替换Application为即可MainApplication.java解决MultiDexApplication

注意: import android.support.multidex.MultiDexApplication;




0

我仅在API低于21的设备上遇到此错误。就我而言,我不得不处理一个将multiDexEnabledoption in build.gradle设置为的项目true。我从APK检查了dex文件,并且引用的方法号小于64k,因此项目不必是multidex项,因此我将其设置multiDexEnabledfalse。这个解决方案对我有用。

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.