Почему Gradle создает мой модуль в режиме Release, когда приложение находится в Debug

Я создаю новый проект для Android, со стандартным модулем 'app' , а также проект библиотеки (назовем его 'custom_lib' ). В файле build.gradle app я связываю модуль как таковой:

 dependencies { compile project(':custom_lib') } 

Когда я запускаю процесс сборки (Menu Build > Make Project ), я получаю следующий вывод в консоли Gradle

 Executing tasks: [clean, :app:compileDebugSources, :custom_lib:compileDebugSources] Configuration on demand is an incubating feature. :app:clean :custom_lib:clean :app:preBuild :app:preDebugBuild :app:checkDebugManifest :app:preReleaseBuild :custom_lib:compileLint :custom_lib:copyReleaseLint UP-TO-DATE :custom_lib:mergeReleaseProguardFiles UP-TO-DATE :custom_lib:preBuild :custom_lib:preReleaseBuild :custom_lib:checkReleaseManifest :custom_lib:prepareReleaseDependencies :custom_lib:compileReleaseAidl :custom_lib:compileReleaseRenderscript :custom_lib:generateReleaseBuildConfig :custom_lib:generateReleaseAssets UP-TO-DATE :custom_lib:mergeReleaseAssets :custom_lib:generateReleaseResValues UP-TO-DATE :custom_lib:generateReleaseResources :custom_lib:packageReleaseResources :custom_lib:processReleaseManifest :custom_lib:processReleaseResources :custom_lib:generateReleaseSources :custom_lib:compileReleaseJava :custom_lib:processReleaseJavaRes UP-TO-DATE :custom_lib:packageReleaseJar :custom_lib:compileReleaseNdk :custom_lib:packageReleaseJniLibs UP-TO-DATE :custom_lib:packageReleaseLocalJar UP-TO-DATE :custom_lib:packageReleaseRenderscript UP-TO-DATE :custom_lib:bundleRelease :app:prepareComAndroidSupportAppcompatV72102Library :app:prepareComAndroidSupportSupportV42102Library :app:prepareTestDoubleBuildCustom_libUnspecifiedLibrary :app:prepareDebugDependencies :app:compileDebugAidl :app:compileDebugRenderscript :app:generateDebugBuildConfig :app:generateDebugAssets UP-TO-DATE :app:mergeDebugAssets :app:generateDebugResValues UP-TO-DATE :app:generateDebugResources :app:mergeDebugResources :app:processDebugManifest :app:processDebugResources :app:generateDebugSources :app:compileDebugJava :app:compileDebugNdk :app:compileDebugSources :custom_lib:preDebugBuild :custom_lib:checkDebugManifest :custom_lib:prepareDebugDependencies :custom_lib:compileDebugAidl :custom_lib:compileDebugRenderscript :custom_lib:generateDebugBuildConfig :custom_lib:generateDebugAssets UP-TO-DATE :custom_lib:mergeDebugAssets :custom_lib:generateDebugResValues UP-TO-DATE :custom_lib:generateDebugResources :custom_lib:packageDebugResources :custom_lib:processDebugManifest :custom_lib:processDebugResources :custom_lib:generateDebugSources :custom_lib:compileDebugJava :custom_lib:compileDebugNdk :custom_lib:compileDebugSources BUILD SUCCESSFUL Total time: 2.184 secs 

Меня озадачивает то, что механизм сборки запускает сборку Debug (как говорит первая строка), но почти сразу Gradle использует задачу :app:preReleaseBuild которые делают мой модуль custom_lib для построения с конфигурацией Release.

И затем, после того, как приложение полностью построено, Gradle компилирует мой модуль с конфигурацией Debug.

Поэтому мои вопросы:

  • Почему он делает эту двойную сборку, которая кажется бессвязной?
  • Как я могу убедиться, что библиотека построена с конфигурацией отладки при запуске процесса сборки Debug?

РЕДАКТИРОВАТЬ :

app / build.gradle:

 apply plugin: 'com.android.application' android { compileSdkVersion 21 buildToolsVersion "21.1.1" defaultConfig { applicationId "com.deezer.testdoublebuild" minSdkVersion 8 targetSdkVersion 21 versionCode 1 versionName "1.0" } compileOptions { sourceCompatibility JavaVersion.VERSION_1_7 targetCompatibility JavaVersion.VERSION_1_7 } buildTypes { debug{ debuggable true } release { debuggable false minifyEnabled false } } } dependencies { compile project(':custom_lib') } 

