美文网首页
Gradle Flavor

Gradle Flavor

作者: super超_9754 | 来源:发表于2022-07-18 10:32 被阅读0次

一、配置多类型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'
}


更多信息参考 官方

相关文章

  • Gradle Flavor

    一、配置多类型build 在模块级 build.gradle 文件中的 android 代码块内, buildTy...

  • 详解Gradle之flavor

    flavor配置不同包名 productFlavors 设置的不同环境包名会覆盖 defaultConfig 里面...

  • Gradle中Flavor使用

    一、前言 本文主要分享Gradle中两个参数flavorDimensions和productFlavors,而这两...

  • openstack常用命令-flavor相关

    查看所有flavor nova flavor list 创建flavor(建议FLAVOR_ID为auto,ROO...

  • Gradle判断当前编译的Flavor

    要判断当前编译的是哪个Flavor,可以参考下面的代码。本人亲测编译时有效,在仅是Gradle Sync中无效,不...

  • 【白水日记】gradle flavor在Android

    productFlavors是gradle的一个标签,主要用以区分渠道,也可用来区分debug,和release包...

  • Android Gradle 多渠道打包

    多渠道打包: First step:在build.gradle配置文件中添加flavor: 至此我们添加了两个fl...

  • gradle 发布多 flavor maven aar 库

    问题背景 最近, 项目中一直维护的一个 maven aar 库. 由于业务发展, 需要定义 2 个 flavor ...

  • nova openstack命令

    1、虚拟机创建 nova boot --flavor flavor-name --availablity-zone...

  • sweet flavor

    简书是我家的另外一位推荐的,他说这个编辑器简单大方,我应该每天一篇,可以让我带娃的生活稍微找到点乐趣。 几天前,带...

网友评论

      本文标题:Gradle Flavor

      本文链接:https://www.haomeiwen.com/subject/prgqirtx.html