我有一个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'
}
答案 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。