美团Android自动化之旅—适配渠道包
概述
前一篇文章(美團(tuán)Android自動(dòng)化之旅—生成渠道包)介紹了Android中幾種生成渠道包的方式,基本解決了打包慢的問(wèn)題。
但是,隨著渠道越來(lái)越多,不同渠道對(duì)應(yīng)用的要求也不盡相同。例如,有的渠道要求美團(tuán)客戶(hù)端的應(yīng)用名為美團(tuán),有的渠道要求應(yīng)用名為美團(tuán)團(tuán)購(gòu)。又比如,有些渠道要求應(yīng)用不能使用第三方統(tǒng)計(jì)工具(如flurry)。總之,每次打包都需要對(duì)這些渠道進(jìn)行適配。
之前的做法是為每個(gè)需要適配的渠道創(chuàng)建一個(gè)Git分支,發(fā)版時(shí)再切換到相應(yīng)的分支,并合并主分支的代碼。適配的渠道比較少的話(huà)這種方式還可以接受,如果分支比較多,對(duì)開(kāi)發(fā)人員來(lái)說(shuō)簡(jiǎn)直就是噩夢(mèng)。還好,自從有了Gradle flavor,一切都變得簡(jiǎn)單了。本文假定讀者使用過(guò)Gradle,如果還不了解建議先閱讀相關(guān)文檔。
Flavor
先來(lái)看build.gradle文件中的一段代碼:
android {....productFlavors {flavor1 {minSdkVersion 14}} }上例定義了一個(gè)flavor:flavor1,并指定了應(yīng)用的minSdkVersion為14(當(dāng)然還可以配置更多的屬性,具體可參考相關(guān)文檔)。與此同時(shí),Gradle還會(huì)為該flavor關(guān)聯(lián)對(duì)應(yīng)的sourceSet,默認(rèn)位置為src/<flavorName>目錄,對(duì)應(yīng)到本例就是src/flavor1。
接下來(lái),要做的就是根據(jù)具體的需求在build.gradle文件中配置flavor,并添加必要的代碼和資源文件。以flavor1為例,運(yùn)行g(shù)radle assembleFlavor1命令既可生成所需的適配包。下面主要介紹美團(tuán)團(tuán)購(gòu)Android客戶(hù)端的一些適配案例。
案例
使用不同的包名
美團(tuán)團(tuán)購(gòu)Android客戶(hù)端之前有兩個(gè)版本:手機(jī)版(com.meituan.group)和hd版(com.meituan.group.hd),兩個(gè)版本使用了不同的代碼。目前hd版對(duì)應(yīng)的代碼已不再維護(hù),希望能直接使用手機(jī)版的代碼。解決該問(wèn)題可以有多種方法,不過(guò)使用flavor相對(duì)比較簡(jiǎn)單,示例如下:
productFlavors {hd {applicationId "com.meituan.group.hd"} }上面的代碼添加了一個(gè)名為hd的flavor,并指定了應(yīng)用的包名為com.meituan.group.hd,運(yùn)行g(shù)radle assembleHd命令即可生成hd適配包。
控制是否自動(dòng)更新
美團(tuán)團(tuán)購(gòu)Android客戶(hù)端在啟動(dòng)時(shí)會(huì)默認(rèn)檢查客戶(hù)端是否有更新,如果有更新就會(huì)提示用戶(hù)下載。但是有些渠道和應(yīng)用市場(chǎng)不允許這種默認(rèn)行為,所以在適配這些渠道時(shí)需要禁止自動(dòng)更新功能。
解決的思路是提供一個(gè)配置字段,應(yīng)用啟動(dòng)的時(shí)候檢查該字段的值以決定是否開(kāi)啟自動(dòng)更新功能。使用flavor可以完美的解決這類(lèi)問(wèn)題。
Gradle會(huì)在generateSources階段為flavor生成一個(gè)BuildConfig.java文件。BuildConfig類(lèi)默認(rèn)提供了一些常量字段,比如應(yīng)用的版本名(VERSION_NAME),應(yīng)用的包名(PACKAGE_NAME)等。更強(qiáng)大的是,開(kāi)發(fā)者還可以添加自定義的一些字段。下面的示例假設(shè)wandoujia市場(chǎng)默認(rèn)禁止自動(dòng)更新功能:
android {defaultConfig {buildConfigField "boolean", "AUTO_UPDATES", "true"}productFlavors {wandoujia {buildConfigField "boolean", "AUTO_UPDATES", "false"} }}上面的代碼會(huì)在BuildConfig類(lèi)中生成AUTO_UPDATES布爾常量,默認(rèn)值為true,在使用wandoujia flavor時(shí),該值會(huì)被設(shè)置成false。接下來(lái)就可以在代碼中使用AUTO_UPDATES常量來(lái)判斷是否開(kāi)啟自動(dòng)更新功能了。最后,運(yùn)行g(shù)radle assembleWandoujia命令即可生成默認(rèn)不開(kāi)啟自動(dòng)升級(jí)功能的渠道包,是不是很簡(jiǎn)單。
使用不同的應(yīng)用名
最常見(jiàn)的一類(lèi)適配是修改應(yīng)用的資源。例如,美團(tuán)團(tuán)購(gòu)Android客戶(hù)端的應(yīng)用名是美團(tuán),但有的渠道需要把應(yīng)用名修改為美團(tuán)團(tuán)購(gòu);還有,客戶(hù)端經(jīng)常會(huì)和一些應(yīng)用分發(fā)市場(chǎng)合作,需要在應(yīng)用的啟動(dòng)界面中加上第三方市場(chǎng)的Logo,類(lèi)似這類(lèi)適配形式還有很多。 Gradle在構(gòu)建應(yīng)用時(shí),會(huì)優(yōu)先使用flavor所屬dataSet中的同名資源。所以,解決思路就是在flavor的dataSet中添加同名的字符串資源,以覆蓋默認(rèn)的資源。下面以適配wandoujia渠道的應(yīng)用名為美團(tuán)團(tuán)購(gòu)為例進(jìn)行介紹。
首先,在build.gradle配置文件中添加如下flavor:
android {productFlavors {wandoujia { }} }上面的配置會(huì)默認(rèn)src/wandoujia目錄為wandoujia flavor的dataSet。
接下來(lái),在src目錄內(nèi)創(chuàng)建wandoujia目錄,并添加如下應(yīng)用名字符串資源(src/wandoujia/res/values/appname.xml):
<resources><string name="app_name">美團(tuán)團(tuán)購(gòu)</string> </resources>默認(rèn)的應(yīng)用名字符串資源如下(src/main/res/values/strings.xml):
<resources><string name="app_name">美團(tuán)</string> </resources>最后,運(yùn)行g(shù)radle assembleWandoujia命令即可生成應(yīng)用名為美團(tuán)團(tuán)購(gòu)的應(yīng)用了。
使用第三方SDK
某些渠道會(huì)要求客戶(hù)端嵌入第三方SDK來(lái)滿(mǎn)足特定的適配需求。比如360應(yīng)用市場(chǎng)要求美團(tuán)團(tuán)購(gòu)Android客戶(hù)端的精品應(yīng)用模塊使用他們提供的SDK。問(wèn)題的難點(diǎn)在于如何只為特定的渠道添加SDK,其他渠道不引入該SDK。使用flavor可以很好的解決這個(gè)問(wèn)題,下面以為qihu360 flavor引入com.qihoo360.union.sdk:union:1.0 SDK為例進(jìn)行說(shuō)明:
android {productFlavors {qihu360 {}} } ... dependencies {provided 'com.qihoo360.union.sdk:union:1.0'qihu360Compile 'com.qihoo360.union.sdk:union:1.0' }上例添加了名為qihu360的flavor,并且指定編譯和運(yùn)行時(shí)都依賴(lài)com.qihoo360.union.sdk:union:1.0。而其他渠道只是在構(gòu)建的時(shí)候依賴(lài)該SDK,打包的時(shí)候并不會(huì)添加它。
接下來(lái),需要在代碼中使用反射技術(shù)判斷應(yīng)用程序是否添加了該SDK,從而決定是否要顯示360 SDK提供的精品應(yīng)用。部分代碼如下:
class MyActivity extends Activity {private boolean useQihuSdk;@overridepublic void onCreate(Bundle savedInstanceState) {try {Class.forName("com.qihoo360.union.sdk.UnionManager");useQihuSdk = true;} catch (ClassNotFoundException ignored) {}} }最后,運(yùn)行g(shù)radle assembleQihu360命令即可生成包含360精品應(yīng)用模塊的渠道包了。
總結(jié)
適配是一項(xiàng)dirty工作,尤其是適配的渠道比較多的時(shí)候。上面介紹了幾種使用Gradle flavor進(jìn)行適配的例子,基本解決了繁雜的適配工作。
參考資料
- http://www.gradle.org/
- Product flavors
總結(jié)
以上是生活随笔為你收集整理的美团Android自动化之旅—适配渠道包的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Spring Cloud构建微服务架构:
- 下一篇: 灵活强大的构建系统Gradle