美團Android自動化之旅—適配渠道包

概述

前一篇文章(美團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/flavor1ide

接下來,要作的就是根據具體的需求在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進行適配的例子,基本解決了繁雜的適配工做。

參考資料

相關文章
相關標籤/搜索