android - tools - ¿Por qué Gradle construye mi módulo en modo Release cuando la aplicación está en Debug?
install gradle android studio (4)
En la ventana del panel "Construir variantes" a la izquierda, debería ver los dos módulos y junto a ellos las variantes "activas" actuales. Por ejemplo
app debug
custom_lib debug
Al llamar a Build > Make Project
, estamos construyendo todos los módulos del proyecto en su variante actual .
Sin embargo, debido a una limitación actual de Gradle ( https://code.google.com/p/android/issues/detail?id=52962 ), la creación de la app
en debug
requerirá construir la release
de release
de custom_lib
, y así terminarás construyendo ambos.
Recomendaría no utilizar Make Project
sino usar la opción a continuación que dice Make Module app
. Esta opción cambiará de una app
a otra en función de la selección actual en el panel Project
o en función del editor actual, y siempre hará solo lo necesario para construir el módulo actual.
(Al analizar esto, notamos que no hay un atajo para hacerlo, así que estamos agregando uno).
Estoy haciendo un nuevo proyecto de Android, con el módulo de ''app''
estándar, así como un proyecto de biblioteca (llamémoslo ''custom_lib''
). En el archivo build.gradle
la app
, vinculo el módulo como tal:
dependencies {
compile project('':custom_lib'')
}
Cuando desencadenar el proceso de compilación (Menú Build
> Make Project
), obtengo el siguiente resultado en la consola 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
Lo que me desconcierta es que el mecanismo de compilación desencadena una compilación de depuración (como dice la primera línea), pero casi inmediatamente, Gradle usa la tarea :app:preReleaseBuild
que hace que mi módulo custom_lib
se construya con la configuración de Release.
Y luego, una vez que la aplicación está completamente construida, Gradle compila mi módulo con la configuración de depuración.
Entonces mis preguntas son:
- ¿Por qué está haciendo esta doble construcción que parece incoherente?
- ¿Cómo puedo asegurarme de que la biblioteca está construida con la configuración de depuración cuando inicio un proceso de compilación de depuración?
EDITAR:
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 {
}
Nota : Estoy usando Android Studio 1.0 RC 1 / Gradle 2.2 y reproduje este problema creando un nuevo proyecto desde cero, agrego un módulo de biblioteca de Android vacío y "voila"
Esto está estrechamente relacionado con esta pregunta .
Parece que Gradle construye todos los módulos referenciados de un proyecto en modo de lanzamiento. Como custom_lib es solo una biblioteca, su configuración es anulada por el módulo que la hace referencia. No me preocuparía demasiado que la biblioteca se haya creado con la etiqueta "release".
Notará que en su salida de gradle, su proyecto se está compilando correctamente con la configuración de depuración.
Gradle ahora es compatible con la directiva Flavor-buildType-Compile, por lo que la respuesta de KaneORiley ahora se puede mejorar de la siguiente manera:
build.gradle de la biblioteca:
android {
defaultPublishConfig ''release''
publishNonDefault true
productFlavors {
library {
}
}
build.gradle de la aplicación:
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'')
}
Pon esto en tus dependencias de aplicaciones:
dependencies {
debugCompile project(path: '':custom_lib'', configuration: "debug")
releaseCompile project(path: '':custom_lib'', configuration: "release")
}
y en el build.gradle de tu biblioteca agrega:
android {
defaultConfig {
defaultPublishConfig ''release''
publishNonDefault true
}
}
Entonces la biblioteca se construirá en el mismo modo que la aplicación. Contrariamente a las revisiones anteriores de esta respuesta, he confirmado que no se requiere un sabor en la biblioteca (esto puede deberse a las versiones de complemento de Gradle o Android: estoy usando el complemento Gradle 2.14 y Android 2.1.0 y no lo necesitaba) .
Editar: puede tener problemas si no limpia / reconstruye después de modificar los archivos gradle, como se describe en esta respuesta aquí.