android批量打包(多渠道)

參考:https://segmentfault.com/a/1190000003763833

生成keystore

使用命令行

keytool -genkey -v -keystore my-release-key.keystore -alias alias_name -keyalg RSA -keysize 2048 -validity 10000


按上圖命令分別輸入的是簽名文件名,別名父泳,指明生成的是2048位RSA秘鑰,簽名有效期。
一民轴、使用gradle打包

android studio 多渠道打包CMD命令:gradle assembleRelease
需要在命令提示行(管理員)中定位到項(xiàng)目位置盹沈,然后輸入gradle
初始化gradle環(huán)境硼控,然后輸入如上命令。

使用Umeng進(jìn)行渠道統(tǒng)計(jì)动壤,一般都是在manifest文件中寫入一個meta標(biāo)簽,meta的key值固定,通過循環(huán)改變meta中的value值來實(shí)現(xiàn)市場渠道的寫入淮逻。

<meta-data android:name="UMENG_CHANNEL" android:value="Channel_ID" />


a .將渠道名稱都寫到channel.txt中琼懊,然后在build.gradle配置阁簸,讀取文件。

    // productFlavors
    productFlavors {
        def path = "./channel.txt"
        file(path).eachLine { channel ->
            "$channel" {
                manifestPlaceholders = [UMENG_VALUE: channel]
            }
        }
    }

b.直接在build.gradle里面配置渠道名稱

  // 友盟多渠道打包
    productFlavors {
        wandoujia {}
//        _360 {}
//        baidu {}
//        xiaomi {}
//        tencent {}
//        taobao {}
    }

    productFlavors.all { flavor ->
        flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
    }

或者

productFlavors {
    xiaomi {
      manifestPlaceholders = [UMENG_CHANNEL_VALUE: "xiaomi"]
    }
    qihoo {
      manifestPlaceholders = [UMENG_CHANNEL_VALUE: "qihoo"]
    }
    baidu {
      manifestPlaceholders = [UMENG_CHANNEL_VALUE: "baidu"]
    }
    wandoujia {
      manifestPlaceholders = [UMENG_CHANNEL_VALUE: "wandoujia"]
    }
    qq {
      manifestPlaceholders = [UMENG_CHANNEL_VALUE: "qq"]
    }
  }


使用命令進(jìn)行多渠道打包

a. 打包全部渠道

// 打包全部Debug版本
./gradlew assembleDebug


// 打包全部Release版本
./gradlew assembleRelease

b.指定渠道版本 (assemble+Product Flavor)

// 打包wandoujia渠道的Release版本和Debug版本
./gradlew assembleWandoujia


// 打包wandoujia渠道的Release版本
./gradlew assembleWandoujiaRelease


缺點(diǎn):當(dāng)渠道很多的時候哼丈,每一次打包都要進(jìn)行構(gòu)建編譯启妹,執(zhí)行效率低下,耗時長醉旦。

二饶米、美團(tuán)的打包方案

這個方案依賴于google的簽名機(jī)制,如果google改變android的簽名機(jī)制的話這個方案就無法使用了车胡。
Github上有人寫了這個方法的庫:https://github.com/GavinCT/AndroidMultiChannelBuildTool檬输,其博客講解網(wǎng)址為:http://www.cnblogs.com/ct2011/p/4152323.html
美團(tuán)的打包原文網(wǎng)址:http://tech.meituan.com/mt-apk-packaging.html


如果能直接修改apk的渠道號,而不需要再重新簽名能節(jié)省不少打包的時間匈棘。幸運(yùn)的是我們找到了這種方法丧慈。直接解壓apk,解壓后的根目錄會有一個META-INF目錄主卫,如下圖所示:
META-INF目錄

如果在META-INF目錄內(nèi)添加空文件逃默,可以不用重新簽名應(yīng)用。因此簇搅,通過為不同渠道的應(yīng)用添加不同的空文件完域,可以唯一標(biāo)識一個渠道。采用這種方式馍资,每打一個渠道包只需復(fù)制一個apk筒主,在META-INF中添加一個使用渠道號命名的空文件即可。這種打包方式速度非衬裥罚快乌妙,900多個渠道不到一分鐘就能打完。

在META-INF目錄內(nèi)添加空文件建钥,可以不用重新簽名應(yīng)用藤韵。文件名稱可以命名為channel+渠道的唯一標(biāo)識。

生成渠道空文件

然后在需要讀取渠道號的時候熊经,可以在使用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 "";
        }
    }

