如何让Android App在没有multiDex的情况下使用Retrofit

时间:2016-09-08 21:24:22

标签: retrofit2 multidex

我有一个Android项目,可以从使用Retrofit中受益。它还处于非常早期的阶段,并且只有不到12个函数和类定义。一旦我将Retrofit添加到Gradle,我就会有一个DexIndexOverflowException。

将multiDex添加到项目中似乎为时尚早,特别是因为它似乎是由添加一个依赖项触发的。当然,我必须做错事,因为基本的例子似乎不需要multiDex。我应该做些什么?

apply plugin: 'com.android.application'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.3"

    defaultConfig {
        applicationId "com.mydomain.myapp"
        minSdkVersion 15
        targetSdkVersion 23
        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.0.0-beta1'
    compile 'com.android.support:support-v4:24.0.0-beta1'
    compile 'com.google.android.gms:play-services:9.0.0'
    compile 'com.squareup.retrofit2:retrofit:2.1.0'
    //compile 'com.squareup.retrofit2:converter-gson:2.1.0'
    //compile 'com.android.support:multidex:1.0.0'
}    

2 个答案:

答案 0 :(得分:0)

解决方案:

删除Google Play Services API依赖关系,并根据需要仅包含特定的Google Play Services API依赖关系。我删除了:

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

原因:

DEX文件包含应用程序的类定义和附件数据,包括其依赖项。如果有>则需要有多个DEX文件。 64K方法,包括Android框架方法和库方法。

一个全新的应用程序从很多方法开始。 我不知道Android框架中包含了多少方法,但它确实很多,而且我确定它有数千到数万。 我不知道Google Play服务中包含多少种方法,但rumor has it to be over 28k

在Android框架和Google Play服务之间,可能还有超过几千种方法的空间。

Retrofit是一个建立在OkHttp之上的抽象层。 OkHttp涵盖了许多内容,包括SPDY,HTTP / 2,加密,连接池等,并且依赖于许多Java框架。任何涵盖范围如此广泛的框架都会有很多方法。在我的情况下,它足以超越64K的障碍。这可能是一个合理的数额。

仅将必要的方法从Google Play服务 This answer编译为类似问题,这表明您可以在Gradle配置中轻松导入Google Play服务所需的API。有关详细信息,请参阅Google's documentation

答案 1 :(得分:-1)

好的,我遇到了同样的问题。如果您想将Retrofit与multiDex一起使用,并且希望在项目中保留Google Play服务以使用其API,请按照以下步骤操作:

1-在您的Gradle上保留multiDexEnabled true

2-在Gradle中添加此依赖项

compile 'com.android.support:multidex:1.0.1'

3-创建此类:

import android.app.Application;
import android.content.Context;
import android.support.multidex.MultiDex;

public class MultiDexApplication extends Application {

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

4-在AndroidManifest.xml上添加:

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

现在,尝试重新编译您的项目。我使用的是Google Play服务版本8.3.0,以及我Gradle中的Retrofit和Gson版本2.1.0。