概述
在很多時(shí)候,我們有這樣的需求:在同一套代碼下漩仙,不改變其邏輯,而改變某些UI風(fēng)格犹赖,達(dá)到一套代碼很多不同風(fēng)格的UI的效果队他。我們可以使用Gradle來(lái)進(jìn)行配置,打包的時(shí)候峻村,根據(jù)所聲明的flavor來(lái)打包不同的資源麸折。
flavor,維度粘昨,
在gradle中這樣來(lái)聲明:
//聲明維度:產(chǎn)品
flavorDimensions "ProductFeature"
productFlavors {
A {
dimension "ProductFeature"
}
B {
dimension "ProductFeature"
}
C {
dimension "ProductFeature"
}
}
然后我們?cè)?Build Variants 中能看到:
我們聲明了一個(gè)維度:product垢啼,而product下有三個(gè)不同的product:abc窜锯,加上debug/release這個(gè)維度,我們最終能打包不同的app有3*2共6中不同的風(fēng)格的app膊夹〕幕耄可是這個(gè)有什么用呢捌浩?我們先指定了 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,這個(gè)字段會(huì)根據(jù)當(dāng)前所制定的不同維度進(jìn)行變化尸饺,所以进统,我們就可以根據(jù)這個(gè)名稱來(lái)獲知當(dāng)前的維度,就可以根據(jù)對(duì)應(yīng)的維度進(jìn)行UI或者邏輯的相應(yīng)變化了浪听。
示例
假如我有這個(gè)的一個(gè)app螟碎,gradle聲明如上的一樣,界面只有一個(gè)簡(jiǎn)單的圖片和一個(gè)按鈕迹栓。
需求一:不同F(xiàn)LAVOR UI不同
在根項(xiàng)目中新建各產(chǎn)品的文件夾掉分,命名一定要是產(chǎn)品的名稱,如果產(chǎn)品的UI不變克伊,則不需要新建:
每個(gè)ABC不同緯度下的文件夾路徑保持跟main一樣酥郭。我們要替換的res是main/res/drawable/mei_zi.png,在需要替換資源的A/res/drawable/和B/res/drawable下愿吹,放一張?zhí)鎿Q后的照片不从。選擇對(duì)應(yīng)的維度,編譯跑起來(lái)就是我們想要的:
在打包的時(shí)候犁跪,會(huì)優(yōu)先查看對(duì)應(yīng)flavor路徑(如果有)下有沒(méi)有替換的文件椿息,有則會(huì)打包替換,無(wú)則到main中查找坷衍。
需求二:不同F(xiàn)LAVOR要求不同的App-Name/Icon和包名
不同的App-Icon和不同的App-Name寝优,使用上面的方式配置,新增不同的string.xml和不同的icon.png即可枫耳。
包名不同乏矾,使用Gradle去配置,還能配置不同的versionCode和versionName
//聲明維度:產(chǎn)品
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'
}
}
需求三:不同F(xiàn)LAVOR邏輯不同
我們可以把不同的java代碼文件放到不同的flavor中嘉涌,那么打包的時(shí)候就會(huì)打包不同的java代碼文件妻熊,但是這樣不就把代碼的邏輯又分割了嗎?仑最?扔役?所以不推介這么做。我們知道BuidlConfig
中的flavor值不同警医,那代碼中就可以通過(guò)flavor的值去判斷執(zhí)行不同的代碼塊:
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還有很多很棒的用法亿胸,可以參考一下:
點(diǎn)贊互粉送妹子圖喲~