我有2种构建口味,比如,flavor1和flavor2.
我希望我的应用程序可以命名为" AppFlavor1 ",当我为flavor1构建时," AppFlavor2 ",当我为flavor 2构建时.
这不是我想要改变的活动的标题.我想更改应用程序名称,因为它显示在手机菜单和其他地方.
从build.gradle我可以为我的口味设置各种参数,但似乎不是应用程序标签.我也无法根据某些变量以编程方式更改app标签.
那么,人们如何处理这个问题呢?
Gan*_*nan 223
从strings.xml中删除app_name(否则gradle会抱怨重复的资源)然后像这样修改构建文件:
productFlavors {
flavor1{
resValue "string", "app_name", "AppFlavor1"
}
flavor2{
resValue "string", "app_name", "AppFlavor2"
}
}
Run Code Online (Sandbox Code Playgroud)
这比在不同的构建集下创建新的strings.xml或编写自定义脚本具有更小的破坏性.
我有一个使用此方法运行的生产应用程序
https://play.google.com/store/apps/details?id=co.getintouch.play,应用名称为"InTouch Messenger:Premium Edition"
https://play.google.com/store/apps/details?id=co.getintouch,应用名称为"InTouch Messenger"
productFlavors {
main{
resValue "string", "app_name", "InTouch Messenger"
}
googlePlay{
resValue "string", "app_name", "InTouch Messenger: GPE Edition"
}
}
Run Code Online (Sandbox Code Playgroud)
不要忘记从strings.xml中删除app_name!
Pie*_*our 20
而不是使用脚本更改主strings.xml并且冒着搞乱源代码控制的风险,为什么不依赖于Android Gradle构建的标准合并行为?
我的build.gradle包含
sourceSets {
main {
manifest.srcFile 'AndroidManifest.xml'
java.srcDirs = ['src']
resources.srcDirs = ['src']
aidl.srcDirs = ['src']
renderscript.srcDirs = ['src']
res.srcDirs = ['res']
assets.srcDirs = ['assets']
}
release {
res.srcDir 'variants/release/res'
}
debug {
res.srcDir 'variants/debug/res'
}
}
Run Code Online (Sandbox Code Playgroud)
所以现在我可以在中定义我的app_name字符串了variants/[release|debug]/res/strings.xml.还有其他我想改变的东西!
小智 8
您可以为每个flavor添加字符串资源文件,然后使用这些资源文件来更改您的应用程序名称.例如,在我的某个应用中,我有免费和付费版本.为了将它们重命名为"Lite"和"Pro",我创建了一个meta_data.xml文件,并将我的app_name值添加到该XML并将其从中删除strings.xml.接下来,app/src为每个flavor创建一个文件夹(参见下面的示例结构).在这些目录中,添加res/values/<string resource file name>.现在,在构建时,此文件将被复制到您的构建中,您的应用程序将被重命名.
文件结构:
app/src
/pro/res/values/meta_data.xml
/lite/res/values/meta_data.xml
Run Code Online (Sandbox Code Playgroud)
如果要以不同的方式维护应用程序名称的本地化,则可以按以下步骤实现:
1)android:label在以下<application>选项中指定AndroidManifest.xml:
<application
...
android:label="${appLabel}"
...
>
Run Code Online (Sandbox Code Playgroud)
2)appLabel在应用程序级别指定默认值fo build.gradle:
manifestPlaceholders = [appLabel:"@string/defaultName"]
3)如下覆盖产品风味的值:
productFlavors {
AppFlavor1 {
manifestPlaceholders = [appLabel:"@string/flavor1"]
}
AppFlavor2 {
manifestPlaceholders = [appLabel:"@string/flavor2"]
}
}
Run Code Online (Sandbox Code Playgroud)
4)为中的每个字符串(defaultName,flavor1,flavor2)添加字符串资源strings.xml。这将允许您本地化它们。
我实际使用的另一个选项是更改每个应用程序的清单.您可以为每种风格创建清单,而不是复制资源文件夹.
sourceSets {
main {
}
release {
manifest.srcFile 'src/release/AndroidManifest.xml'
}
debug {
manifest.srcFile 'src/debug/AndroidManifest.xml'
}
}
Run Code Online (Sandbox Code Playgroud)
你必须在你的src main中有一个主要的AndroidManifest作为主体.然后你可以定义一个清单,只为每个风格定义一些选项,如(src/release/AndroidManifest.xml):
<manifest package="com.application.yourapp">
<application android:icon="@drawable/ic_launcher">
</application>
</manifest>
Run Code Online (Sandbox Code Playgroud)
对于调试,AndroidManifest(src/debug/AndroidManifest.xml):
<manifest package="com.application.yourapp">
<application android:icon="@drawable/ic_launcher2">
</application>
</manifest>
Run Code Online (Sandbox Code Playgroud)
编译器将对清单进行合并,您可以为每种风格添加一个图标.
这可以在 buildTypes 下轻松完成
buildTypes {
debug {
buildConfigField("String", "server_type", "\"TEST\"")
resValue "string", "app_name", "Eventful-Test"
debuggable true
signingConfig signingConfigs.debug_key_sign
}
stage {
buildConfigField("String", "server_type", "\"STAGE\"")
resValue "string", "app_name", "Eventful-Stage"
debuggable true
signingConfig signingConfigs.debug_key_sign
}
release {
buildConfigField("String", "server_type", "\"PROD\"")
resValue "string", "app_name", "Eventful"
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
//TODO - add release signing
}
}
Run Code Online (Sandbox Code Playgroud)
只需确保从 strings.xml 中删除 app_name
| 归档时间: |
|
| 查看次数: |
29434 次 |
| 最近记录: |