2015-12-08 3 views
52

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

  • Я имею gradle.properties файл с org.gradle.deamon = верно
  • Я бегу на Android Studio с Gradle Prefence сделать автономную работу (улучшилось, но все же медленно)
  • Я бегу по команде линия (что быстрее, но по-прежнему медленно)
  • в build.gradle, defaultConfig я multiDexEnabled установлена ​​в ложный
  • в build.gradle, dexOptions, я preDexLibraries набора ложных
  • в Gradle-обертке. свойства Я беру недавний град е версии (2.8) (значительные изменения скорости произошло на 2,4)

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

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

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

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

+6

Какое облегчение знать, что есть кто-то там в точно такой же ситуации, как я сейчас! Вы достигли какого-то прогресса в то же время? Спасибо! – sjkm

+0

Прошло немало времени с тех пор, как я опубликовал это и пробовал каждое предложение, с которым я столкнулся, с разной степенью успеха. Ни один из них не повышал скорость сборки до приемлемого уровня до релиза Android Studio 2.1, как упоминалось в @ markdb314. Несмотря на то, что, возможно, доступно до этого, только после того, как в этой версии ясно, что нужно выполнить дех-шаг. Это значительно снизило время сборки до 20-30 секунд. –

+0

Любопытно, используете ли вы новую структуру привязки данных? – tir38

ответ

9

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

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

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

org.gradle.jvmargs = -Xmx2048m 

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

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

+0

В моем случае org.gradle.jvmargs = -Xmx2048m увеличивает скорость буквально на порядок. – Hong

0

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

Странно, что эта задача все еще имеет место, даже если мгновенный запуск отключен. Мне нужно понизить «com.android.tools.build:gradle» до 1.3.0, чтобы избежать этой задачи.

+0

Даже если я понижаю рейтинг, я все еще вижу выполнение этой задачи. Это не то решение, которое я ищу. Спасибо за предложения, хотя. –

+0

@JustinHammenga Вы понизили его до 1.3.0? Он также присутствует в 1.5.0, но не в 1.3.0. –

5

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

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

Но достаточно разговоров, давайте исправить это. Что «app: transformClassesWithDexForDebug» делает, так это то, что он разрешает некоторые зависимости для версий ОС Dalvik (pre-5.0, api 21) и что важно - для этого требуется много времени.Вам это не понадобится для разработки, потому что вы можете протестировать свое приложение на> = 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') 
    ... 
} 

Следующая вещь, чтобы убедиться, что вы на самом деле строить свое приложение с этим build variant. Нажмите «Просмотр» -> «Инструменты» -> «Инструменты сборки» и убедитесь, что у вас есть вариант сборки, установленный на «devDebug»

Для некоторых людей этого может быть достаточно. Я нашел много нитей здесь, в SO, а также на reddit, который закончился этим вкусом продукта, но это вообще не помогло мне. То, что помогло мне, - это повысить град вручную. Поскольку вы уже пытались это сделать, я думаю, что вы на правильном пути, но я бы предложил использовать новую версию gradle версии 2.9, которая имеет «40% improved performance» более 2,8.

+1

Спасибо, что ответили vanomart. Это кажется действительно многообещающим, однако я пока не получил его работать. Он создает новый вкус devDebug, но он все еще выполняет ту же задачу. Нужно ли мне, что afterEvaluate или compileOptions я вижу в ваших настройках сборки? –

+0

вам не нужны параметры компиляции и afterEvaluate. Я выяснил, что он не работает, когда вы просто загружаете новый град, вам нужно правильно установить его в систему, чтобы все переменные градиента были правильно инициализированы. Также, если вы посмотрите на каталог .gradle в проекте, вы увидите там некоторые кэшированные материалы. Удалите все, что не является 2.9. TBH, мои сборки работают намного быстрее, иногда занимает всего пару секунд, но иногда на 1-2 минуты. – vanomart

29

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

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

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

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

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

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

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

В модуле (app) 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). [...] он будет использовать новую быструю версию декс, которая помогает как мгновенный запуск, так и полная сборка будут немного быстрее."

Источник: 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 студии предпочтений, чтобы иметь "Использовать по умолчанию Gradle обертку" выбран. Я рекомендую перезапустить Android Studio, чтобы убедиться, что демон Gradle перезапущен.

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

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

+0

большое спасибо! моя конструкция градации теперь на 50% быстрее (от 2 мин до 1 мин)! –

+3

Я следил за каждым шагом и правильно настроил все. Это все еще fu *** медленно ... Какое дерьмовое программное обеспечение. Google меня очень огорчает. Любой прогресс в то же время? Но время сборки сократилось с 6 минут до 56 секунд! Так что большое спасибо за вашу большую помощь! – sjkm

+0

Спасибо, Дайсон возвращается. В некоторых случаях мой градиент ускоряется, от 2,5 мин до нескольких секунд. –

0

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

Если да:

  • удалить БД из папки активов (или там, где вы держите его) и сделать сборку
  • измерить разницу во времени сборки
  • в моем случае: это было драматическое разница от 45 сек до 15 сек

Если нет:

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

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

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

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

+0

работал для меня. спасибо – Bolein95

+0

СПАСИБО ВАС ТАК МНОГО >> мгновенный запуск также удаляет любой выход apk, который также был создан в папках. Мне было интересно, почему это произошло – reidisaki

+0

Это также сработало для меня. Время сборки увеличилось с ~ 80 секунд до ~ 12. Угадайте, у них все еще есть какие-то перегибы. – Cognitio