更新到新的Firebase后,获取异常java.lang.NoClassDefFoundError:com.google.firebase.FirebaseOptions


71

我已经使用this将应用程序更新为新的firebase ,现在,当我编译项目时,出现以下异常。

这是我的日志:

11:57:54.533 27844-27844/com.example.dayshift_2.traveyy E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.dayshift_2.traveyy, PID: 27844
java.lang.NoClassDefFoundError: com.google.firebase.FirebaseOptions
at com.google.firebase.FirebaseApp.zzbu(Unknown Source)
at com.google.firebase.provider.FirebaseInitProvider.onCreate(Unknown Source)
at android.content.ContentProvider.attachInfo(ContentProvider.java:1591)
at android.content.ContentProvider.attachInfo(ContentProvider.java:1562)
at com.google.firebase.provider.FirebaseInitProvider.attachInfo(Unknown Source)
at android.app.ActivityThread.installProvider(ActivityThread.java:4871)
at android.app.ActivityThread.installContentProviders(ActivityThread.java:4466)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4406)
at android.app.ActivityThread.access$1500(ActivityThread.java:139)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1270)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5102)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
at dalvik.system.NativeStart.main(Native Method)

我的Build.gradle:

apply plugin: 'com.android.application'

android {
compileSdkVersion 23
buildToolsVersion "23.0.3"

defaultConfig {
    applicationId "com.example.dayshift_2.traveyy"
    minSdkVersion 15
    targetSdkVersion 23
    versionCode 1
    versionName "1.0"
    multiDexEnabled true
}
buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}
packagingOptions {
    exclude 'META-INF/LICENSE'
    exclude 'META-INF/LICENSE-FIREBASE.txt'
    exclude 'META-INF/NOTICE'
}
}

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

compile 'com.android.support:appcompat-v7:23.3.0'
compile 'com.android.support:design:23.3.0'
compile 'com.facebook.android:facebook-android-sdk:4.+'
compile 'com.google.android.gms:play-services:9.0.0'
compile 'com.google.firebase:firebase-database:9.0.0'
compile 'com.google.firebase:firebase-auth:9.0.0'
compile 'com.android.support:support-v13:23.3.0'
compile 'com.roughike:bottom-bar:1.2.1'
}


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

不知道我从哪里得到这个异常。任何帮助将不胜感激。谢谢


8
您正在测试哪个版本的android?我在KitKat上遇到了同样的问题,但是我的应用在Lollipop /棉花糖上运行良好。另外,请发布代码,否则将很难为您提供帮助。
BKC

嗨,我已经将Google Play服务更新为30,将Google存储库更新为28。我已经在自定义应用程序文件中初始化了Multidex.install(this)。我仍然在kitkat上遇到相同的错误,但在更高版本上可以正常使用。
arkit

1
您是否解决了KitKat设备的问题?
guilherme.minglini

2
@ guilherme.minglini是的,我是在BKC回答之后才做的。我已经在将豆形软糖用于marshmellow的设备上对其进行了测试,并且工作正常。
M.Waqas Pervez

Answers:


141

这对我有用:

  1. 如果尚未安装,请从Android SDK Manager>其他将“ Google Play服务”更新为30版。

Android SDK Manager>其他> Google Play服务

  1. 然后将该行添加compile 'com.android.support:multidex:1.0.1'到您的依存关系中(或者,multiDexEnabled true如果不需要,只需删除)

  2. 将此属性添加到清单中的应用程序标签中:android:name="android.support.multidex.MultiDexApplication"
    如果您已经在Android Manifest中定义了自定义应用程序类,则将其扩展为MultiDexApplication而不是Application

希望能有所帮助!


2
我的项目中已有一个自定义应用程序,用于扩展ORM应用程序类。如何管理android:name =“ android.support.multidex.MultiDexApplication”的需求?您能描述为什么发生此错误吗?
E. Fernandes

1
@EdgarDaSilvaFernandes“ android.support.multidex.MultiDexApplication”所做的全部就是这一行。“ MultiDex.install(this);”
Sanket Berde

7
嗨,我已经将Google Play服务更新为30,将Google存储库更新为28。我已经在自定义应用程序文件中初始化了Multidex.install(this)。我仍然在kitkat上遇到相同的错误,但在更高版本上可以正常使用。
arkit

除了按照上述所有说明进行操作外,我还更新了SDK的24.0.0,不确定是否有所作为。但是现在一切正常。
Ed Manners

3
我有31转。服务,但不能在18个以下的API设备上使用
Sandeep Rana

46

正在使用最新的Google Play服务,但无法正常工作。对我来说,此程序有效:

  1. 更新了我的应用程序类:

    public class App extends Application {
      @Override
      protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        MultiDex.install(this);
     }
    }
    
  2. 更新build.gradle文件:

    defaultConfig {
        ...
        multiDexEnabled true
    }
    
  3. 包含的依赖项:

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

2
是的,我只是忘了将属性android:name =“ android.support.multidex.MultiDexApplication”放置在我的Mianifest
Gennadiy Ryabkin的

App extends Application实际上不应该App extends MultiDexApplication吗?
亚历山大·法伯

