Gradle Flavor变量的抽象为

时间:2016-06-12 16:04:39

标签: android gradle android-manifest android-build-type android-build-flavors

最近,我想出了如何使用占位符进行Manifest Mergers。我在我的应用中实现了它,在大多数情况下,我对结果非常满意 - Gradle-only solution to modify App name based on Build Variant

之前,您必须使用一个字符串创建一个新的稀疏String Resource,该字符串具有您希望通过不同资源(如flavor和构建类型)更改的属性。就个人而言,我不认为这种方法真的很干净。简单易行,是的,但不干净。

由此我创建了以下可行的方法。但是,我不喜欢重复的代码,我的Flavor的每个人都会有重复的代码。这件事是否可以抽象出来?可能会把它放在defaultConfig

例如,在下面的代码中,是否有某些方法可以移动每个Flavor中存在的manifestPlaceholders代码,并以某种方式将其抽象到defaultConfig,以便我可以定义一次?

android {
    ...
    ext {
        APP_NAME = "App Name"
        HUB_NAME = "Hub"
    }

    defaultConfig {
        ...
    }

    productFlavors {
        entity_1 {
            versionNameSuffix ' - Entity_1'
            applicationIdSuffix 'entity_1'
            manifestPlaceholders = [ applicationLabel: APP_NAME + versionNameSuffix ]
        }
        entity_2 {
            versionNameSuffix ' - Entity_2'
            applicationIdSuffix 'entity_2'
            manifestPlaceholders = [ applicationLabel: APP_NAME + versionNameSuffix ]
        }

        ...

        entity_n {
            versionNameSuffix ' - Entity_n'
            applicationIdSuffix 'entity_n'
            manifestPlaceholders = [ applicationLabel: APP_NAME + versionNameSuffix ]
        }
        hub {
            versionNameSuffix ' - Hub'
            applicationIdSuffix 'hub'
            manifestPlaceholders = [ applicationLabel: HUB_NAME ]
        }
    }

    buildTypes {
        release {
            ...
        }
    }

    applicationVariants.all { variant ->

        if (variant.buildType.name != "release") return

        if (variant.flavorName != "hub") {
            variant.mergedFlavor.manifestPlaceholders = [applicationLabel: APP_NAME]
        } 
    }

顺便说一下,上面的代码会给我applicationLabel以下内容。我使用这些来确定主屏幕上的应用程序名称。

所需

Flavor     Debug App Name             Release App Name
--------   --------------             ----------------
entity_1   App Name - Entity_1_name   App Name
entity_2   App Name - Entity_2_name   App Name
...        ...                        ...
entity_n   App Name - Entity_n_name   App Name
hub        Hub                        Hub

1 个答案:

答案 0 :(得分:0)

可以轻松完成所需的操作。

问题中的当前实现是尝试首先创建最具体的名称,然后删除特定风格中不​​需要的信息。

考虑到相反的想法,我需要先创建最通用的名称,然后添加特定口味所需的信息。

android {
    ...
    ext {
        APP_NAME = "App Name"
        HUB_NAME = "Hub"
    }

    defaultConfig {
        ...
        manifestPlaceholders = [ applicationLabel: APP_NAME ]
    }

    productFlavors {
        entity_1 {
            versionNameSuffix ' - Entity_1'
            applicationIdSuffix 'entity_1'
        }
        entity_2 {
            versionNameSuffix ' - Entity_2'
            applicationIdSuffix 'entity_2'
        }

        .
        .
        .

        entity_n {
            versionNameSuffix ' - Entity_n'
            applicationIdSuffix 'entity_n'
        }

        hub {
            versionNameSuffix ' - Hub'
            applicationIdSuffix 'hub'
            manifestPlaceholders = [ applicationLabel: HUB_NAME ]
        }
    }

    buildTypes {
        release {
            ...
        }
    }

// BEFORE the applicationVariants.all { ... } code runs, this is what all the applicationLabel look like. We are close, but need to ADD to them...

//     Flavor     Debug App Name             Release App Name
//    --------   --------------             ----------------
//    entity_1   App Name                   App Name
//    entity_2   App Name                   App Name
//    ...        ...                        ...
//    entity_n   App Name                   App Name
//    hub        Hub                        Hub

    applicationVariants.all { variant ->

        // Don't modify the release build or the hub flavor. They are good already.
        if (variant.buildType.name == "release" || variant.flavorName == "hub") return
        variant.mergedFlavor.manifestPlaceholders = [applicationLabel: APP_NAME + variant.mergedFlavor.versionNameSuffix]
    }

// AFTER the applicationVariants.all { ... } code runs, this is what all the applicationLabel look like. We are done!

//     Flavor     Debug App Name             Release App Name
//    --------   --------------             ----------------
//    entity_1   App Name - Entity_1_name   App Name
//    entity_2   App Name - Entity_2_name   App Name
//    ...        ...                        ...
//    entity_n   App Name - Entity_n_name   App Name
//    hub        Hub                        Hub