为什么当应用程序处于debugging状态时,Gradle会以发布模式构build我的模块

我正在制作一个新的Android项目,标准的'app'模块,以及一个库项目(我们称之为'custom_lib' )。 在appbuild.gradle文件中,我将模块链接为:

 dependencies { compile project(':custom_lib') } 

当我触发构build过程(菜单Build > 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 

令我感到困惑的是构build机制触发了一个Debug构build(如第一行所示),但是几乎马上,Gradle使用任务:app:preReleaseBuild ,这使得我的custom_lib模块使用Releaseconfiguration构build。

然后,在完成应用程序之后,Gradle使用Debugconfiguration编译我的模块。

所以我的问题是:

  • 为什么这个双重构build似乎不一致?
  • 如何确保在启动Debug构build过程时使用debuggingconfiguration构build库?

编辑:

应用/ 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,并且通过从零开始创build一个新项目,添加一个空的Android库模块和“voila”

在左侧的“Build Variants”面板窗口中,您应该看到两个模块,在他们旁边看到当前的“活动”变体。 例如

 app debug custom_lib debug 

当调用Build > Make Project我们正在构build当前项目中的每个模块。

但是,由于当前的Gradle限制( https://code.google.com/p/android/issues/detail?id=52962 ),在debug构buildapp需要构buildcustom_librelease版本,因此最终build设两个。

我build议不要使用Make Project ,而是使用下面说Make Module app的选项。 根据“ Project面板中的当前select或基于当前编辑器,此选项将从app更改为lib ,并且将始终只执行构build当前模块所需的操作。

(考虑到这一点,我们注意到它没有捷径,所以我们增加了一个)。

把它放在你的应用程序依赖关系中:

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

并在你的图书馆的build.gradle添加:

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

然后,图书馆将build立在应用程序相同的模式。 相反,这个答案以前的版本,我已经证实了一个风格是不需要的库(这可能是由于Gradle或Android插件版本 – 我使用Gradle 2.14和Android插件2.1.0,并不需要它) 。

编辑:如果您在修改gradle文件之后不清除/重build,则可能会遇到问题,如本答案中所述。

这与这个问题密切相关 。

看来,Gradle在发布模式下构build项目的所有引用模块。 由于custom_lib只是一个库,其configuration被引用它的模块覆盖。 我不会太在意使用“发布”标签构build的库。

您会注意到,在您的gradle输出中,您的项目正在使用debuggingconfiguration进行编译。

Gradle现在支持Flavor-buildType-Compile指令,所以KaneORiley的答案现在可以增强如下:

库的build.gradle:

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

应用程序的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') }