Подтвердить что ты не робот

Gradle строить медленно на transformClassesWithDexForDebug

Построение моего приложения для Android занимает около 90 секунд ( "быстрый" ), до 3 минут для каждого обновления для моего кода. Это полная трата времени, поскольку это действительно так, и я предполагаю, что решение должно быть в пределах досягаемости. Я попытался изучить проблему и нашел разные сообщения в блогах и ответы SO с предложениями, большинство из которых я пробовал.

  • У меня есть файл gradle.properties с org.gradle.deamon = true
  • Я запускаю на Android Studio с Gradle Prefence для работы в автономном режиме (улучшено, но все еще медленно)
  • Я запускаюсь в командной строке (это быстрее, но все же медленно)
  • В build.gradle, defaultConfig, у меня установлено значение multiDexEnabled равным false
  • В build.gradle, dexOptions, у меня preDexLibraries установлен на false
  • В gradle -wrapper.properties Я беру недавнюю версию Gradle (2.8) (существенные изменения скорости произошли на 2.4)

Процесс, который, кажется, занимает много времени, около 85% от общего времени сборки : app: transformClassesWithDexForDebug

Каков этот процесс на самом деле? Я могу найти людей, у которых есть аварии на нем, но он отлично работает для меня, за исключением того, что это занимает много времени. И мне это нужно, так как на данный момент мне не нужен Dex?

Кроме того, у меня есть 13 зависимостей и 3 зависимости testCompile. Я уже указываю на конкретные игровые пакеты, поэтому я не компилирую вещи, которые мне не нужны. Если я правильно понимаю, Gradle строит все эти библиотеки каждый проект. Если это правильно, есть ли способ пропустить это? Могу ли я самостоятельно их создавать в виде обернутых библиотек и включать их без необходимости их обработки каждый раз? Это может заставить меня потерять определенную гибкость для будущих изменений в зависимостях, но на данный момент я чувствую, что теряю больше часа в день, легко ожидая gradle. Я не уверен, что для меня так много стоит.

Я с нетерпением жду, чтобы узнать, как я могу улучшить процесс сборки. Заранее благодарю вас.

4b9b3361

Ответ 1

Обновление до Android Studio 2.1 и Android Gradle Плагин v2.1.0 в значительной степени устранил эту проблему для меня. После установки обновленной IDE вам также будет предложено обновить ваш плагин Gradle. Вы узнаете, что у вас есть правильная версия, если файл root build.gradle имеет следующую строку:

classpath 'com.android.tools.build:gradle:2.1.0'

ВАЖНО: Помимо обновления, вам также необходимо увеличить объем памяти, выделенной демонам Gradle, до 2048 МБ, чтобы он мог выполнить этот дорогостоящий шаг деинсталляции. Для этого добавьте в корневой файл gradle.properties следующее:

org.gradle.jvmargs = -Xmx2048m

У меня были такие же медленные времена сборки, как и в предыдущем вопросе, но после обновления скорости сборки значительно увеличились. Для получения дополнительной информации см. Примечания к выпуску для Android Gradle Plugin v2.1.0:

http://developer.android.com/tools/revisions/gradle-plugin.html

Ответ 2

Изменить: На этом этапе я рекомендую запустить Android Studio 2.x рядом с вашей установкой 1.5. Вы получаете доступ к мгновенному запуску, что действительно помогает, а также все обновленные инструменты. Если вы остановились на 1.5, прочитайте...

Мне удалось ускорить сборку отладки Android Studio 1.5 с 2 минут до 30 секунд. Это может не работать с выполнением командной строки, но может быть быстрее.

Используя эту конфигурацию, ваша первая сборка IDE занимает столько же времени, но инкрементные сборки быстрее, даже если вы изменяете классы. Вы теряете выигрыш, если вы изменяете прикрепленные библиотеки.

Шаг 1. (Если вам посчастливилось нацелиться на minSdkVersion >= 21, пропустите это.)

@vanomart ответ на наличие отладочного вкуса minSdkVersion >= 21 не является неправильным, но единственной необходимой частью является добавление следующего в модуль module (app) build.gradle и обеспечение целевого dev в то время как отладка на вкладке "Варианты сборки":

