由于android應(yīng)用分發(fā)渠道無數(shù),很多時候需要對應(yīng)不同的渠道做相應(yīng)的資源文件上甚至功能上的定制,比如上360首發(fā)需要在launcher頁上面加上360logo席覆,有些應(yīng)用市場是禁止應(yīng)用的自動更新功能還有之前上百度市場需要集成sdk跌穗,幸好gradle提供應(yīng)對這個情況的解決方案肤晓,輕松應(yīng)對這個dirty work甥温。
一 Build Variants
假設(shè)我們需要打三個不同的版本的apk励堡,一個供自己官網(wǎng)下載米碰,一個百度市場窝革,一個小米市場。我們在工程build.gradle文件增加如下配置
android {
....
productFlavors {
baidu {
}
xiaomi {
}
other {
}
}
}
然后Build->Generate Signed Apk
genapk.jpeg
最后生成了3個apk
2.genapk.jpeg
*在Android Studio調(diào)試時切換不同的Variants
在Android Studio的最右邊靠下有個Build Variants點開吕座,然后就可以選擇想調(diào)試的Variant
3.variant.jpeg
二 對于不同渠道不同資源的處理
假設(shè)小米應(yīng)用市場和百度應(yīng)用市場都需要在某個頁面打上各自獨家logo虐译,就是需要將drawable/lily_lake.png 在不同渠道打上不同渠道的logo
1. 在src文件創(chuàng)建和上面配置相同的名字的文件夾,具體如下
res.jpeg
2. 在與原資源類似的目錄下添加打上logo的圖片,如下圖吴趴,gradle在打包的時候就會根據(jù)不同的Variant提取相應(yīng)的資源漆诽。
4.jpeg
3. 不僅圖片,字符資源也是可以定制的
假設(shè)我們在百度應(yīng)用市場首發(fā),我們的應(yīng)用名改成 “百度首發(fā)XXX”厢拭。同樣的我們在baidu的資源文件夾下添加一個string資源文件,然后添加:
<resources>
<string name="app_name">百度首發(fā)XXX</string>
</resources>
C8FA4DDE-E3C5-4A11-8CB3-B1A9CE3DB954.png
三 AndroidManifest.xml 以及 BuildCofig.java
1. 在AndroidManifest.xml添加
<meta-data
android:name="UMENG_CHANNEL"
android:value="${UMENG_CHANNEL_VALUE}" />
UMENG_CHANNEL_VALUE 可以在打包的時候根據(jù)不同的variant然后賦值
productFlavors{
baidu{
manifestPlaceholders = [UMENG_CHANNEL_VALUE:"baidu"]
}
other{
manifestPlaceholders = [UMENG_CHANNEL_VALUE:"other"]
}
xiaomi{
manifestPlaceholders = [UMENG_CHANNEL_VALUE:"xiaomi"]
}
}
或這么寫
productFlavors.all { flavor ->
flavor.manifestPlaceholders = [ UMENG_CHANNEL_VALUE:name ]
}
應(yīng)用場景:不同渠道需要建立不同的數(shù)據(jù)統(tǒng)計(使用友盟之類也會用到)兰英,那么我們可以讀取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 可以通過gradle增加其字段
android{
defaultConfig {
...
//添加配置文件字段
buildConfigField "boolean", "AUTO_UPDATES", "true"
}
}
productFlavors{
baidu{
//賦值
buildConfigField "boolean", "AUTO_UPDATES", "false"
}
}
應(yīng)用場景:有的應(yīng)用市場不允許應(yīng)用自動更新供鸠,那么我們BuildCofig.java增加一個字段判斷是否需要增加自動更新功能
if(BuildConfig.AUTO_UPDATES){
// 更新
}else {
// 不自動更新
}