Dlaczego Gradle buduje mój moduł w trybie wydania, gdy aplikacja jest w debugowaniu
Robię nowy projekt Androida, ze standardowym modułem 'app'
, a także projektem biblioteki (nazwijmy go 'custom_lib'
). W pliku app
's build.gradle
łączę moduł jako taki:
dependencies {
compile project(':custom_lib')
}
Kiedy uruchamiam proces budowania (Menu Build
> Make Project
), otrzymuję następujące wyjście w konsoli 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
Zastanawia mnie to, że mechanizm build uruchamia debug build( jak mówi pierwsza linia), ale prawie natychmiast Gradle używa zadania :app:preReleaseBuild
, które sprawia, że moje custom_lib
moduł do zbudowania z konfiguracją Release.
A następnie, po pełnym zbudowaniu aplikacji, Gradle kompiluje mój moduł z konfiguracją debugowania.
Więc moje pytania to:
- dlaczego robi to podwójne budowanie, które wydaje się niespójne ?
- Jak mogę się upewnić, że Biblioteka jest zbudowana z konfiguracją debugowania podczas uruchamiania procesu budowania debugowania ?
EDIT:
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 {
}
Uwaga : używam Android Studio 1.0 RC 1 / Gradle 2.2 i odtworzyłem ten problem, tworząc nowy projekt od podstaw, dodając pusty moduł Biblioteki Androida i"voila"
4 answers
W oknie Panelu "Build Variants" po lewej stronie powinieneś zobaczyć oba swoje moduły, a obok nich obecne" aktywne " warianty. Na przykład
app debug
custom_lib debug
Wywołując Build > Make Project
budujemy wszystkie moduły w projekcie w ich aktualnym wariancie.
Jednak ze względu na obecne ograniczenie Gradle ( https://code.google.com/p/android/issues/detail?id=52962 ), budowanie app
w debug
będzie wymagało zbudowania release
wariantu custom_lib
, a więc kończy się budując jedno i drugie.
Zalecałbym, aby nie używać Make Project
, ale zamiast tego użyć opcji poniżej, która mówi Make Module app
. Ta opcja zmieni się z app
na lib
na podstawie bieżącego wyboru w panelu Project
lub na podstawie bieżącego edytora i będzie zawsze robić tylko to, co jest potrzebne do zbudowania bieżącego modułu.
(patrząc na to, zauważyliśmy, że nie ma na to skrótu, więc dodajemy jeden).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-03 17:50:52
Umieść to w zależności aplikacji:
dependencies {
debugCompile project(path: ':custom_lib', configuration: "debug")
releaseCompile project(path: ':custom_lib', configuration: "release")
}
I w budowaniu biblioteki.gradle add:
android {
defaultConfig {
defaultPublishConfig 'release'
publishNonDefault true
}
}
Wtedy Biblioteka zostanie zbudowana w tym samym trybie co aplikacja. W przeciwieństwie do poprzednich wersji tej odpowiedzi, potwierdziłem smak nie jest wymagane w bibliotece (może to być spowodowane Gradle lub Android plugin wersje - używam Gradle 2.14 i Android plugin 2.1.0 i nie wymaga).
Edit: możesz mieć problemy, jeśli nie wyczyścisz/odbudujesz po modyfikacji pliki gradle, jak opisano w tej odpowiedzi tutaj.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:02:21
Gradle obsługuje teraz dyrektywę Flavor-buildType-Compile, więc odpowiedź Kaneorileya może zostać ulepszona w następujący sposób:
Budowa Biblioteki."gradle": {]}
android {
defaultPublishConfig 'release'
publishNonDefault true
productFlavors {
library {
}
}
Budowa aplikacji."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')
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-03 00:41:48
Jest to ściśle związane z tym pytaniem .
Wygląda na to, że Gradle buduje wszystkie odwołujące się Moduły projektu w trybie release. Ponieważ custom_lib jest tylko biblioteką, jej konfiguracja jest nadpisywana przez moduł, który się do niej odwołuje. Nie martwiłbym się zbytnio o to, że Biblioteka jest budowana z etykietą "release".
Zauważ, że w Twoim wyjściu gradle, Twój projekt jest poprawnie skompilowany z konfiguracją debugowania.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 10:31:25