当应用程序处于Debug状态时,为什么Gradle在Release模式下构建我的模块

时间:2014-12-03 17:00:08

标签: android gradle android-gradle

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

dependencies {
    compile project(':custom_lib')
}

当我触发构建过程(菜单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模块。发布配置。

然后,在完全构建应用程序之后,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库模块," voila"

4 个答案:

答案 0 :(得分:65)

将此信息放入您的应用依赖项:

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文件后没有清理/重建,可能会遇到问题,如this answer here.

中所述

答案 1 :(得分:21)

在" Build Variants"在左侧的面板窗口中,您应该看到两个模块,然后在它们旁边显示当前的"活动"变种。例如

app          debug
custom_lib   debug

致电Build > Make Project时,我们正在构建项目中的所有模块

但是,由于当前的Gradle限制(https://code.google.com/p/android/issues/detail?id=52962),在app中构建debug将需要构建release的{​​{1}}变体,因此你最终建立了两个。

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

(考虑到这一点,我们注意到它没有快捷方式,所以我们正在添加一个)。

答案 2 :(得分:3)

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

library的build.gradle:

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

app的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') 
}

答案 3 :(得分:2)

这是related to this question。{/ p>

Gradle似乎在发布模式下构建项目的所有引用模块。由于custom_lib只是一个库,因此引用它的模块会覆盖其配置。我不会太担心使用“发布”标签构建的库。

您将注意到,在您的gradle输出中,您的项目正在使用调试配置进行正确编译。