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

我正在测试新的 Crash 工具: 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
134257 次浏览

1.

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

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

而不是 清洁工程-> 建造重建计划


2. If your minSdkVersion < = 20(https://developer.android.com/studio/build/multidex)

正确使用 Multidex。

应用程序已经建好了

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

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

  • 在 Android 工作室: Build > Clean Project
  • 在其他 IDE: 清洁,重建,无论..。
  • 删除生成目录以及可能的其他缓存或中间生成文件

不需要在 build.gradle上手动添加软件包名称,您可以这样做:

首先在开始处加上这一行

import java.util.regex.Pattern

然后将其添加到 defaultConfig 中

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

最后,添加 doExtratStringFromManifest 方法

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

由于有很多 Cordova 评论的答案,如果你正在与 Cordova 工作,你不应该真正编辑的 build.gradle自己,它有一个评论在开头说

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

因此,如果你正在使用 Cordova,你能做的最好的事情就是升级到 Cordova-android 5.1.0或更高版本,这些更改已经存在了。

在我的例子中,通过向 build.gradle 模块添加以下代码行解决了这个问题:

//在底部加上这个

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

来源

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


}
...

不要包含整个播放服务库,但使用您需要的那个。替换 建造,分级中的行:

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

Google Play Services API中选择合适的,比如:

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

接受的答案并没有解决我的问题。

如果使用 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"
...
/>

希望能有帮助。

你应该确定

将此行添加到您的清单中

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>

将此添加到模块级 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>

这应该会奏效:

第一步:

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

第二步:

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

第三步: 参加另一门课程

public class MyApplication extends MultiDexApplication {
}

步骤4: 在清单中添加这一行

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

我在 Pre 棒棒糖设备上也遇到过同样的问题。为了解决这个问题,我这样做了。与此同时,我在项目中使用 multiDex。

1. 将 build.gradle 添加到 module: app 中

multiDexEnabled = true


dexOptions {
javaMaxHeapSize "4g"
}

2. 添加这个依赖项

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

3. 然后在主应用程序中

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"

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

我的原因是 Gradle 文件中的 Firebase SDK 被设置成了错误的版本号。

我从 Gradle 删除了 Firebase 的债券,并使用 Firebase Assistant重新安装了它们

进入 android 工作室设置(在窗口中按 Ctrl+Alt+S) ,搜索 Instant Run并取消选中 Enable Instant Run

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

对于本机应用程序,错误是 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 Version < ~ 4.4的设备

MultiDexApplication代替 MainApplication.java中的 Application就解决了这个问题

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

在我的例子中,问题发生在我们迁移到 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.MultiDex改成了 androidx.multidex.MultiDex成功了。

我在前卫文件中添加了以下代码。

-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application

而且在我的案子里起作用了。

在我的情况下,我忘记添加(或删除意外)防火基地核心在建设梯度

implementation 'com.google.firebase:firebase-core:xx.x.x'

我在 API 低于21的设备上得到了这个错误。在我的情况下,我不得不与一个项目,其中 build.gradle中的 multiDexEnabled选项已经设置为 true。我从 APK 中检查了 dex 文件,引用的方法数小于64k,所以项目不需要是多指标的,因此我将 multiDexEnabled设置为 false。这个办法对我很有效。

我有同样的问题,并通过使用项目级崩溃级别2.1.1版修复

classpath 'com.google.firebase:firebase-crashlytics-gradle:2.1.1'

如果您启用“ multidex”,那么问题将得到解决,但这个问题完全是关于 Android 工作室缓存的。因此,在添加“ multidex”之前,清除缓存希望这个问题将得到解决。

在清除缓存后删除 .gradle.idea.build文件。

Android studio > File > Invalidate Caches / Restart

enter image description here