Могу ли я включить multidex только в отладочной сборке Android?

Уважаемые, я читал во многих сообщениях в блогах, что приложения multidex запускаются медленнее, чем обычные приложения. В моем приложении используется множество библиотек, количество методов которых превышает 64 тыс., поэтому я использую multidex. Но когда я использую proguard в сборке релиза, окончательный apk становится меньше, чем 64k методов.

Итак, мой вопрос: могу ли я включить multidex только в сборке отладки Android, чтобы у меня не было ошибки времени выполнения? и отключить multi dex в релизной сборке, так как мне это не нужно?

Если да, то как?

Если нет, достаточно ли Android умен, чтобы ускорить запуск, поскольку он должен распознавать, что приложение не превышает 64 КБ, даже если это приложение с несколькими индексами?


person Hisham Bakr    schedule 11.05.2016    source источник


Ответы (4)


Да, ты можешь. Когда вы объявляете, что ваши buildTypes включают multidex только для отладки:

buildTypes {
    release {
        multiDexEnabled false
    }
    debug {
        multiDexEnabled true
    }
}
person antonicg    schedule 11.05.2016
comment
Но тогда вам все равно придется (условно, исходя из значения BuildConfig.DEBUG) вызывать MultiDex.install(this) в коде, верно? - person Konrad Morawski; 07.07.2017
comment
@KonradMorawski не нужен для Android 5 и выше, я думаю - person Boy; 25.01.2018
comment
Вы можете опустить multiDexEnabled false вместо release. - person Mygod; 11.02.2018
comment
@Mygod, да, вам не нужно указывать для выпуска, по умолчанию установлено значение false. - person Prakash Nadar; 17.12.2018

Вместо того, чтобы включать multidex только для отладки, вы можете изменить минимальную версию sdk на 21 только для отладки, чтобы gradle мог ускорить dexing с помощью ART:

android {
    productFlavors {
        // Define separate dev and prod product flavors.
        dev {
            // dev utilizes minSDKVersion = 21 to allow the Android gradle plugin
            // to pre-dex each module and produce an APK that can be tested on
            // Android Lollipop without time consuming dex merging processes.
            minSdkVersion 21
        }
        prod {
            // The actual minSdkVersion for the application.
            minSdkVersion 14
        }
    }
          ...
    buildTypes {
        release {
            runProguard true
            proguardFiles getDefaultProguardFile('proguard-android.txt'),
                                                 'proguard-rules.pro'
        }
    }
}
dependencies {
  compile 'com.android.support:multidex:1.0.0'
}

http://developer.android.com/tools/building/multidex.html

person Ariel Carbonaro    schedule 11.05.2016
comment
Это больше не нужно. Последние версии инструментов определяют уровень API подключенного устройства/эмулятора и выполняют необходимый мультидекс. - person Vairavan; 13.11.2018
comment
Вы можете упростить это решение, избавившись от дополнительных вкусов. Вместо этого вы можете изменить параметр minSdkVersion непосредственно в блоке debug, как это сделано в этом ответе. - person Johnson_145; 27.08.2019

предложенные методы больше не нужны, поскольку Android Studio стала достаточно умной. Фактически, теперь он будет выдавать вам предупреждение, когда вы используете minSdkVersion 21 (по-старому), чтобы ускорить время сборки с помощью dex:

Вам больше не нужен режим разработки для включения множественного индексирования во время разработки, и это может меньше нарушать проверки версий API...

В прошлом наша документация рекомендовала создавать вариант продукта для разработчиков с minSdkVersion, равным 21, чтобы включить мультидексирование для значительного ускорения сборки во время разработки. Этот обходной путь больше не нужен, и у него есть некоторые серьезные недостатки, такие как нарушение проверки доступа к API (поскольку истинная версия minSdkVersion больше не известна). В последних версиях IDE и плагина Gradle IDE автоматически передает уровень API подключенное устройство, используемое для развертывания, и если это устройство имеет как минимум API 21, то мультидексинг автоматически включается, а это означает, что вы получаете те же преимущества в скорости, что и вариант продукта для разработчиков, но без недостатков.

person RJFares    schedule 11.12.2017
comment
Привет! Где вы нашли эту цитату? Благодарю вас! - person orospakr; 27.06.2018
comment
@orospakr Я думаю, что это было предупреждающее сообщение от Android Studio в файле сборки, вот откуда я его взял - person RJFares; 28.06.2018
comment
Я думаю, что цель использования multidex только в отладочной сборке заключается в том, что когда приложение превышает ограничение метода в 65 КБ, это будет затронуто только отладочную сборку (если только приложение не очень большое), потому что в выпускной сборке происходит запутывание и сжатие. - person devconsole; 18.03.2019

Да, он даже работает с библиотекой поддержки multidex для версий Android до Lollipop с небольшой хитростью.

Сначала укажите multiDexEnabled для отладочной сборки в build.gradle:

buildTypes {
    ...
    debug {
        ...
        multiDexEnabled true
    }
}

Затем создайте файл AndroidManifest.xml под src/debug.

src/debug/AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          xmlns:tools="http://schemas.android.com/tools">

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

</manifest>

Это должно делать свое дело. Если ваше приложение использует пользовательский класс приложения, вам необходимо создать подкласс вашего класса приложения и указать имя этого подкласса в манифесте.

Подкласс приложения должен выглядеть так:

public class MyDebugApplication extends MyApplication {
    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        MultiDex.install(this);
    }
}
person devconsole    schedule 18.03.2019