AndroidGadle改变应用名称(appName)的两种方法

Posted Sodino

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AndroidGadle改变应用名称(appName)的两种方法相关的知识,希望对你有一定的参考价值。

  1. 1. 应用场景
  2. 2. 方法一:设置manifestPlaceholders
  3. 3. 方法二:定义resValue
  4. 4. 两者比较
  5. 5. 后记

应用场景

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

方法一:设置manifestPlaceholders

       
        1
       
       
        2
       
       
        3
       
       
        4
       
       
        5
       
       
        6
       
       
        7
       
       
        8
       
       
        9
       
       
        10
       
       
        11
       
       
        12
       
       
        13
       
       
        14
       
       
        15
       
       
        16
       
       
        17
       
       
        18
       
       
        19
       
       
        20
       
       
        21
       
       
        22
       
       
        23
       
       
        24
       
       
        25
       
       
        26
       
       
        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修改为:

       
        1
       
       
        2
       
       
        3
       
       
        4
       
       
        <application
       
       
            android:
        icon=
        "@mipmap/ic_launcher"
       
       
            android:
        label=
        "$k_appName" // 这里取k_appName
       
       
        >
       

方法二:定义resValue

       
        1
       
       
        2
       
       
        3
       
       
        4
       
       
        5
       
       
        6
       
       
        7
       
       
        8
       
       
        9
       
       
        10
       
       
        11
       
       
        12
       
       
        13
       
       
        14
       
       
        15
       
       
        16
       
       
        17
       
       
        18
       
       
        19
       
       
        20
       
       
        21
       
       
        22
       
       
        23
       
       
        24
       
       
        25
       
       
        26
       
       
        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资源定义错误。

       
        1
       
       
        2
       
       
        3
       
       
        4
       
       
        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名称的。


后记

本文同时给出了buildTypesproductFlavors中的示例,但在实际处理中,请根据实际情况自己选择使用。
如果两者都声明了app_name,则最后以buildTypes的设定为准。
原因是Gradle的资源合并功能中在权重上:

       
        1
       
       
        BuildType > Flavor > main > Dependecies.
       

见下图,或点击链接Resource Merging


About Sodino

以上是关于AndroidGadle改变应用名称(appName)的两种方法的主要内容,如果未能解决你的问题,请参考以下文章

获取应用版本号,版本名称,包名,AppName,图标,是否是系统应用,获取手机中所有应用,所有进程

在 react-native 应用程序中更改包名称

如何更改应用程序名称以进行 Firebase 身份验证(用户看到的内容)

如何在 Grails 3 中更改应用程序名称?

警报中缺少 URL 方案应用程序名称:在“”中打开此页面

模块制作