android {
    [...]
    productFlavors {
        dev {
            minSdkVersion 21 //The important bit.
        }
        prod {
            minSdkVersion 15 //Example. Set to your real requirement.
        }
    }

Шаг 2. Инкрементные сборки и предварительные dexing libs.

В модуле (приложении) build.gradle установите следующую конфигурацию. Это быстрее для построения IDE, а не для строителей-серверов, которые начинают с нуля каждую сборку.

android {
    [...]
    dexOptions {
        preDexLibraries true
        javaMaxHeapSize "2g" // Use gig increments depending on needs
        incremental true
    }

Источник, выполняющий (частично) обратный "Улучшение производительности сервера сборки": http://tools.android.com/tech-docs/new-build-system/tips#TOC-Improving-Build-Server-performance

Шаг 3. Убедитесь, что вы используете последнюю версию buildToolsVersion в модуле (приложении) build.gradle.

android {
    buildToolsVersion "23.0.2"
    [...]

"... обновить версию инструментов сборки во всех ваших модулях до последней версии (23.0.2). [...] он будет использовать новую более быструю версию dex, которая помогает как мгновенный запуск, так и полная сборка будут немного быстрее".

Источник: http://tools.android.com/tech-docs/instant-run

Шаг 4. Используйте последние инструменты сборки Gradle

В проекте build.gradle, установите его в качестве последнего (в настоящее время 2.0.0-alpha6)

buildscript {
    dependencies {
        classpath 'com.android.tools.build:gradle:2.0.0-alpha6'

Список обновлений: http://tools.android.com/tech-docs/new-build-system

Шаг 5. Используйте последнюю оболочку Gradle. Измените gradle -wrapper.properties, обновите эту строку, чтобы использовать 2.10:

distributionUrl=https\://downloads.gradle.org/distributions/gradle-2.10-all.zip
#Alternative url if the above does not work:
#distributionUrl=https://services.gradle.org/distributions/gradle-2.10-all.zip

В настройках Android Studio убедитесь, что вы выбрали "Использовать по умолчанию Gradle обертку". Я рекомендую перезапустить Android Studio, чтобы перезапустить демон Gradle.

"Во многих случаях Gradle 2.9 намного быстрее, чем Gradle 2.8, когда выполнение инкрементных построений."

Источник: docs.gradle.org/current/release-notes

Ответ 3

Единственное решение, с которым я работал, - отключить мгновенный запуск.

Android Studio → Настройки → Сборка, выполнение, развертывание → Мгновенный запуск → Снимите флажок "Включить мгновенный запуск [...]"

Сборка продолжалась от 2 минут до 40 секунд.

Ответ 4

Я столкнулся с той же проблемой, и мне потребовалось около 10 часов, чтобы, наконец, разрешить ее, поэтому я знаю, что вы чувствуете.

Я много искал в googled, я делал ту же конфигурацию, что и вы, и даже если это немного помогло, компиляция и запуск фактического приложения по-прежнему была болью в заднице (иногда это занимало 2-3 минуты, когда я менял один строка кода, но когда я сделал больше работы, обычно это заняло 8 минут, и мой компьютер был полностью заморожен в течение этого времени).

Но достаточно разговоров, давайте исправить это. Что "app: transformClassesWithDexForDebug" делает, так это то, что он разрешает некоторые зависимости для версий ОС Dalvik (pre-5.0, api 21) и что важно - для этого требуется много времени. Вам это не понадобится для разработки, потому что вы можете протестировать свое приложение нa >= 21, поэтому создайте отдельный вкус продукта для разработки и выпуска. Вот моя конструкция gradle, которая использует ее:

apply plugin: 'com.android.application'

final VERSION_MAJOR = 0
final VERSION_MINOR = 0
final VERSION_PATCH = 0
final VERSION_BUILD = 1

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.1"

    defaultConfig {
        applicationId "com.app"
        minSdkVersion 15
        targetSdkVersion 23
        multiDexEnabled true
        versionName "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}.${VERSION_BUILD}"
        versionCode VERSION_MAJOR * 10000000 + VERSION_MINOR * 100000 + VERSION_PATCH * 1000 + VERSION_BUILD
    }

    dexOptions {
        incremental = true;
        preDexLibraries = false
        javaMaxHeapSize "2g"
    }


    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

    productFlavors {
        dev {
            minSdkVersion 21
            applicationId = "com.app.test"
        }
        prod {
            minSdkVersion 15
            applicationId = "com.app" // you don't need it, but can be useful

        }
    }

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_7
        targetCompatibility JavaVersion.VERSION_1_7
    }
    packagingOptions {
        exclude 'META-INF/DEPENDENCIES.txt'
        exclude 'META-INF/LICENSE.txt'
        exclude 'META-INF/NOTICE.txt'
        exclude 'META-INF/NOTICE'
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/DEPENDENCIES'
        exclude 'META-INF/notice.txt'
        exclude 'META-INF/license.txt'
        exclude 'META-INF/dependencies.txt'
        exclude 'META-INF/LGPL2.1'
        exclude 'META-INF/ASL2.0'
    }
    lintOptions {
        checkReleaseBuilds false
        abortOnError true
    }

}

afterEvaluate {
    tasks.matching {
        it.name.startsWith('dex')
    }.each { dx ->
        if (dx.additionalParameters == null) {
            dx.additionalParameters = ['--multi-dex']
        } else {
            dx.additionalParameters += '--multi-dex'
        }
    }
}

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
   ... 
}

Следующее - убедиться, что вы действительно создаете свое приложение с помощью этого варианта сборки. Нажмите "Просмотр" → "Инструменты Windows" → "Инструменты сборки" и убедитесь, что у вас установлен вариант сборки "devDebug"

Для некоторых людей этого может быть достаточно. Я нашел много нитей здесь, в SO, а также на reddit, который закончился этим вкусом продукта, но это вообще не помогло мне. Что мне помогло - это ускорить выполнение gradle вручную. Поскольку вы уже пытались это сделать, я думаю, что вы на правильном пути, но я бы предложил использовать более новую версию gradle версии 2.9, которая имеет < 40% улучшенная производительность "более 2.8.

Ответ 5

Это похоже на новый механизм Instant Run, представленный в предварительном просмотре Android Studio 2.0, который отвечает за использование всех методов в вашем приложении для создания ветки выполнения для будущего патча кода. Я боюсь, что это очень медленно.

Странно, что эта задача все еще происходит, даже если Instant Run отключен. Я должен понизить "com.android.tools.build: gradle" до 1.3.0, чтобы избежать этой задачи.

Ответ 6

Имеется ли в вашем приложении база данных? Имеет ли БД большой размер?

Если да:

  • удалите базу данных из базы данных (или где бы вы ее сохраняли) и выполните сборку
  • измерять разницу во времени сборки
  • В МОЕМ СЛУЧАЕ: это было драматическое различие от 45 секунд до 15 секунд

Если No:

  • Монитор Gradle консоли во время инкрементных сборок и посмотрите, какая операция занимает больше всего времени.