gpt4 book ai didi

android - Gradle Flavor 变量的抽象为

转载 作者:行者123 更新时间:2023-12-03 05:13:45 24 4
gpt4 key购买 nike

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

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

从那我创建了以下工作。但是,我不喜欢重复的代码,我的每个人都是 Flavor s 将有重复的代码。这是可以抽象出来的东西吗?可能可以放在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 s 以下。我使用这些来确定主屏幕上应用程序的名称。

期望的
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

最佳答案

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

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

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

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

关于android - Gradle Flavor 变量的抽象为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37776335/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com