【问题标题】:Application crashing only on lollipop devices应用程序仅在棒棒糖设备上崩溃
【发布时间】:2017-03-30 11:20:50
【问题描述】:

应用程序在所有操作系统上都可以正常工作,但是当我添加 facebook SDK 时,它会在棒棒糖设备上显示以下错误消息。

compile 'com.facebook.android:facebook-android-sdk:4.20.0'

原因:java.lang.ClassNotFoundException:找不到类 路径上的“retrofit2.Retrofit$Builder”:DexPathList[[zip 文件 “/data/app/com.myapp.app-3/base.apk”,压缩包

java.lang.NoClassDefFoundError:解析失败: Lretrofit2/Retrofit$Builder; 原因:java.lang.ClassNotFoundException:在路径上找不到类“retrofit2.Retrofit$Builder”:DexPathList [[zip 文件 “/data/app/com.myapp.app-3/base.apk”,压缩文件“/data/app/ com.myapp.app-3/split_lib_dependencies_apk.apk",

这是我的 gradle 文件。

compileSdkVersion 25
buildToolsVersion "25.0.0"
defaultConfig {

    applicationId 'com.myapp.app'
    minSdkVersion 21
    targetSdkVersion 23
    versionCode 122
    versionName "1.2.5"
    multiDexEnabled true
    ndk {
        abiFilters "armeabi", "armeabi-v7a", "x86"
    }

configurations.all {
    resolutionStrategy {
    force 'com.squareup.okhttp:okhttp:2.4.0'
    force 'com.squareup.okhttp:okhttp-urlconnection:2.0.0'
    force 'com.squareup.okio:okio:1.11.0'
    force 'com.squareup.okhttp3:okhttp:3.6.0'
        force 'com.squareup.retrofit2:retrofit:2.2.0'
        force 'com.android.support:recyclerview-v7:25.0.0'
        force 'com.android.support:support-v4:25.0.0'
        force 'com.android.support:cardview-v7:25.0.0'
        force 'com.android.support:appcompat-v7:25.0.0'
        force 'com.android.support:design:25.0.0'
        force 'com.android.support:support-annotations:25.0.0'
        force 'com.google.android.gms:play-services-ads:9.0.1'
        force 'com.google.android.gms:play-services-location:9.0.1'
        force 'com.google.android.gms:play-services-auth-base:9.0.1'
        force 'com.google.android.gms:play-services-base:9.0.1'

        }



configurations.all {
    resolutionStrategy {
        failOnVersionConflict()
    }
}       

请指导我这次崩溃的原因是什么,以及为什么它只在棒棒糖设备上崩溃而在棉花糖和牛轧糖上运行良好。

编辑

如果我不使用 facebook sdk,一切似乎都很好,没有崩溃。也许是 Facebook sdk 导致了这个问题,但我不知道为什么

【问题讨论】:

  • 尝试清理和构建项目
  • 我试过了,我也使缓存无效并重新启动项目。没有任何帮助:(
  • @MD :我也试过这个力'com.squareup.retrofit2:retrofit:2.2.0';,但是它无法编译gradle并给出这个错误消息。 Gradle sync failed: A conflict was found between the following modules: - com.squareup.okhttp3:okhttp:3.2.0 - com.squareup.okhttp3:okhttp:3.6.0
  • 发布 proguard-rules 文件
  • @Kirmani88 检查调试 dex 问题@medium.com/google-developers/…

标签: android facebook performance android-layout gradle


【解决方案1】:

你使用了太多的库,所以你的方法已经超过了 64k,所以 您必须为您的项目启用 Multidex

在你的build.gradle里面

     android {
    defaultConfig {
        ...
        minSdkVersion 15 
        targetSdkVersion 25
        multiDexEnabled true
    }
    ...
}

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

AndroidManifest.xml

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

查看This了解更多信息

【讨论】:

  • 感谢您的回答,我已经更新了我的问题。我在 gradle 文件中启用了 multidex。我也在那里使用 NDK。
  • 你是否在依赖项中添加了compile 'com.android.support:multidex:1.0.1'
  • 是的,它就在那里。
  • 我已将最小 SDK 设置为 21
  • 也将你的 multi dex 添加到你的应用程序类中
【解决方案2】:

您将收到 ClassNotFoundException

Java 虚拟机抛出 ClassNotFoundException (JVM) 试图加载一个特定的类并且指定的类不能 可以在类路径中找到。

首先你应该设置Multidex

Android 应用程序 (APK) 文件包含可执行字节码文件 Dalvik Executable (DEX) 文件的形式,其中包含已编译的 用于运行您的应用程序的代码。 Dalvik 可执行文件规范限制 单个 DEX 中可以引用的方法总数 文件为 65,536,包括 Android 框架方法、库方法、 和您自己的代码中的方法。超过这个限制需要 您配置您的应用程序构建过程以生成多个 DEX 文件,称为 multidex 配置。

你应该使用最新版本

    compileSdkVersion 25
    buildToolsVersion '25.0.2'

    defaultConfig {

        applicationId 'com.myapp.app'
        minSdkVersion 21
        targetSdkVersion 25 // Good approach using same version of compileSdkVersion 
        versionCode 122
        versionName "1.2.5"
        multiDexEnabled true
        ndk {
            abiFilters "armeabi", "armeabi-v7a", "x86"
        }

    configurations.all {

        resolutionStrategy {
        force 'com.squareup.okhttp:okhttp:3.7.0'
        force 'com.squareup.okhttp:okhttp-urlconnection:2.7.5'
        force 'com.squareup.okio:okio:1.12.0'
        force 'com.squareup.okhttp3:okhttp:3.7.0'
        force 'com.squareup.retrofit2:retrofit:2.2.0'
        force 'com.android.support:recyclerview-v7:25.2.0'
        force 'com.android.support:support-v4:25.2.0'
        force 'com.android.support:cardview-v7:25.2.0'
        force 'com.android.support:appcompat-v7:25.2.0'
        force 'com.android.support:design:25.2.0'
        force 'com.android.support:support-annotations:25.2.0'
        force 'com.google.android.gms:play-services-ads:10.2.1'
        force 'com.google.android.gms:play-services-location:10.2.1'
        force 'com.google.android.gms:play-services-auth-base:10.2.1'
        force 'com.google.android.gms:play-services-base:10.2.1'

        }

     configurations.all {
     resolutionStrategy {
        failOnVersionConflict()
       }
    }

之后清理-重建-运行。

仅供参考

4.20.0崩溃时可以使用以下版本。

compile 'com.facebook.android:facebook-android-sdk:4.16.0'

【讨论】:

    【解决方案3】:

    在我的情况下,这解决了我的问题 在应用程序类中,您需要

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

    【讨论】:

      【解决方案4】:

      我可以看到的主要问题是您在项目中添加了大量库,从而超出了方法限制。 Android 应用程序有一定的方法限制。为了使您的代码高效,我建议您删除所有不必要的库,例如为什么要同时使用“Retrofit”和“OkHttp”?您可以让他们中的任何一个人完成所有工作。 但是,如果您想使用所有这些库,那么您必须允许您的应用程序“Multidex”使用。 这是允许“Multidex”使用的方法。

      https://developer.android.com/studio/build/multidex.

      但我不建议使用它。因为这会给您的应用程序带来负担,并且需要手机内存中的更多空间 选择权在你!

      【讨论】:

      • 尝试使用最新版本的 Facebook SDK。还有一件事您的“targetSDKVersion”与“compileSDKversion”不同。尝试对两者都使用最新的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多