如何利用Gradle機(jī)制多渠道打包

Android的應(yīng)用市場(chǎng)很多,簡(jiǎn)單羅列就有 360、應(yīng)用寶、小米、百度、安卓、91、搜狗、華為、豌豆莢、機(jī)鋒 等等,為了區(qū)分不同市場(chǎng)的推廣效果,一般產(chǎn)品經(jīng)理會(huì)要求在不同的市場(chǎng)上上架的apk有一個(gè)唯一的標(biāo)志,這個(gè)標(biāo)志被稱為渠道號(hào),一般結(jié)合友盟統(tǒng)計(jì)一起用,可以在友盟后臺(tái)上看不同渠道的推廣效果。

那怎么樣快速地打出多個(gè)渠道包呢?
??在Eclipse+ADT時(shí)代,最佳方案是美團(tuán)研發(fā)團(tuán)隊(duì)研究出來(lái)的,利用空文件不影響應(yīng)用簽名驗(yàn)證的原理,可以1分鐘內(nèi)打完900多個(gè)渠道的包。
操作步驟如下:

  1. 編譯出一個(gè)原始的不帶渠道的apk
  2. 利用腳本在apk中添加空的渠道文件,渠道名的前綴為mtchannel_:
import zipfile
zipped = zipfile.ZipFile(your_apk, 'a', zipfile.ZIP_DEFLATED) 
empty_channel_file = "META-INF/mtchannel_{channel}".format(channel=your_channel)
zipped.write(your_empty_file, empty_channel_file)
  1. 在Java代碼中讀取空渠道文件名
public static String getChannel(Context context) {
    ApplicationInfo appinfo = context.getApplicationInfo();
    String sourceDir = appinfo.sourceDir;
    String ret = "";
    ZipFile zipfile = null;
    try {
        zipfile = new ZipFile(sourceDir);
        Enumeration<?> entries = zipfile.entries();
        while (entries.hasMoreElements()) {
            ZipEntry entry = ((ZipEntry) entries.nextElement());
            String entryName = entry.getName();
            if (entryName.startsWith("mtchannel")) {
                ret = entryName;
                break;
            }
        }
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (zipfile != null) {
            try {
                zipfile.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    String[] split = ret.split("_");
    if (split != null && split.length >= 2) {
        return ret.substring(split[0].length() + 1);

    } else {
        return "";
    }
}

現(xiàn)在步入了Android Studio+Gradle的時(shí)代,我們也可以利用Gradle的productFlavors機(jī)制來(lái)做多渠道打包。以友盟為例,操作步驟如下:

  1. 在 AndroidManifest.xml中修改UMENG_CHANNEL
<meta-data android:name="UMENG_CHANNEL" 
android:value="${UMENG_CHANNEL_VALUE}" />
  1. 在模塊下的build.gradle文件中增加
android{
    productFlavors {
      yingyongbao{}
      baidu{}
      anzhuo{}
      jiuyi91{}
      sanliuling360{}
      sougou{}
      huawei{}
      xiaomik{}
      wandoujia{}
      jifeng{}
      productFlavors.all { flavor ->
          flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
      }
    }
}
  1. 在項(xiàng)目文件夾下執(zhí)行命令gradlew assembleRelease
  2. 最后在build/outputs/apk下面就能看到生成的包了。

這種方式,簡(jiǎn)單方便不用寫腳本,但是耗時(shí)比較長(zhǎng),10個(gè)渠道打包要3~4分鐘,從時(shí)效上來(lái)看,還是美團(tuán)提供的方法比較好。

打完包之后,要驗(yàn)證一下,同樣以友盟統(tǒng)計(jì)為例,怎么樣知道自己的渠道號(hào)有沒(méi)有修改成功呢?

  1. 把設(shè)備在友盟后臺(tái)注冊(cè)為測(cè)試設(shè)備
  2. 在代碼中打開(kāi)調(diào)試開(kāi)關(guān)
MobclickAgent.setDebugMode( true );
  1. 點(diǎn)擊不同頁(yè)面,在logcat中查看MobclickAgent標(biāo)簽的信息,看到信息上傳后,去友盟后臺(tái)統(tǒng)計(jì)到的渠道是否符合預(yù)期。

參考:

  1. 美團(tuán)Android自動(dòng)化之旅—生成渠道包
  2. [Android Studio] Android studio 多渠道打包(超簡(jiǎn)潔版)

Panda
2016-08-25

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容