无法获取提供程序com.google.firebase.provider.FirebaseInitProvider

171

我正在测试新的崩溃工具: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 吗? - Ian Barber
1
@IanBarber:哇,我在编辑build.gradle时把它删除了。我的错。 - Macarse
只有 https://dev59.com/2FoU5IYBdhLWcg3wi3SW#38224316 对我有效。 - Jeba Ranganathan
8
尝试在Android Studio中选择Build,然后选择Clean Project - Ujjwal Singh
我通过让我的应用程序类扩展MultiDexApplication来解决这个问题,当app的graddle defaultConfig中multiDexEnabled为true时。 - Hermandroid
尽管我在项目中没有使用 Firebase,但是这个错误仍然出现了。 - Neon Warge
20个回答

163

1.

applicationId添加到应用的build.gradle文件中:

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

然后执行 Clean Project -> Build 或者 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'
    ...
}

清单文件.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);
    }
}

清单文件.xml

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

1
我遇到了相同的错误,但问题已经通过解决方案被修复了。虽然我不知道为什么,但它确实有效。 - FUJI Goro
这个救了我的命。当我试图将 Cordova 应用程序运行到 Android 设备时,出现了错误。 - manosim
1
我也遇到了同样的问题,我的build.gradle文件中有applicationId。在这种情况下我该怎么办? - Maria Mercedes Wyss Alvarez
@Zach 我不这么认为。我是在运行 cordova platform add android 之后添加的。我猜一旦 cordova 更新了,它就会得到修复?另外,我根本没有使用 Firebase。 - manosim
准确的答案,谢谢,对我有用...但是,缺少解释,为什么?你是如何想出来的? - Hugo Allexis Cardona
显示剩余7条评论

94

我在使用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。请参见以下答案:https://dev59.com/mVoU5IYBdhLWcg3wk3p2#40603347 - GregoryK
是的,它也对我起作用了,我总是在onCreate()方法中编写MultiDex.install(this),谢谢伙计。 - dara
在我的情况下,我只是将 compile 'com.android.support:multidex:1.0.1' 更新为最新可用版本。 - Sirop4ik
这应该是被接受的答案。我尝试了所有其他的答案,并且遵循了Google和Firebase的指南,但这是正确的答案,你太棒了! - blueware
谢谢,你是怎么发现的?但我的问题是我的代码行数不超过65000,为什么我要使用multidex,以及为什么我要在sdk>22上工作,而在sdk<22上却无法工作。 - milad salimi
如果您的minSdk为21或更高版本,则不需要执行任何操作,因为文档中已经默认启用了它。然而,我在使用minSdk = 21时仍然遇到了这个问题,有解决方案吗? - Aditya Anand

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"
      ...
      />

希望能够帮到你。


完美地工作了!非常感谢 :) - Shujat Munawar
3
你是怎么知道这些的?谁告诉你的?我在更新到Android Studio 3并安装“调试”应用程序后才开始出现这个问题。但“发布”版本工作得很好。现在,通过你的解决方案,“调试”版本也能正常工作了。我很高兴像你这样的人存在! - Ton
那是完美的答案。 - androidXP
在所有这些答案中,实际上没有一个解释添加multidex到底是如何解决问题的(在面对这样的问题时做出令人困惑的随机操作)。 - Aditya Anand

37

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

  • 在Android Studio中: Build > Clean Project
  • 在其他IDE中: Clean, Rebuild或其他任何操作...
  • 删除构建目录和可能的其他缓存或中间构建文件。

4
如果你仍然遇到问题,删除构建目录并再试一次。在我这样做之前,我也遇到了困难 :) - Laurence Moroney
只有删除 build 目录对我起了作用。看起来是由于我从仓库上最后一次拉取时出了问题。 - Sevastyan Savanyuk
删除构建目录是我唯一的解决方案。 - AhmadWabbi

18

在早期的安卓系统版本中,我也遇到了同样的问题。为了解决这个问题,我采取了以下措施。同时,我在项目中使用了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
为了启用MultiDex,您不需要执行所有三个任务(扩展MultiDexApplication、实现attacheBaseContext以及更改menifest文件),其中一个就足够了:D。https://developer.android.com/studio/build/multidex.html - Hossein Shahdoost
如果您的minSdk为21或更高版本,则不需要执行任何操作,因为文档中已经默认启用了它。然而,我在minSdk = 21的情况下遇到了这个问题,有什么解决方法吗? - Aditya Anand

15

你应该确认

在你的清单文件中添加这行代码

https://developer.android.com/studio/run/index.html#instant-run

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

对我也有用,同时启用 multiDexEnabled 为 true。 - ashishdhiman2007

7
不要包含整个Play服务库,而是只使用您需要的那一个。将以下行替换为您的build.gradle文件中的相应依赖项:
compile 'com.google.android.gms:play-services:9.6.1'

使用适当的Google Play Services APIs,例如:

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

This should works:

Step1:

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

Step 2:
第二步:
compile 'com.android.support:multidex:1.0.1'

步骤三:学习另一门课程。
public class MyApplication extends MultiDexApplication {
}

步骤四:在清单文件中添加以下行:

Step 4: 在清单文件中添加这一行

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

2
在我的情况下,通过将以下行添加到模块build.gradle文件中解决了问题:

// 在底部添加此行

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

Source


我收到了“找不到ID为'com.google.gms.play-services'的插件”的错误信息。 - kaleemsagard
@kaleemsagard 将以下代码添加到你的项目 build.gradle 文件中:dependencies { classpath 'com.google.gms:google-services:3.0.0' } - Borja

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