我在应用启动时遇到以下异常。
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
}
如何解决问题?
答案 0 :(得分:123)
我遇到了同样的错误,我使用MultiDex解决了它,就像在这个链接上描述的那样: 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播放器项目)中遇到了同样的问题......以下问题解决了我的问题:
将此代码添加到build.gradle
内的defaultConfing
(模块:应用)中:
defaultConfig {
....
....
multiDexEnabled = true
}
将此代码添加到build.gradle
内的dependencies
(模块:应用)中:
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 的附加功能中下载 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
库和其他库等由于maps
和others存在于播放服务中,并且播放服务安装在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。
要解决的步骤:
在gradle-&gt;依赖项 - &gt;(compile'com.android.support:multidex:1.0.1') 在依赖项中添加它
在您的项目中,应用程序类扩展了MultiDexApplication(公共类MyApplication扩展MultiDexApplication)
运行并检查
答案 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.gradle
和MainApplication.java
中。但是,添加的内容实际上取决于您是否支持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
将这些代码行放入您的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'