没有找到“com.google.firebase.provider.FirebaseInitProvider”类?
Posted
技术标签:
【中文标题】没有找到“com.google.firebase.provider.FirebaseInitProvider”类?【英文标题】:Didn't find class "com.google.firebase.provider.FirebaseInitProvider"? 【发布时间】:2017-02-11 00:57:57 【问题描述】:我在应用启动时遇到以下异常。
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)
这是应用级别的 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
如何解决这个问题?
【问题讨论】:
***.com/questions/37312103/…的可能重复 我已经尝试了所有这些答案。什么都解决不了 您的清单或 google-services.json 中似乎有问题,请确保它们正确无误。你能发布你的清单文件吗? 您是否进行了 MultiDex:android:name="android.support.multidex.MultiDexApplication"
所需的清单更改?如果 MultiDex 配置正确,您将在应用程序初始化期间看到 logcat 消息,如下所示:I/MultiDex: install done
.
检查即时运行启用如果是,禁用即时运行。
【参考方案1】:
我遇到了同样的错误,我用 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')
...
multidex-config.txt(与build.gradle文件在同一目录下)
com/google/firebase/provider/FirebaseInitProvider.class
【讨论】:
你太棒了 嘿这个异常:原因:java.lang.ClassNotFoundException:找不到类“com.google.firebase.provider.FirebaseInitProvider”与启用multidex无关,其实如果你看到问题 build.gradle multiDexEnabled is enabled! 不是这个错误来自multidex,他只是没有完成所有步骤,因为你看不到他的清单或他的主类。 这行得通。我在我的 gradle 文件中启用了 multidex,但缺少 Android Manifest 部分! 另外,请确保您的Application
类扩展自 MultiDexApplication()
。这在我的情况下丢失了。【参考方案2】:
我也遇到了同样的问题,最后通过在 android studio 中禁用 Instant Run
解决了这个问题。
设置→构建、执行、部署→即时运行并取消选中启用即时运行
更新:
最新的 Android Studio 3.5+ 中没有 Instant Run 选项。它应该只适用于旧版本。
【讨论】:
对我来说也一样。这是问题的原因——不是 multidex 或任何其他答案。 似乎这是 Android Studio 2.3 的问题。禁用即时运行也对我有用,但这不是理想的解决方案:( 我从另一家公司继承了两个项目。对于几个小项目,代码库、清单和 gradle 配置实际上是相同的。一个项目可以正常构建和运行,而另一个则不能。关闭即时运行,它们现在都运行。奇怪的。这是使用 Android Studio。 2.3. 我在使用 AS 3.1 和运行 API 26 的模拟器时遇到了同样的问题。在此之前我还没有遇到 API 19-25 的任何问题。禁用即时运行确实让我运行该应用程序。谢谢。 禁用 Instant Run 并不能解决我的这个问题。【参考方案3】:在 build.gradle(Module:app) 文件中,将以下代码插入到 defaultConfig 中:
defaultConfig
applicationId "com.***.****"
minSdkVersion 15
targetSdkVersion 25
versionCode 1
versionName "1.0"
multiDexEnabled true
并插入到依赖项中:
implementation 'com.android.support:multidex:2.0.1'
然后将代码添加到清单中:
<application
android:name="android.support.multidex.MultiDexApplication"
【讨论】:
我正在尝试,如果可行,我会投票和评论【参考方案4】:我在(YouTube 播放器项目)中遇到了同样的问题...以下解决了我的问题:
将此代码添加到 defaultConfing
内的 build.gradle
(module: app) 中:
defaultConfig
....
....
multiDexEnabled = true
将此代码添加到dependencies
内的build.gradle
(模块:应用程序)中:
dependencies
compile 'com.android.support:multidex:1.0.1'
.....
.....
打开AndroidManifest.xml
和application
内:
<application
android:name="android.support.multidex.MultiDexApplication"
.....
.....
</application>
或者如果您有 App 类,请从 MultiDexApplication 扩展它,例如:
public class MyApp extends MultiDexApplication
.....
最后,我认为您应该在 SDK Manager 的 Extras 中下载 Android Support Repository。
【讨论】:
我做了“MultiDex.install(this);”但它没有用。使用 MultiDexApplication 扩展应用程序类就成功了。【参考方案5】:只需在您的应用程序类中覆盖以下方法。
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
【讨论】:
加一是因为不喜欢 Manifest 中的android:name
内容
最简单最好的答案
如果您使用的是自定义应用程序类,那么这就是答案。其他答案无法解决问题。【参考方案6】:
当您的应用及其引用的库超过 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 ...
Else,如果您的 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 类,请将其更改为扩展 MultiDexApplication(如果可能),如下所示:<application android:name="android.support.multidex.MultiDexApplication" > ... </application>
否则您确实覆盖了 Application 类,但无法更改基类,那么您可以改为覆盖 attachBaseContext() 方法并调用 MultiDex.install(this) 来启用 多索引:public class MyApplication extends MultiDexApplication ...
public class MyApplication extends SomeOtherApplication @Override protected void attachBaseContext(Context base) super.attachBaseContext(base); MultiDex.install(this);
【讨论】:
为什么应用需要扩展MultiDexApplication? MultiDexApplication 是支持库类。它实现 Application 类并覆盖方法名称 attachBaseContext 来完成 MultiDex 注册的工作。如果重写 attachBaseContext 方法,则不需要扩展此类。 这在 2019 年使用 React Native 为我修复了它,但在 MainApplication.java 中缺少 2 个导入:import android.content.Context;
和 import android.support.multidex.MultiDex;
您的回答帮助我让我的应用重新兼容。【参考方案7】:
启用multidex
不是一个好的解决方案,因为multidex
在android 中有其他用法请参阅此答案what is multidex
正如@Shylendra Madda 所说,解决方案是禁用即时运行
设置→构建、执行、部署→即时运行并取消选中启用即时运行
我认为这个问题的原因是启用即时运行时,Android Studio 不会将 firebase
等库放入生成的 apk 以减少项目构建时间,因为 firebase
库和其他库如 maps
others 存在于播放服务中,并且播放服务安装在 android 设备上,因此如果启用即时运行,则无需将它们放入生成的 apk 中以加快构建时间。
所以当你提取 apk 并将其安装在另一台设备上时,你会看到这个异常
【讨论】:
这是完美的解决方案 禁用 Instant Run 并不能解决我的问题。 在 Android Studio 3.5.1 中,Build、Execution、Deployment 部分没有 Instant Run 项。 @Vergiliy 他们将其替换为应用更改,请参阅发布博客文章android-developers.googleblog.com/2019/08/… 了解更多信息,文档developer.android.com/studio/run#apply-changes 了解有关应用更改的更多信息【参考方案8】:在尝试了所有解决方案后,我也遇到了同样的问题,我找到了以下解决方案。
如果您已应用 proguard 规则,请在 ProGuard 规则中添加以下行
-keep class com.google.firebase.provider.FirebaseInitProvider
它解决了我的问题。
【讨论】:
@gunavant patel bro 请告诉我如何添加到 proguard 中 @gunavant patel 我认为这将解决我的问题...您能否将示例代码发布在此行的位置-keep class com.google.firebase.provider.FirebaseInitProvider
@GowthamanM 首先检查您是否在 app/build.gradle 文件中启用了 proguard。如果启用,那么您会在该文件中的 app/proguard-rules.pro 中找到 proguard-rules 文件,添加上面的行。如果您没有启用 proguard,那么它对您没有帮助。
buildTypes release minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
如何启用请告诉我先生
如果你没有启用 proguard 那么问题就不同了。但我会告诉你如何启用它。在发布中添加“minifyEnabled true”,或者如果您想启用调试,则还添加调试类型。【参考方案9】:
1:进入gradle enable multiDexEnabled,在依赖项中添加multidex库。
android
...
defaultConfig
multiDexEnabled true
...
dependencies
// add dependency
implementation 'com.android.support:multidex:1.0.1'
2:进入Manifest文件并写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>
3: 正如您在 Manifest 文件中编写的 android:name=".MyApplication" 内部应用程序。它会给你一个错误,因为你没有创建 MyApplication 类。 Create MyApplication Class 通过“application”类扩展它或者直接点击.MyApplication,一个小红气球出现在语法左侧点击它,你会在菜单中看到(create MyApplication class),点击它并Include下面的方法在那个类里面。
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]
希望它对你有用。
【讨论】:
【参考方案10】:首先在build.gradle(Module:app)中添加以下内容---->
defaultConfig
..
multiDexEnabled true
..
然后在同一个文件中添加以下内容
dependencies
...
compile 'com.android.support:multidex:1.0.1'
...
然后在AndroidManifest.xml中写如下
<application
android:name="android.support.multidex.MultiDexApplication"
.....
.....
</application>
就是这样。一定会成功的
【讨论】:
【参考方案11】:如果您在 App Gradle 中使用 MultiDex,请在您的应用程序类中将 extends application 更改为 extends MultiDexApplication。它将毫无疑问地工作
【讨论】:
【参考方案12】:我遇到了同样的问题,只需添加一段代码即可解决,如果您遇到此问题,则表示您已经完成了使用 Firebase 所需的所有步骤。您只需要创建一个扩展应用程序的类 (public class Application_CrashReport extends Application ) 并将此类添加到 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);
注意:- 不要忘记按照上述步骤操作
【讨论】:
【参考方案13】:这对于进来的人来说有点晚了,但请检查您的 proguard 规则!我在这上面浪费了很多时间。您的 proguard 规则可能会将名称更改为重要的 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.**
【讨论】:
这成功了,启用 multidex 只会浪费时间!【参考方案14】:如前所述,这是multidex
的问题:您应该将实现添加到您的build.gradle
和MainApplication.java
。但是你添加什么真的取决于你是否支持AndroidX。这是解决此问题所需的:
-
如果您支持 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
-
如果您不支持 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
【讨论】:
【参考方案15】:这是由于 MultiDex。
解决步骤:
在gradle->dependencies->(编译'com.android.support:multidex:1.0.1') 在依赖项中添加这个
在您的项目应用程序类中扩展 MultiDexApplication 这样(公共类 MyApplication 扩展 MultiDexApplication)
运行并检查
【讨论】:
【参考方案16】:您应该使用MultiDexApplication
而不是Application
扩展您的Application 类。
【讨论】:
【参考方案17】:当我使用 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'
【讨论】:
【参考方案18】:我遇到了同样的问题,我通过将 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】:如果你有> 20 minsdkversion,你需要使用最新的Firebase Auth版本,即
实现 'com.google.firebase:firebase-auth:18.1.0'
如果您实际上不需要它,则无需设置 multi-dex。
我在使用 Firebase 帮助程序中的 16.0.5 时遇到了这个问题,但在我更新到 18.1.0 后能够修复它。
【讨论】:
【参考方案20】:如果您使用的是 Xamarin.Forms,您可能需要查看 Didn't find class "com.google.firebase.provider.FirebaseInitProvider"?,因为这会捕获 google firebase 启动时出现 dex 错误的问题(目前未解决)。
我在短期内恢复使用不收缩,并计划使用 ProGuard 直到 R8 更稳定。
【讨论】:
【参考方案21】:添加项目根路径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'
【讨论】:
考虑在你的答案中添加一些信息,这段代码对任何人都没有帮助以上是关于没有找到“com.google.firebase.provider.FirebaseInitProvider”类?的主要内容,如果未能解决你的问题,请参考以下文章
未找到 ID 为“com.google.firebase.appdistribution”的插件
Lcom/google/firebase/FirebaseApp 类中没有虚拟方法 zzbqo()Z;或其超类('com.google.firebase.FirebaseApp' 的声明
错误:找不到参数 [com.google.firebase:firebase-bom:29.0.1] 的方法平台()
无法解决:com.google.firebase:firebase-ml-vision:24.1.3;无法解决:com.google.firebase:firebase-core:20.0.2