您的位置:首页 > 移动开发

【Android】Gadle改变应用名称(appName)的两种方法

2016-09-01 18:21 465 查看
Sodino1. 应用场景
2. 方法一:设置manifestPlaceholders
3. 方法二:定义resValue
4. 两者比较
5. 后记

应用场景

App在debug/release编译环境下,想通过改变appName来给予区分。
productFlavors
增加各种编译参数时,比如更换
applicationId
包名,appName也需要跟着变动。

方法一:设置manifestPlaceholders

1234567891011121314151617181920212223242526
android {    ... ...    defaultConfig{        ... ...        manifestPlaceholders = [k_appName : "哈啰"]   // 设置默认的k_appName    }        // 依据debug/release变动的话设置如下    buildTypes {        debug {            manifestPlaceholders = [k_appName : "Debug哈啰"]        }    }            // 依据flavors变动的话设置如下    productFlavors {        autoTest {            manifestPlaceholders = [k_appName : "AT哈啰"]        }                appStore {            // do nothing        }    }}
对应的
AndroidManifest.xml
需要对
android:label
修改为:
1234
<application    android:icon="@mipmap/ic_launcher"    android:label="${k_appName}" // 这里取k_appName>

方法二:定义resValue

1234567891011121314151617181920212223242526
android {    ... ...    defaultConfig{        ... ...        resValue "string", "app_name", "哈啰"   // 设置默认的app_name    }        // 依据debug/release变动的话设置如下    buildTypes {        debug {            resValue "string", "app_name", "Debug哈啰"        }    }            // 依据flavors变动的话设置如下    productFlavors {        autoTest {            resValue "string", "app_name", "AT哈啰"        }                appStore {            // do nothing        }    }}
因为gradle会根据
resValue
的定义自动生成
<string name="app_name">
资源。
所以需要将
/res/values/strings.xml
中默认生成的
<string name="app_name">HelloWorld</string>
删除,避免出现重复的string资源定义错误。
1234
Error:Execution failed for task ':app:mergeAutoTestDebugResources'.> [string/app_name] D:\github\HelloWorld\app\src\main\res\values\strings.xml	    [string/app_name] D:\github\HelloWorld\app\build\generated\res\resValues\autoTest\debug\values\generated.xml:     Error: Duplicate resources

两者比较

直接用APK反编译后的图来对比吧:左边是
manifestPlaceholders
方法一的实现;右边是
resValue
定义方法二的实现


可以看出,
manifestPlaceholders
属于字符串直接替换赋值,当应用有 多语言 切换时,应用名是仍然会是固定的”Debug哈啰”,不会变化。
resValue
定义显得委婉一些,只要
res/values-en/strings.xml
中有
<string app_name>
的外语定义,是会跟随系统的语言变化而切换app名称的。

后记

本文同时给出了
buildTypes
productFlavors
中的示例,但在实际处理中,请根据实际情况自己选择使用。
如果两者都声明了
app_name
,则最后以
buildTypes
的设定为准。
原因是Gradle的资源合并功能中在权重上:
1
BuildType > Flavor > main > Dependecies.
见下图,或点击链接Resource Merging

About Sodino
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: