为什么当应用程序处于debugging状态时,Gradle会以发布模式构build我的模块
我正在制作一个新的Android项目,标准的'app'
模块,以及一个库项目(我们称之为'custom_lib'
)。 在app
的build.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_lib
的release
版本,因此最终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') }