Как адаптировать Android-приложение для использования Retrofit без multiDex

У меня есть проект Android, который выиграет от использования Retrofit. Он все еще находится на очень ранней стадии, и существует менее дюжины определений функций и классов. Как только я добавляю 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'
}    

person vee_ess    schedule 08.09.2016    source источник


Ответы (2)


Решение:

Удалите зависимость API сервисов Google Play и включайте только определенные зависимости API сервисов Google Play по мере необходимости. Я удалил:

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

Причина:

Файл DEX содержит определения классов и дополнительные данные для вашего приложения, включая его зависимости. Должно быть несколько файлов DEX, если есть> 64K методов, включая методы платформы Android и библиотечные методы.

Совершенно новое приложение начинается с множества методов. Я не знаю, сколько методов включено в платформу Android, но их много, и я уверен, что от тысяч до десятков тысяч. Я не знаю, сколько методов включено в Службы Google Play, но по слухам, более 28 тыс..

Между фреймворком Android и сервисами Google Play, вероятно, нет места более чем для нескольких тысяч методов.

Retrofit — это уровень абстракции, построенный поверх OkHttp. OkHttp охватывает множество вещей, включая SPDY, HTTP/2, шифрование, пул соединений и т. д., и зависит от многих фреймворков Java. Любой фреймворк, который так широко охватывает что-то, будет иметь множество методов. В моей ситуации этого достаточно, чтобы преодолеть барьер в 64 КБ. Наверное, это разумная сумма.

Скомпилируйте только необходимые методы из сервисов Google Play Этот ответ на аналогичную проблему показал, что вы можете импортировать только API, необходимые для сервисов Google Play очень легко в конфигурации Gradle. Дополнительные сведения см. в документации Google.

person vee_ess    schedule 09.09.2016

Хорошо, у меня была такая же проблема. Если вы хотите использовать Retrofit с multiDex и хотите сохранить сервис Google Play в своем проекте, чтобы использовать его API, выполните следующие действия:

1- Держите multiDexEnabled true на своем Gradle

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>

А теперь попробуйте перекомпилировать ваш проект. Я использую версию 8.3.0 службы Google Play и версию 2.1.0 Retrofit и Gson в своем Gradle.

person Bruno Felix    schedule 19.02.2017