我正在尝试修改我的gradle文件,以便根据Flavor
和Build Type
为我的应用添加不同的名称。到目前为止,我已成功通过Android Gradle Plugin Docs
Flavor
技术基于Manifest Merging
进行命名。
这些是我的主屏幕上debug
和release
版本的应用程序名称。
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
作为我的应用名称的后缀;但是,它可以是任何(另一个添加的变量??),这将允许我告诉我仅在我的调试构建类型中使用哪种风格。
对String Resource
解答不感兴趣,就像Android/Gradle: App name based on build type *and* product flavor的回答一样。基于Gradle的纯解决方案是首选。
不想离开我目前实施的Manifest Merger
方法。 https://stackoverflow.com/a/28465883/2333021的答案是实现我已经完成的另一种方式,并且不允许我只在调试版本上执行此操作(我可以看到。如果有,请告诉我)。
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'
}
}
<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)
答案 0 :(得分:5)
第一次尝试是对正确答案的更接近解决方案,而不是更新的代码。
可以通过移动manifestPlaceholders
部分内的所有applicationVariants.all
代码来进行进一步的重构;然而,这是半清洁,仅限摇篮的解决方案的工作副本......
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]
}
注意:
BEFORE 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
块中的任何信息都将获得最终结果,applicationVariants.all
中的代码不会覆盖该信息。为了克服这个问题,您必须从buildType
块中删除所需的代码并将其移动到applicationVariants.all
块中(使用正确的逻辑语句)
答案 1 :(得分:4)
克里斯托弗的解决方案并不适合我。我花了几个小时尝试不同的模式,我终于找到了一个适合我的情况,所以我会在这里分享。
首先,build.gradle中的productFlavors定义:
productFlavors {
uat {
manifestPlaceholders.appNameSuffix = " UAT"
}
live {
manifestPlaceholders.appNameSuffix = ""
}
}
然后,buildTypes:
buildTypes {
debug {
manifestPlaceholders.appName = "Preg Debug"
}
qa {
manifestPlaceholders.appName = "Preg QA"
}
release {
manifestPlaceholders.appName = "Pregnancy"
}
}
最后但并非最不重要的是,清单中的android:label&gt;应用程序:
android:label="${appName}${appNameSuffix}"
因此,我获得了应用名称的以下6种变体:
因此,结论是,我必须在清单文件中连接来自产品风格和构建类型的清单占位符,等等!
在清洁,可读和可维护方面,我认为这是要走的路:)