Ускорить сборку gradle в мультидекс-приложении

В моем приложении есть множество необходимых библиотек, поэтому я был вынужден использовать библиотеку поддержки multidex, и она прекрасно работает. Но где проблема проявляется, так это в скорости сборки градиента. Сборка занимает в среднем 2 минуты, и когда я разрабатываю и тестирую, это довольно раздражает.

Есть ли способ ускорить сборку отладки?


person Tadej Vengust    schedule 11.06.2015    source источник
comment
Купите больше памяти - хотя бы 16 Гб. У меня было 8 гб и после обновления до 16 гб время сборки уменьшилось с 60 до 30 сек.   -  person ivan.panasiuk    schedule 05.02.2016


Ответы (7)


Вы можете ускорить свои разрабатываемые сборки, указав минимальную версию SDK = 21.
Официальная документация включает весь раздел об этом.

Пример (из документации):

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'
}

После добавления вариантов продукта вы можете использовать задачу devDebug (вместо задачи debug по умолчанию) для своих сборок для разработки:
— из командной строки: запустите ./gradlew installDevDebug
— из Android Studio: откройте окно "Варианты сборки" и выберите вариант сборки devDebug.

Конечно, вам следует работать с устройством, чей SDK >= 21.


Есть также решение для тех, кто не хочет использовать ароматизаторы. Как предлагается в этой сути, динамически вычисляйте значение minSdkVersion:

int minSdk = hasProperty('devMinSdk') ? devMinSdk.toInteger() : 14
apply plugin: 'com.android.application'

android {
    ...
    defaultConfig {
        minSdkVersion minSdk
        ...
    }
}

В этом примере мы проверяем, определено ли свойство devMinSdk, и если оно истинно, мы его используем. В противном случае мы по умолчанию 14.

Как мы передаем значение devMinSdk для сборки скрипта? Два варианта:

Использование командной строки:

./gradlew installDebug -PdevMinSdk=21

Использование настроек Android Studio:

Перейдите в Настройки (Настройки в Windows) -> Сборка, выполнение, развертывание -> Компилятор -> поместите -PdevMinSdk=21 в текстовом поле Параметры командной строки.

Параметры компилятора Android Studio

person Alex Lipov    schedule 12.06.2015
comment
Я не могу этого сделать, если я разрабатываю более низкие SDK. - person Tadej Vengust; 12.06.2015
comment
@Tadej Что ты имеешь в виду? Вы вообще не поддерживаете устройства с SDK 21 (то есть ваш max sdk ‹ 21)? - person Alex Lipov; 12.06.2015
comment
Нет, я имею в виду, что использую устройство с более низкой версией Android, поэтому я не могу отлаживать его как SDK 21. - person Tadej Vengust; 12.06.2015
comment
@Tadej Понятно .. Кажется, теперь у тебя есть веская причина для обновления ;) - person Alex Lipov; 12.06.2015
comment
Просто очень серьезно установить минимальный SDK на 21, поскольку он нацелен только на lolipop, который составляет 12% всех устройств Android. - person Hugo Gresse; 12.06.2015
comment
@HugoGresse Внимательно прочитайте, прежде чем голосовать против - вы должны установить минимальный SDK на 21 только для разрабатываемых сборок. В любом случае вам придется протестировать сборку релиза на большом наборе устройств на всех уровнях SDK, которые вы поддерживаете. - person Alex Lipov; 12.06.2015
comment
извините @AlexLipov, может быть, вы можете уточнить, что ваш ответ будет более описательным - person Hugo Gresse; 15.06.2015
comment
@HugoGresse Официальная документация (ссылка на пост) включает все пикантные подробности. Тем не менее, я отредактировал ответ - добавил образец конфигурации. - person Alex Lipov; 15.06.2015
comment
Используйте FlavorDimensions, чтобы вам не пришлось менять существующие вкусы. Прекрасно работает. - person enl8enmentnow; 06.08.2015
comment
Что значит use the devDebug task for your development builds? Как мне использовать его для моих сборок разработки? - person Adam Johns; 01.09.2015
comment
@AdamJohns Отредактировал ответ, дайте мне знать, если он требует каких-либо дополнительных объяснений. - person Alex Lipov; 01.09.2015
comment
Предыдущие компиляции до 21 не работают, кажется, имеют больший приоритет. - person ; 26.04.2016


Android Studio 1.3 (в настоящее время в предварительной версии 3) использует новую сборку система, которая улучшила время сборки Gradle (действительно, примерно в 10-30 раз быстрее).

Дополнительную информацию см. в живом сеансе Google I/O 2015.

person Hugo Gresse    schedule 11.06.2015
comment
Так что ждать пока выйдет стабильная версия? Очень надеюсь, что это поможет и для мультидекс-приложений. - person Tadej Vengust; 11.06.2015
comment
вы также можете попробовать загрузить его, чтобы посмотреть, улучшилось ли время сборки. - person Hugo Gresse; 11.06.2015
comment
Кто-нибудь может подтвердить, что AS1.3P3 на самом деле в 10-30 раз быстрее при построении целей multidex? - person Valerio Santinelli; 17.07.2015
comment
Студия Android, конечно, нет, вам придется использовать плагин Gradle для Android classpath 'com.android.tools.build:gradle:1.3.0-beta4', чтобы попробовать @ValerioSantinelli - person Hugo Gresse; 17.07.2015
comment
@HugoGresse Я попробовал бета-плагин Gradle в своем проекте, и время сборки уменьшилось примерно на 20%. Не так много, но все же что-то. - person Valerio Santinelli; 18.07.2015

Мультидексирование использует больше памяти. По мере того, как вы приближаетесь к максимальному размеру кучи в Java, вы обнаружите, что Java тратит больше времени на сборщик мусора, чем на выполнение какой-либо реальной работы, что может сильно замедлить работу.

Я настоятельно рекомендую увеличить максимальный размер кучи при использовании multidex. Добавьте следующее в закрытие Android в файле build.gradle, чтобы максимальный размер кучи составлял 4 ГБ (уменьшите его, если хотите):

dexOptions {
    javaMaxHeapSize "4g"
}
person Will Calderwood    schedule 30.09.2015
comment
+1, я получаю заметное ускорение даже с MinSdkVersion = 21, увеличивая его до 2g. Также вы хотите увеличить размер кучи Gradle на дополнительные полгигабайта больше, чем этот (в данном случае 2560 м), чтобы (мульти) dex выполнялся в одном и том же процессе. - person Adam P. Goucher; 05.07.2017

Изменение MinSdk на 21 вернуло мне все в норму. Теперь все компилируется как 6s

person Santhej Kallada    schedule 31.03.2016

Это больше не требуется с последней версией Android Studio 3.0.

person N Jay    schedule 08.11.2017

Зайдите в настройки, найдите компилятор, введите «--offline» в параметрах командной строки и затем скомпилируйте.

person Anand Savjani    schedule 11.06.2015
comment
Пробовал, но без разницы - person Tadej Vengust; 11.06.2015
comment
проверено при компиляции независимого модуля параллельно, а затем попробуйте - person Anand Savjani; 11.06.2015
comment
все равно особой разницы нет :( - person Tadej Vengust; 11.06.2015