gpt4 book ai didi

android - 基于Build Variant修改App名称的Gradle-only解决方案

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:12:43 24 4
gpt4 key购买 nike

我正在尝试修改我的 gradle 文件,以允许我的应用程序根据 FlavorBuild Type 使用不同的名称。到目前为止,我已经通过 Android Gradle Plugin Docs 使用 Manifest Merging 技术在基于 Flavor 的命名方面取得了成功。

当前

这些是我的主屏幕上的应用程序名称,用于我的debugrelease 构建。

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

它很接近,但是......

想要的

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

我想要这个,所以我知道我的主屏幕上是哪种 debug 风格。我不关心区分 release 风格,因为用户在他们的设备上只会有一个(可能有多个,但我不关心那个)

考虑到 Gradle 的可扩展性,我认为这是可能的;但是,我不是高级 Gradle 用户。

那么,我怎样才能(尽可能)简洁地扩展我的代码以获得我想要的输出?

注意:上表使用versionNameSuffix 作为我的应用名称的后缀;但是,它可以是任何东西(另一个添加的变量??),它可以让我知道我只在我的调试构建类型中使用哪种风格。

非目标

代码

android {
compileSdkVersion 23
buildToolsVersion "23.0.2"

defaultConfig {
applicationId "..."
minSdkVersion 17
targetSdkVersion 23
versionCode 1
versionName "1.0"
manifestPlaceholders = [ applicationLabel:"App Name"]
}

productFlavors {
entity_1 {
versionNameSuffix ' - Entity_1_name'
applicationIdSuffix 'entity_1'
}
entity_2 {
versionNameSuffix ' - Entity_2_name'
applicationIdSuffix 'entity_2'
}
hub {
versionNameSuffix ' - Hub'
applicationIdSuffix 'hub'
manifestPlaceholders = [ applicationLabel:"Hub" ]
}
}

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

list

<manifest ...>

<application
...
android:label="${applicationLabel}"
... >

更新

android {
compileSdkVersion 23
buildToolsVersion "23.0.2"

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

defaultConfig {
applicationId "..."
minSdkVersion 17
targetSdkVersion 23
versionCode 1
versionName "1.0"
}

productFlavors {
one_million {
versionNameSuffix ' - Entity_1'
applicationIdSuffix 'entity_1'
manifestPlaceholders = [ applicationLabel: APP_NAME + versionNameSuffix ]
}
udacity {
versionNameSuffix ' - Entity_2'
applicationIdSuffix 'entity_2'
manifestPlaceholders = [ applicationLabel: APP_NAME + versionNameSuffix ]
}
hub {
versionNameSuffix ' - Hub'
applicationIdSuffix 'hub'
manifestPlaceholders = [ applicationLabel: HUB_NAME ]
}
}

buildTypes {
release {
manifestPlaceholders = [ applicationLabel: APP_NAME ]
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}

新输出

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 App Name <- Issue (Release)

最佳答案

第一次尝试比更新后的代码更接近正确答案。

可以通过将所有 manifestPlaceholders 代码移动到 applicationVariants.all 部分来进一步重构;然而,这是一个半干净的、仅 gradle 解决方案的工作副本......

android {
ext {
APP_NAME = "App Name"
HUB_NAME = "Hub"
}
defaultConfig {
manifestPlaceholders = [ applicationLabel: APP_NAME ]
}
productFlavors {
entity_1 {
versionNameSuffix ' - Entity_1'
applicationIdSuffix 'entity_1'
}

...

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

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

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]
}

注意事项:

applicationVariants.all { ... } 代码运行之前,这就是所有 applicationLabel 的样子。我们很接近,但需要添加到他们...

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

AFTER applicationVariants.all { ... } 代码运行后,这就是所有 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

还有...

defaultConfig 无法访问单个 productFlavors 中的信息。尽管 defaultConfig 是一种 Flavor,但只有指定的 Flavors 才能从 defaultConfig 中读取信息。没有机制可以走另一条路(据我所知)。所以需要在defaultConfig

中设置最通用的类​​型

buildTypes block 中的任何信息都有最终决定权,applicationVariants.all 中的代码不会覆盖它。为了克服这个问题,您必须从 buildType block 中删除所需的代码,并将其移动到 applicationVariants.all block 中(使用正确的逻辑语句)

关于android - 基于Build Variant修改App名称的Gradle-only解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37772944/

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