22

修复人员非常简单。如果您在项目中同时使用播放器服务和firebase,请确保不要将所有可用的服务都导入google。只需导入您实际需要的API。例如:

 compile 'com.google.firebase:firebase-messaging:9.2.0'
 compile 'com.google.android.gms:play-services:9.2.0'

这样做可以给你noclassdeffounderror

删除播放服务并同步您的项目。如果您有依赖性,例如在应用程序中使用广告或地图,请定义特定的API。喜欢:

compile 'com.google.android.gms:play-services-maps:9.2.0'

注意:Maximum不要尝试使用multiDexEnabled true。这应该是您修复某些问题的最后一步。

希望这会有所帮助。


4
这对我有用。我的应用在Lollipop +上运行良好,但在4.4+上崩溃。
nktsamba '16

1
几乎所有的评论和响应通常都建议启用multidex,在本例中,这表明我仅使用maps是唯一需要的步骤,如本答案所述。
亚历山大·弗拉第尼

效果完美,只需将其从“ com.google.android.gms:play-services:10.0.1”更改为“ com.google.android.gms:play-services-ads:10.0.1”
AlexS

17

Google Play服务的依赖性从下调

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

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

为我解决了这个问题。

请参考下面的堆栈溢出链接以获取更多描述


请注意:在升级到最新的Google Play服务时,
compile 'com.google.android.gms:play-services:9.4.0' 它也解决了此问题。

或者,您可以选择导入所需的某些服务,而不是导入所有的Google Play服务。


1
从8.4.0升级到9.2.0为我修复了该问题(使用com.google.android.gms:play-services-gcm,并且刚刚将播放服务升级到了修订版32,但是该更改本身并不能解决问题,所以我不知道这是否相关)
Ciske Boekelo

13

步骤1:修复multidex

应用类别:

public class StudyNApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        MultiDex.install(this);
    }
 }

成绩档

defaultConfig { 
...
multiDexEnabled true
}

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

步骤2:修正java.lang.NoClassDefFoundError:com.google.firebase.FirebaseOptions

去掉

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

添加两个库:

compile 'com.google.android.gms:play-services-maps:9.4.0'
compile 'com.google.android.gms:play-services-location:9.4.0'

工作正常。


请更新方法到attachBaseContext-它可以正常工作。
AndrewS

5

别忘了

android:name="android.support.multidex.MultiDexApplication"

3

我通过添加此内容并将播放服务的依赖性降低到8.4.0来解决,请编译'com.google.android.gms:play-services:8.4.0'

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

并将以下内容添加到清单中

android:name="android.support.multidex.MultiDexApplication"


0

我想我已经在此答案中找到了解决此问题的方法,请仔细阅读并感谢@Gabriele Mariotti,他写道:

在顶层build.gradle中,您必须添加:

buildscript {
    // ...
    dependencies {
        // ...
        classpath 'com.google.gms:google-services:3.0.0'
    }
}

然后在模块build.gradle中:

apply plugin: 'com.android.application'

android {
  // ...
}

dependencies {
  // ... 

}

// ADD THIS AT THE BOTTOM
apply plugin: 'com.google.gms.google-services'

0
 GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
            .requestIdToken(getString(**R.string.default_web_client_id**))
            .requestEmail()
            .build();

在我同样的情况下,我更改了requestIdToken,它可以工作。


0
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'    
}  

应用插件:'com.google.gms.google-services'


0

尝试解决...

在Gradle文件中

multiDexEnabled是

编译'com.android.support:multidex:1.0.1'

清单文件

应用程序标签添加此行

android:name =“ android.support.multidex.MultiDexApplication”


0

为multidex配置您的应用以解决此问题。

对于minSdkVersion 21或更高版本multiDexEnabled,在模块级build.gradle文件中将其设置为true,如下所示:

android {
  defaultConfig {
    //...
    minSdkVersion 21 
    targetSdkVersion 26
    multiDexEnabled true
   }
  //...
 }

对于minSdkVersion API 20或更低版本

  1. 修改module-level build.gradle和添加multidex库作为依赖项,如下所示:

    android { defaultConfig { ... minSdkVersion 15 targetSdkVersion 26 multiDexEnabled true } //... } dependencies { compile 'com.android.support:multidex:1.0.1' }

  2. 如果您不覆盖Application该类,请按如下所示编辑manifest文件以android:name在应用程序标记中进行设置

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

    2.1.1。如果您确实要覆盖Application扩展类MultiDexApplication

    public class MyApplication extends MultiDexApplication { //... }
    

    2.1.2。或者,如果您确实重写了Application该类但无法更改基类,则可以改写该attachBaseContext()方法并调用MultiDex.install(this)以启用multidex:

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

更多的mdex-gradle

希望这会对遇到同样问题的其他人有所帮助。


0

在执行所有繁忙的解决方案之前,请尝试从Android Studio清理项目重建项目

java.lang. NoClassDefFoundError

当您在项目中更改任何名称时会引发异常,但无法获取您在运行时中所做的更改。


-1

降级您对build.gradle文件的依赖:

从:

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

至:

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

就我而言,这很奏效,希望对您一样。

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.