【Android】Gadle改變應用名稱(appName)的兩種方法
阿新 • • 發佈:2019-01-21
應用場景
- App在debug/release編譯環境下,想通過改變appName來給予區分。
productFlavors
增加各種編譯引數時,比如更換applicationId
包名,appName也需要跟著變動。
方法一:設定manifestPlaceholders
1234567891011121314151617181920212223242526 | android { ... ... defaultConfig{ ... ... manifestPlaceholders = [k_appName : "哈囉"] // 設定預設的k_appName } // 依據debug/release變動的話設定如下 buildTypes { debug { manifestPlaceholders = [k_appName : "Debug哈囉" |
對應的AndroidManifest.xml
需要對android:label
修改為:
1234 | <application android:icon="@mipmap/ic_launcher" android:label= |
方法二:定義resValue
1234567891011121314151617181920212223242526 | android { ... ... defaultConfig{ ... ... resValue "string", "app_name", "哈囉" // 設定預設的app_name } // 依據debug/release變動的話設定如下 buildTypes { debug { resValue "string", "app_name" |
因為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. |