由于android應(yīng)用分發(fā)渠道無(wú)數(shù),很多時(shí)候需要對(duì)應(yīng)不同的渠道做相應(yīng)的資源文件上甚至功能上的定制,比如上360首發(fā)需要在launcher頁(yè)上面加上360logo,有些應(yīng)用市場(chǎng)是禁止應(yīng)用的自動(dòng)更新功能還有之前上百度市場(chǎng)需要集成sdk,幸好gradle提供應(yīng)對(duì)這個(gè)情況的解決方案,輕松應(yīng)對(duì)這個(gè)dirty work。
一 Build Variants
假設(shè)我們需要打三個(gè)不同的版本的apk,一個(gè)供自己官網(wǎng)下載,一個(gè)百度市場(chǎng),一個(gè)小米市場(chǎng)。我們?cè)诠こ蘠uild.gradle文件增加如下配置
android {
....
productFlavors {
baidu {
}
xiaomi {
}
other {
}
}
}
然后Build->Generate Signed Apk

最后生成了3個(gè)apk

*在Android Studio調(diào)試時(shí)切換不同的Variants
在Android Studio的最右邊靠下有個(gè)Build Variants點(diǎn)開(kāi),然后就可以選擇想調(diào)試的Variant

二 對(duì)于不同渠道不同資源的處理
假設(shè)小米應(yīng)用市場(chǎng)和百度應(yīng)用市場(chǎng)都需要在某個(gè)頁(yè)面打上各自獨(dú)家logo,就是需要將drawable/lily_lake.png 在不同渠道打上不同渠道的logo
1. 在src文件創(chuàng)建和上面配置相同的名字的文件夾,具體如下

2. 在與原資源類(lèi)似的目錄下添加打上logo的圖片,如下圖,gradle在打包的時(shí)候就會(huì)根據(jù)不同的Variant提取相應(yīng)的資源。

3. 不僅圖片,字符資源也是可以定制的
假設(shè)我們?cè)诎俣葢?yīng)用市場(chǎng)首發(fā),我們的應(yīng)用名改成 “百度首發(fā)XXX”。同樣的我們?cè)赽aidu的資源文件夾下添加一個(gè)string資源文件,然后添加:
<resources>
<string name="app_name">百度首發(fā)XXX</string>
</resources>

三 AndroidManifest.xml 以及 BuildCofig.java
1. 在AndroidManifest.xml添加
<meta-data
android:name="UMENG_CHANNEL"
android:value="${UMENG_CHANNEL_VALUE}" />
UMENG_CHANNEL_VALUE 可以在打包的時(shí)候根據(jù)不同的variant然后賦值
productFlavors{
baidu{
manifestPlaceholders = [UMENG_CHANNEL_VALUE:"baidu"]
}
other{
manifestPlaceholders = [UMENG_CHANNEL_VALUE:"other"]
}
xiaomi{
manifestPlaceholders = [UMENG_CHANNEL_VALUE:"xiaomi"]
}
}
或這么寫(xiě)
productFlavors.all { flavor ->
flavor.manifestPlaceholders = [ UMENG_CHANNEL_VALUE:name ]
}
應(yīng)用場(chǎng)景:不同渠道需要建立不同的數(shù)據(jù)統(tǒng)計(jì)(使用友盟之類(lèi)也會(huì)用到),那么我們可以讀取AndroidManifest該應(yīng)用的分發(fā)渠道。
ApplicationInfo appInfo = null;
try {
appInfo = getPackageManager()
.getApplicationInfo(getPackageName(),
PackageManager.GET_META_DATA);
String msg=appInfo.metaData.getString("UMENG_CHANNEL");
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
2. BuildCofig.java 可以通過(guò)gradle增加其字段
android{
defaultConfig {
...
//添加配置文件字段
buildConfigField "boolean", "AUTO_UPDATES", "true"
}
}
productFlavors{
baidu{
//賦值
buildConfigField "boolean", "AUTO_UPDATES", "false"
}
}
應(yīng)用場(chǎng)景:有的應(yīng)用市場(chǎng)不允許應(yīng)用自動(dòng)更新,那么我們BuildCofig.java增加一個(gè)字段判斷是否需要增加自動(dòng)更新功能
if(BuildConfig.AUTO_UPDATES){
// 更新
}else {
// 不自動(dòng)更新
}