Почему 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.
- Как запустить задачу копирования с помощью Android-студии в папку с ресурсами
- Gradle - Что такое ненулевое значение выхода и как его исправить?
- «зависимости» не могут применяться к «(groovy.lang.Closure)»
- Запуск «corova build android» - не удалось найти атрибут android: fontVariationSettings and android: ttcIndex
- Не удалось найти com.android.tools.build:gradle:3.0.0-alpha1 в круге ci
И затем, после того, как приложение полностью построено, 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 и «вуаля»,
- Android Gradle: Что такое javaMaxHeapSize «4g»?
- Android Studio не удается отладить с ошибкой org.gradle.process.internal.ExecException
- Autoincrement VersionCode с дополнительными свойствами gradle
- Как автоинкремент версии Код в Android Gradle
- Gradle sourceCompatibility не влияет на подпроекты
- Как обеспечить различные значки приложений для Android для разных типов шаблонов gradle?
- Как создать подписанный файл apk для выпуска с помощью Gradle?
- Ошибка: (1, 0) Плагин с id 'com.android.application' не найден
В окне панели «Варианты сборки» слева вы должны увидеть оба своих модуля, а рядом с ними – текущие «активные» варианты. Например
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».
Вы заметите, что в вашем графическом выпуске ваш проект правильно компилируется с помощью конфигурации отладки.