【Android】Gadle改变应用名称(appName)的两种方法
应用场景
- App在debug/release编译环境下,想通过改变appName来给予区分。
- productFlavors增加各种编译参数时,比如更换- applicationId包名,appName也需要跟着变动。
方法一:设置manifestPlaceholders
| 1 | android { | 
对应的AndroidManifest.xml需要对android:label修改为:
| 1 | <application | 
方法二:定义resValue
| 1 | android { | 
因为gradle会根据resValue的定义自动生成<string name="app_name">资源。
所以需要将/res/values/strings.xml中默认生成的<string name="app_name">HelloWorld</string>删除,避免出现重复的string资源定义错误。
| 1 | Error:Execution failed for task ':app:mergeAutoTestDebugResources'. | 
两者比较
直接用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
