0

最近,我想出了如何使用占位符进行 Manifest Mergers。我在我的应用程序中实现了它,在大多数情况下,我对结果感到非常满意 -仅 Gradle 解决方案,用于根据 Build Variant 修改应用程序名称

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

从那我创建了以下工作。但是,我不喜欢重复的代码,我Flavor的每个人都会有重复的代码。这是可以抽象出来的东西吗?可能可以把它放在defaultConfig?

例如,在下面的代码中,是否有某种方法可以移动manifestPlaceholders每个 Flavor 中存在的代码,并将其抽象为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
4

1 回答 1

1

想要的东西很容易就能完成。

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

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

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
于 2016-06-13T10:12:48.733 回答