Gradle多維度多風格App配置

mei_zi.png
概述
在很多時候,我們有這樣的需求:在同一套程式碼下,不改變其邏輯,而改變某些UI風格,達到一套程式碼很多不同風格的UI的效果。我們可以使用Gradle來進行配置,打包的時候,根據所宣告的flavor來打包不同的資源。
flavor,維度,
在gradle中這樣來宣告:
//宣告維度:產品 flavorDimensions "ProductFeature" productFlavors { A { dimension "ProductFeature" } B { dimension "ProductFeature" } C { dimension "ProductFeature" } }
然後我們在 Build Variants 中能看到:

1.png
我們聲明瞭一個維度:product,而product下有三個不同的product:abc,加上debug/release這個維度,我們最終能打包不同的app有3*2共6中不同的風格的app。可是這個有什麼用呢?我們先指定了 ADebug ,然後看到 BuidlConfig
檔案:
public final class BuildConfig { public static final boolean DEBUG = Boolean.parseBoolean("true"); public static final String APPLICATION_ID = "com.chestnut.sample.falvor.app"; public static final String BUILD_TYPE = "debug"; public static final String FLAVOR = "A"; public static final int VERSION_CODE = 1; public static final String VERSION_NAME = "1.0"; }
可以看到FLAVOR欄位就是我們的維度名稱A,這個欄位會根據當前所制定的不同維度進行變化,所以,我們就可以根據這個名稱來獲知當前的維度,就可以根據對應的維度進行UI或者邏輯的相應變化了。
示例
假如我有這個的一個app,gradle宣告如上的一樣,介面只有一個簡單的圖片和一個按鈕。

2.png
需求一:不同FLAVOR UI不同
在根專案中新建各產品的資料夾,命名一定要是產品的名稱,如果產品的UI不變,則不需要新建:

每個ABC不同緯度下的資料夾路徑保持跟main一樣。我們要替換的res是main/res/drawable/mei_zi.png,在需要替換資源的A/res/drawable/和B/res/drawable下,放一張替換後的照片。選擇對應的維度,編譯跑起來就是我們想要的:

4.png
在打包的時候,會優先檢視對應flavor路徑(如果有)下有沒有替換的檔案,有則會打包替換,無則到main中查詢。
需求二:不同FLAVOR要求不同的App-Name/Icon和包名
不同的App-Icon和不同的App-Name,使用上面的方式配置,新增不同的string.xml和不同的icon.png即可。
包名不同,使用Gradle去配置,還能配置不同的versionCode和versionName
//宣告維度:產品 flavorDimensions "ProductFeature" productFlavors { A { dimension "ProductFeature" applicationId 'com.chestnut.a' versionCode = 9 versionName = '1.3.1' } B { dimension "ProductFeature" applicationId 'com.chestnut.b' versionCode = 4 versionName = '1.0.3' } C { dimension "ProductFeature" applicationId 'com.chestnut.c' versionCode = 5 versionName = '1.0.4' } }
需求三:不同FLAVOR邏輯不同
我們可以把不同的java程式碼檔案放到不同的flavor中,那麼打包的時候就會打包不同的java程式碼檔案,但是這樣不就把程式碼的邏輯又分割了嗎???所以不推介這麼做。我們知道 BuidlConfig
中的flavor值不同,那程式碼中就可以通過flavor的值去判斷執行不同的程式碼塊:
switch (BuildConfig.FLAVOR) { case "A": Toast.makeText(MainActivity.this, "A", Toast.LENGTH_SHORT).show(); break; case "B": Toast.makeText(MainActivity.this, "B", Toast.LENGTH_SHORT).show(); break; case "C": Toast.makeText(MainActivity.this, "C", Toast.LENGTH_SHORT).show(); break; default: Toast.makeText(MainActivity.this, "Default", Toast.LENGTH_SHORT).show(); break; }
其他
Gradle還有很多很棒的用法,可以參考一下:
點贊互粉送妹子圖喲~