1. 程式人生 > >【Android】Gadle改變應用名稱(appName)的兩種方法

【Android】Gadle改變應用名稱(appName)的兩種方法

應用場景

  • App在debug/release編譯環境下,想通過改變appName來給予區分。
  • productFlavors增加各種編譯引數時,比如更換applicationId包名,appName也需要跟著變動。

方法一:設定manifestPlaceholders

1234567891011121314151617181920212223242526android { ... ... 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

1234567891011121314151617181920212223242526android { ... ... 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資源定義錯誤。

1234Error: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定義方法二的實現
compare

可以看出,manifestPlaceholders屬於字串直接替換賦值,當應用有 多語言 切換時,應用名是仍然會是固定的”Debug哈囉”,不會變化。
resValue定義顯得委婉一些,只要res/values-en/strings.xml中有<string app_name>的外語定義,是會跟隨系統的語言變化而切換app名稱的。

後記

本文同時給出了buildTypesproductFlavors中的示例,但在實際處理中,請根據實際情況自己選擇使用。
如果兩者都聲明瞭app_name,則最後以buildTypes的設定為準。
原因是Gradle的資源合併功能中在權重上:

1BuildType > Flavor > main > Dependecies.

resource.merging