概述
前一篇文章(美團Android自動化之旅—生成渠道包)介紹了Android中幾種生成渠道包的方式,基本解決了打包慢的問題。html
可是,隨着渠道愈來愈多,不一樣渠道對應用的要求也不盡相同。例如,有的渠道要求美團客戶端的應用名爲美團
,有的渠道要求應用名爲美團團購
。又好比,有些渠道要求應用不能使用第三方統計工具(如flurry)。總之,每次打包都須要對這些渠道進行適配。java
以前的作法是爲每一個須要適配的渠道建立一個Git分支,發版時再切換到相應的分支,併合並主分支的代碼。適配的渠道比較少的話這種方式還能夠接受,若是分支比較多,對開發人員來講簡直就是噩夢。還好,自從有了Gradle flavor,一切都變得簡單了。本文假定讀者使用過Gradle,若是還不瞭解建議先閱讀相關文檔。android
Flavor
先來看build.gradle
文件中的一段代碼:app
android { .... productFlavors { flavor1 { minSdkVersion 14 } } }
上例定義了一個flavor:flavor1
,並指定了應用的minSdkVersion
爲14(固然還能夠配置更多的屬性,具體可參考相關文檔)。與此同時,Gradle還會爲該flavor關聯對應的sourceSet
,默認位置爲src/<flavorName>
目錄,對應到本例就是src/flavor1
。ide
接下來,要作的就是根據具體的需求在build.gradle
文件中配置flavor,並添加必要的代碼和資源文件。以flavor1
爲例,運行gradle assembleFlavor1
命令既可生成所需的適配包。下面主要介紹美團團購Android客戶端的一些適配案例。工具
案例
使用不一樣的包名
美團團購Android客戶端以前有兩個版本:手機版(com.meituan.group
)和hd版(com.meituan.group.hd
),兩個版本使用了不一樣的代碼。目前hd版對應的代碼已再也不維護,但願能直接使用手機版的代碼。解決該問題能夠有多種方法,不過使用flavor相對比較簡單,示例以下:gradle
productFlavors { hd { applicationId "com.meituan.group.hd" } }
上面的代碼添加了一個名爲hd
的flavor,並指定了應用的包名爲com.meituan.group.hd
,運行gradle assembleHd
命令便可生成hd適配包。ui
控制是否自動更新
美團團購Android客戶端在啓動時會默認檢查客戶端是否有更新,若是有更新就會提示用戶下載。可是有些渠道和應用市場不容許這種默認行爲,因此在適配這些渠道時須要禁止自動更新功能。code
解決的思路是提供一個配置字段,應用啓動的時候檢查該字段的值以決定是否開啓自動更新功能。使用flavor能夠完美的解決這類問題。xml
Gradle會在generateSources
階段爲flavor生成一個BuildConfig.java
文件。BuildConfig
類默認提供了一些常量字段,好比應用的版本名(VERSION_NAME
),應用的包名(PACKAGE_NAME
)等。更強大的是,開發者還能夠添加自定義的一些字段。下面的示例假設wandoujia
市場默認禁止自動更新功能:
android { defaultConfig { buildConfigField "boolean", "AUTO_UPDATES", "true" } productFlavors { wandoujia { buildConfigField "boolean", "AUTO_UPDATES", "false" } } }
上面的代碼會在BuildConfig
類中生成AUTO_UPDATES
布爾常量,默認值爲true
,在使用wandoujia
flavor時,該值會被設置成false
。接下來就能夠在代碼中使用AUTO_UPDATES
常量來判斷是否開啓自動更新功能了。最後,運行gradle assembleWandoujia
命令便可生成默認不開啓自動升級功能的渠道包,是否是很簡單。
使用不一樣的應用名
最多見的一類適配是修改應用的資源。例如,美團團購Android客戶端的應用名是美團
,但有的渠道須要把應用名修改成美團團購
;還有,客戶端常常會和一些應用分發市場合做,須要在應用的啓動界面中加上第三方市場的Logo,相似這類適配形式還有不少。
Gradle在構建應用時,會優先使用flavor所屬dataSet
中的同名資源。因此,解決思路就是在flavor的dataSet
中添加同名的字符串資源,以覆蓋默認的資源。下面以適配wandoujia
渠道的應用名爲美團團購
爲例進行介紹。
首先,在build.gradle
配置文件中添加以下flavor:
android { productFlavors { wandoujia { } } }
上面的配置會默認src/wandoujia
目錄爲wandoujia
flavor的dataSet
。
接下來,在src
目錄內建立wandoujia
目錄,並添加以下應用名字符串資源(src/wandoujia/res/values/appname.xml
):
<resources> <string name="app_name">美團團購</string> </resources>
默認的應用名字符串資源以下(src/main/res/values/strings.xml
):
<resources> <string name="app_name">美團</string> </resources>
最後,運行gradle assembleWandoujia
命令便可生成應用名爲美團團購
的應用了。
使用第三方SDK
某些渠道會要求客戶端嵌入第三方SDK來知足特定的適配需求。好比360應用市場要求美團團購Android客戶端的精品應用
模塊使用他們提供的SDK。問題的難點在於如何只爲特定的渠道添加SDK,其餘渠道不引入該SDK。使用flavor能夠很好的解決這個問題,下面覺得qihu360
flavor引入com.qihoo360.union.sdk:union:1.0
SDK爲例進行說明:
android { productFlavors { qihu360 { } } } ... dependencies { provided 'com.qihoo360.union.sdk:union:1.0' qihu360Compile 'com.qihoo360.union.sdk:union:1.0' }
上例添加了名爲qihu360
的flavor,而且指定編譯和運行時都依賴com.qihoo360.union.sdk:union:1.0
。而其餘渠道只是在構建的時候依賴該SDK,打包的時候並不會添加它。
接下來,須要在代碼中使用反射技術判斷應用程序是否添加了該SDK,從而決定是否要顯示360 SDK提供的精品應用
。部分代碼以下:
class MyActivity extends Activity { private boolean useQihuSdk; @override public void onCreate(Bundle savedInstanceState) { try { Class.forName("com.qihoo360.union.sdk.UnionManager"); useQihuSdk = true; } catch (ClassNotFoundException ignored) { } } }
最後,運行gradle assembleQihu360
命令便可生成包含360精品應用
模塊的渠道包了。
總結
適配是一項dirty工做,尤爲是適配的渠道比較多的時候。上面介紹了幾種使用Gradle flavor進行適配的例子,基本解決了繁雜的適配工做。