Gradle Flavor

一、配置多类型build

在模块级 build.gradle 文件中的 android 代码块内, buildTypes代码块内创建和配置 build 类型。这些配置好的build可以IDE的Build Variant 中找到对应的type,可以选择编译

IDE会自动创建“debug”build 类型和“release”build 类型。

debug build 默认配置[debuggable true](https://developer.android.com/guide/topics/manifest/application-element#debug) 。这样可以在Android 设备上调试应用,并使用常规调试密钥库配置应用签名。

android {

    ...

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

        debug {
            // 可调式
            debuggable true
            // 混淆
            minifyEnabled false
        }

        dev {
            // 从给定的构建类型复制所有属性。
            // 即可调式 不混淆
            initWith debug
            // 
            applicationIdSuffix ".debug"
        }

        prebuild {
            initWith release
            applicationIdSuffix ".pre"
        }
    }
}

./gradlew build 可以同时编译四个type

b3dec355-1263-42ad-83c4-9fe7c27d5e6d.png

applicationIdSuffix 的作用就是给报名加后缀, 这样就可以安装与同一个设备上了, 一般用于分渠道打包

0a56daff-a19b-4adc-9ae3-43fe08867d2b.png

更多属性 参考 buildtype

二、配置产品变种

将其添加到构建配置中的 productFlavors 代码块并添加所需的设置。产品变种支持与

defaultConfig 相同的属性,这是因为defaultConfig 实际上属于 [ProductFlavor](https://developer.android.com/reference/tools/gradle-api/current/com/android/build/api/dsl/ProductFlavor) 类。

这意味着,您可以在 defaultConfig 代码块中提供所有变种的基本配置,每个变种均可更改其中任何默认值

所有变种都必须属于一个指定的变种维度,即一个产品变种组。须将所有变种分配给某个变种维度

举例: 以下代码示例创建了一个名为“version”的变种维度,并添加了“demo”和“full”产品变种。这些变种提供了它们自己的 [applicationIdSuffix](https://developer.android.com/studio/build/build-variants#change-app-id)[versionNameSuffix](https://developer.android.com/reference/tools/gradle-api/current/com/android/build/api/dsl/ProductFlavor)

flavorDimensions "version"
productFlavors {
    demo {
        dimension "version"
        applicationIdSuffix ".demo"
        versionNameSuffix "-demo"
    }
    full {
        dimension "version"
        applicationIdSuffix ".full"
        versionNameSuffix "-full"
    }
}

创建并配置产品变种后,点击通知栏中的 Sync Now。同步完成后,Gradle 会根据 build 类型和产品变种自动创建 build 变体,并按照 <product-flavor><Build-Type> 为其命名

abe66f2c-9604-4c45-9e75-f02a44e81f07.png
d953c15f-5237-4a98-8519-c262d78e8537.png

可见反编译demo -> dev -> apk中

versionName 多了 -demo(productFlavors.demo);

package多了.demo(productFlavors.demo) 与.debug(buildTypes.dev)

除了拼接后缀也可以替换defaultconfig中的属性

defaultConfig {
    applicationId "com.android.demo"
}

flavorDimensions "package"
productFlavors {
    free {
        dimension "package"
        applicationId "com.android.freedemo"
    }
    pro {
        dimension "package"
        applicationId "com.android.prodemo"
    }
}

636dfce9-c386-4995-8e56-b657583b2cac.png
6042024c-e686-44f4-b169-3f78a56794ba.png

三、多产品与多维度组合

在某些情况下,可能要将多个产品变种的配置组合在一起。

例如,不同 API 级别的“free”和“pro”产品变种创建不同的配置。此时需要定义不同的维度, 每个变种维度中的产品变种配置以及 build 类型配置会组合在一起。Gradle 不会将属于同一变种维度的产品变种组合在一起。

flavorDimensions "package","api"
productFlavors {
    free {
        dimension "package"
        applicationIdSuffix ".free"
    }

    pro {
        dimension "package"
        applicationIdSuffix ".pro"
    }

    minApi24 {
        dimension "api"
        minSdkVersion 24
        versionCode 30000 + android.defaultConfig.versionCode
        versionNameSuffix "-minApi24"
    }

    minApi23 {
        dimension "api"
        minSdkVersion 23
        versionCode 20000  + android.defaultConfig.versionCode
        versionNameSuffix "-minApi23"
    }

    minApi21 {
        dimension "api"
        minSdkVersion 21
        versionCode 10000  + android.defaultConfig.versionCode
        versionNameSuffix "-minApi21"
    }
}

86be8948-79dd-4f47-b869-abc9d2b29cda.png
3e5222c3-841c-4ba3-b38e-a2f81c3a2b69.png

四、过滤变体

不需要的变体可以创建变体过滤器[variantFilter](https://developer.android.com/reference/tools/gradle-api/current/com/android/build/api/variant/VariantFilter),以移除某些 build 变体配置。


flavorDimensions "package","api"
productFlavors {
    free {
        dimension "package"
        applicationIdSuffix ".free"
    }

    pro {
        dimension "package"
        applicationIdSuffix ".pro"
    }

    minApi24 {
        dimension "api"
        minSdkVersion 24
        versionCode 30000 + android.defaultConfig.versionCode
        versionNameSuffix "-minApi24"
    }

    minApi23 {
        dimension "api"
        minSdkVersion 23
        versionCode 20000  + android.defaultConfig.versionCode
        versionNameSuffix "-minApi23"
    }

    minApi21 {
        dimension "api"
        minSdkVersion 21
        versionCode 10000  + android.defaultConfig.versionCode
        versionNameSuffix "-minApi21"
    }
}

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

    debug {
        // 可调式
        debuggable true
        // 混淆
        minifyEnabled false
    }
}

variantFilter { variant ->
    def names = variant.flavors*.name
    def type = variant.buildType.name
    // free 21 不需要
    if ((names.contains("minApi21") && names.contains("free")) 
            // pro 24 不需要
            || (names.contains("minApi24") && names.contains("pro")) 
            // 23 的没有debug
            || (names.contains("minApi23") && type == "debug")) { 
        setIgnore(true)
    }
}

61c37cbe-8696-4105-a74d-20dfc3a80f16.png

五、更改默认源代码集配置

使用 [sourceSets](https://developer.android.com/reference/tools/gradle-api/current/com/android/build/api/dsl/AndroidSourceSet) 代码块更改不同产品的资源配置

执行./gradlew app:sourceSets 可以查看当前所有产品以及资源配置情况

d30c462e-ea3e-4be9-9575-b7fc2ff91072.png
97c7c567-ee26-4f22-98fc-a84e2d73e501.png

举例: 存在一些付费资源, 每次运行都会收费. 所以debug调试时,使用免费版.发布后使用付费版.

sourceSets {
    release {
        res.srcDirs = ["../paid/res"]
    }
    debug {
        res.srcDirs = ["../free/res"]
    }
}

dafd75f8-a617-41ff-bcf8-dc6b72bddec8.png
25d2aeb0-0df5-4898-9fb0-16772c0e4a09.png

六、声明依赖项

可以为特定 build 变体或测试源代码集配置依赖项,方法是在

Implementation 关键字前面加上 build 变体或测试源代码集的名称作为前缀,如以下示例所示。

dependencies {
    // Adds the local "mylibrary" module as a dependency to the "free" flavor.
    freeImplementation project(":mylibrary")

    // Adds a remote binary dependency only for local tests.
    testImplementation 'junit:junit:4.12'

    // Adds a remote binary dependency only for the instrumented test APK.
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}


更多信息参考 官方

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容