這樣镐依,每打一個渠道包只需復(fù)制一個apk匹涮,在META-INF中添加一個使用渠道號命名的空文件即可。


常見問題答疑
這部分問題是由美團(tuán)大神丁志虎在微博上答復(fù)的槐壳,摘錄如下:
這個方案沒法解決不同渠道使用渠道自己SDK的問題然低,友盟的SDK提供了在代碼中設(shè)置渠道的方式,所以再獲取到渠道號后再調(diào)用SDK相關(guān)設(shè)置渠道的方法就可以了
apk用的是java那一套簽名,放在META-INF文件夾里的文件原則上是不參與簽名的雳攘。如果Google修改了apk的簽名規(guī)則带兜,這一套可能就不適用了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末吨灭,一起剝皮案震驚了整個濱河市刚照,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌喧兄,老刑警劉巖无畔,帶你破解...
    沈念sama閱讀 222,252評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異繁莹,居然都是意外死亡檩互,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評論 3 399
  • 文/潘曉璐 我一進(jìn)店門咨演,熙熙樓的掌柜王于貴愁眉苦臉地迎上來闸昨,“玉大人,你說我怎么就攤上這事薄风《希” “怎么了?”我有些...
    開封第一講書人閱讀 168,814評論 0 361
  • 文/不壞的土叔 我叫張陵遭赂,是天一觀的道長循诉。 經(jīng)常有香客問我,道長撇他,這世上最難降的妖魔是什么茄猫? 我笑而不...
    開封第一講書人閱讀 59,869評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮困肩,結(jié)果婚禮上划纽,老公的妹妹穿的比我還像新娘。我一直安慰自己锌畸,他們只是感情好勇劣,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著潭枣,像睡著了一般比默。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上盆犁,一...
    開封第一講書人閱讀 52,475評論 1 312
  • 那天命咐,我揣著相機(jī)與錄音,去河邊找鬼谐岁。 笑死醋奠,一個胖子當(dāng)著我的面吹牛瓮下,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播钝域,決...
    沈念sama閱讀 41,010評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼锭魔!你這毒婦竟也來了例证?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,924評論 0 277
  • 序言:老撾萬榮一對情侶失蹤迷捧,失蹤者是張志新(化名)和其女友劉穎织咧,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體漠秋,經(jīng)...
    沈念sama閱讀 46,469評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡笙蒙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了庆锦。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片捅位。...
    茶點(diǎn)故事閱讀 40,680評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖搂抒,靈堂內(nèi)的尸體忽然破棺而出艇搀,到底是詐尸還是另有隱情,我是刑警寧澤求晶,帶...
    沈念sama閱讀 36,362評論 5 351
  • 正文 年R本政府宣布焰雕,位于F島的核電站,受9級特大地震影響芳杏,放射性物質(zhì)發(fā)生泄漏矩屁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評論 3 335
  • 文/蒙蒙 一爵赵、第九天 我趴在偏房一處隱蔽的房頂上張望吝秕。 院中可真熱鬧,春花似錦亚再、人聲如沸郭膛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽则剃。三九已至,卻和暖如春如捅,著一層夾襖步出監(jiān)牢的瞬間棍现,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評論 1 274
  • 我被黑心中介騙來泰國打工镜遣, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留己肮,地道東北人士袄。 一個月前我還...
    沈念sama閱讀 49,099評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像谎僻,于是被迫代替她去往敵國和親娄柳。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評論 2 361

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

  • 目錄一艘绍、Python打包及優(yōu)化(美團(tuán)多渠道打包)二赤拒、Gradle打包三、其他打包方案:修改Zip文件的commen...
    守望君閱讀 5,695評論 4 17
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,309評論 25 707
  • Android多渠道打包 概述 每當(dāng)發(fā)新版本時诱鞠,Android客戶端會被分發(fā)到各個應(yīng)用市場挎挖,比如豌豆莢,360手機(jī)...
    礪雪凝霜閱讀 2,137評論 2 11
  • 說這么多,其實(shí)那是效益主義的觀點(diǎn)(也就是當(dāng)前中國社會的主流觀點(diǎn))阳掐。 并不是我的觀點(diǎn)始衅。 而我這個人最與眾不同的地方,...
    履霜閱讀 738評論 0 1
  • 端午登望云寺有感 據(jù)守雄關(guān)鎮(zhèn)半山锚烦, 朱檐碧瓦隱云間觅闽。 紅塵隔斷三十里, 風(fēng)繞禪房綠水潺涮俄。 鷓鴣天 填詞 點(diǎn)破香箋...
    陳慶利閱讀 122評論 0 2