标签归档:flavor

Android Studio Gradle中buildTypes + flavor(flavor group, flavor dimensions)组合依赖编译,添加buildTypes

Published / by sickworm / Leave a Comment

最近在做UAF打包的事情,其中一个需求是根据debug/release和flavor来决定不同的依赖。比如debug情况下,我要打包带日志的,release情况下,我要打包带日志,不带日志,含其他module的,不含其他module的两两组合(也就是flavorDimensions)。现分享方法。

buildTypes + flavor(flavor group, flavor dimensions)组合依赖编译

参考build.gradle:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 25
    buildToolsVersion "24.0.2"

    defaultConfig {
        applicationId "com.sickworm.test"
        minSdkVersion 10
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
    }

    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), '../proguard-rules-remove-logs.pro'
        }

        // keep log and stacktrace
        preview {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }

    flavorDimensions 'log', 'combine'

    productFlavors {

        withoutLogs {
            dimension 'log'
        }

        withLogs {
            dimension 'log'
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }

        standalone {
            dimension 'combine'
        }

        mixed {
            dimension 'combine'
        }
    }
}

// This works because when we combine the flavor+build type into variant and create their associated
// configuration objects, we only create them if they don't already exist. otherwise we reuse the ones that are created.
configurations {
    withoutLogsMixedReleaseCompile
    withLogsMixedReleaseCompile
}

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    testCompile 'junit:junit:4.12'
    compile project(':clientapplication')
    debugCompile project(':asm')
    debugCompile project(':client')
    withoutLogsMixedReleaseCompile project(':asm')
    withLogsMixedReleaseCompile project(':asm')
    withoutLogsMixedReleaseCompile project(':client')
    withLogsMixedReleaseCompile project(':client')
}

大家都用过简单的debugCompile, releaseCompile。如果是根据flavor来定义依赖,则是flavor1Compile,flavor2Compile(flavor1,flavor2为flavor名字)。但如果要使用buildTypes + flavor依赖,直接使用flavor1DebugCompile或debugFlavorCompile是不行的,会提示没有这个方法。

解决方法是使用configurations来预定义这个方法:Provide configurations for flavor+type combinations.。原因是,flavor+buildType的组合依赖在最开始检测的时候是不存在的,我们需要先用configurations定义出来,此时该组合是一个空的配置。等到编译期时,flavor+buildType已经被真正创建并重写了我们之前定义的空配置,所以此时编译用到的是正确的编译配置。我们预定义只是为了防报错。这个应该是设计缺陷吧。(gradle 2.2.3)

于是我兴高采烈的使用了mixedReleaseCompile,以达到mixed+Release的组合依赖。结果并没有依赖成功。

我想了半天,终于想到我用的是flavorDimensions(旧版gradle称为flavorGroups)特性,所以结果应该是定义withoutLogsMixedReleaseCompile和withLogsMixedReleaseCompile。(withoutLogsMixed这样才是真正的flavor名)。猜想正确,编译成功。

自定义buildTypes

后来我想,其实对于withLogs和withoutLogs这个flavorDimensions,我要的是一个正式发布前带日志但混淆过的版本,其实我可以定义一个preview版本,组成debug/preview/release三种发布版本。如何定义呢:

    buildTypes {
        preview {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }

这样我就不需要用到flavorDimensions这个特性了。

注意:有些教程里会让你在signingConfig中创建一个同名的preview,其实如果没用到自动签名是不需要的

版权所有,转载请注明出处:
http://sickworm.com/?p=308