custom_lib / build.gradle:

 apply plugin: 'com.android.library' android { compileSdkVersion 21 buildToolsVersion "21.1.1" defaultConfig { applicationId "com.deezer.mylibrary" minSdkVersion 8 targetSdkVersion 21 versionCode 1 versionName "1.0" } compileOptions { sourceCompatibility JavaVersion.VERSION_1_7 targetCompatibility JavaVersion.VERSION_1_7 } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } dependencies { } 

Примечание . Я использую Android Studio 1.0 RC 1 / Gradle 2.2 и воспроизвел эту проблему, создав новый проект с нуля, добавлю пустой модуль библиотеки Android и «вуаля»,

В окне панели «Варианты сборки» слева вы должны увидеть оба своих модуля, а рядом с ними – текущие «активные» варианты. Например

 app debug custom_lib debug 

При вызове Build > Make Project мы строим все модули в проекте в их текущем варианте .

Однако из-за текущего ограничения Gradle ( https://code.google.com/p/android/issues/detail?id=52962 ) для создания app при debug потребуется custom_lib вариант выпуска custom_lib , и поэтому вы в конечном итоге и строительство обоих.

Я бы рекомендовал не использовать Make Project а вместо этого использовать параметр ниже, который говорит о Make Module app . Этот параметр изменится с app на lib на основе текущего выбора на панели « Project или на основе текущего редактора и всегда будет делать только то, что необходимо для создания текущего модуля.

(Заглянув в это, мы заметили, что для него нет ярлыка, поэтому мы добавляем его).

Поместите это в зависимости от вашего приложения:

 dependencies { debugCompile project(path: ':custom_lib', configuration: "debug") releaseCompile project(path: ':custom_lib', configuration: "release") } 

и в build.gradle вашей библиотеки добавьте:

 android { defaultConfig { defaultPublishConfig 'release' publishNonDefault true } } 

Затем библиотека будет построена в том же режиме, что и приложение. Вопреки предыдущим версиям этого ответа, я подтвердил, что в библиотеке не требуется аромат (это может быть связано с версиями плагина Gradle или Android – я использую Gradle 2.14 и Android-плагин 2.1.0 и не нуждаюсь в нем) ,

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

Gradle теперь поддерживает директиву Flavor-buildType-Compile, поэтому ответ KaneORiley теперь можно улучшить следующим образом:

библиотека build.gradle:

 android { defaultPublishConfig 'release' publishNonDefault true productFlavors { library { } } 

app’s build.gradle:

 configurations { devDebugCompile devReleaseCompile storeDebugCompile storeReleaseCompile } android { ..... } dependencies { (...) devDebugCompile project(path: ':path:to:lib', configuration: 'devDebug') devReleaseCompile project(path: ':path:to:lib', configuration: 'devRelease') storeDebugCompile project(path: ':path:to:lib', configuration: 'storeDebug') storeReleaseCompile project(path: ':path:to:lib', configuration: 'storeRelease') } 

Это тесно связано с этим вопросом .

Похоже, что Gradle строит все ссылочные модули проекта в режиме выпуска. Поскольку custom_lib – это только библиотека, его конфигурация переопределяется модулем, который ссылается на него. Я бы не стал слишком беспокоиться о том, что библиотека строится на лейбле «release».

Вы заметите, что в вашем графическом выпуске ваш проект правильно компилируется с помощью конфигурации отладки.

  • Использование библиотеки ViewPagerIndicator с Android Studio и Gradle
  • Чрезвычайно длинная assembly с Gradle (Android Studio)
  • Конфигурация прокси-сервера Gradle
  • Android Studio: Где окно вывода compiler errors?
  • Студия Android добавляет внешний проект для сборки.gradle
  • Многопроектные тестовые зависимости с gradleиентом
  • Как получить отчет о покрытии jacoco с помощью плагина Android gradle 0.10.0 или новее?
  • Как очистить кеш gradleации?
  • Транзитные зависимости не разрешены для aar-библиотеки с использованием gradle
  • Отфильтровать отчеты о покрытиях JaCoCo с помощью Gradle
  • Кэш зависимостей Gradle может быть поврежден (это иногда происходит после таймаута сетевого соединения).
  • Давайте будем гением компьютера.