应用程序仅在棒棒糖设备上崩溃

时间:2017-03-30 11:20:51

标签: android facebook performance android-layout gradle

应用程序在所有操作系统上运行正常,但是当我添加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”,zip文件

     

java.lang.NoClassDefFoundError:解析失败:   Lretrofit2 /改造$生成器;                引起:java.lang.ClassNotFoundException:路径上没有找到类“retrofit2.Retrofit $ Builder”:DexPathList [[zip文件]   “/ data / app / com.myapp.app-3 / base.apk”,zip文件“/ 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()
    }
}       

请指导我这次坠机的原因是什么,以及为什么它只会撞上棒棒糖装置并在Marshmallow和Nougat上正常工作。

修改

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

4 个答案:

答案 0 :(得分:5)

您使用的库太多,因此您的方法已经超过了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了解详情

答案 1 :(得分:1)

您正在 ClassNotFoundException

  

Java虚拟机时抛出ClassNotFoundException   (JVM)尝试加载特定的类,而指定的类不能   在类路径中找到。

首先,您应该设置 Multidex

  

Android应用程序(APK)文件包含可执行的字节码文件   Dalvik可执行文件(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()
       }
    }

之后清理 - 重建 - 运行。

<强> FYI

如果 4.20.0 崩溃,您可以使用以下版本。

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

答案 2 :(得分:0)

在我的案例中,这解决了我的问题                在应用程序类中,您需要

String jsonString = "{\"delivery_codes\": [{\"postal_code\": {\"district\": \"Ghaziabad\", \"pin\": 201001, \"pre_paid\": \"Y\", \"cash\": \"Y\", \"pickup\": \"Y\", \"repl\": \"N\", \"cod\": \"Y\", \"is_oda\": \"N\", \"sort_code\": \"GB\", \"state_code\": \"UP\"}}]}";
ObjectMapper mapper = new ObjectMapper();
JsonNode node = mapper.readTree(jsonString);
int pincode = node.at("/delivery_codes/0/postal_code/pin").asInt();

答案 3 :(得分:0)

我可以看到的主要问题是你在项目中添加了很多库,超出了方法限制。 Android应用程序有一定的方法限制。为了使您的代码更有效,我建议您删除所有不必要的库,例如为什么使用&#34; Retrofit&#34;和#34; OkHttp&#34;一起?您可以完成其中任何一项所做的所有工作。 但是如果你想使用所有这些库,那么你必须允许你的应用程序使用&#34; Multidex&#34;用法。 以下是允许&#34; Multidex&#34;的使用。

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

但我不建议使用此功能。因为这会给你的应用带来负担,并且需要在Phone的内存中占用更多空间 选择是你的!