Android多渠道打包三種方式

前言:

現(xiàn)在市場(chǎng)上很多app應(yīng)用存在于各個(gè)不同的渠道歧譬,大大小小幾百個(gè),
當(dāng)我們想要在發(fā)布應(yīng)用之后統(tǒng)計(jì)各個(gè)渠道的用戶下載量疼约,我們就要進(jìn)行多渠道打包导饲。

01.應(yīng)用的打包簽名

什么是打包浇垦?

打包就是根據(jù)簽名和其他標(biāo)識(shí)生成安裝包。

簽名是什么兆沙?

1.在android應(yīng)用文件(apk)中保存的一個(gè)特別字符串

2.用來標(biāo)識(shí)不同的應(yīng)用開發(fā)者:開發(fā)者A,開發(fā)者B

3.一個(gè)應(yīng)用開發(fā)者開發(fā)的多款應(yīng)用使用同一個(gè)簽名
就好比是一個(gè)人寫文章欧芽,簽名就相當(dāng)于作者的署名。
如果兩個(gè)應(yīng)用都是一個(gè)開發(fā)者開發(fā)的葛圃,那么簽名就是一樣的千扔。
這個(gè)開發(fā)者憎妙,可以是個(gè)人,也可以是公司曲楚、團(tuán)體厘唾。

為什么要用簽名?

原因1:最簡單直接的回答: 系統(tǒng)要求的龙誊。

Android系統(tǒng)要求每一個(gè)Android應(yīng)用程序必須要經(jīng)過數(shù)字簽名才能夠安裝到系統(tǒng)中抚垃,也就是說如果一個(gè)Android應(yīng)用程序沒有經(jīng)過數(shù)字簽名,是沒有辦法安裝到系統(tǒng)中的载迄!

原因2:

不同程序員開發(fā)的應(yīng)用包名可能會(huì)相同, 導(dǎo)致一個(gè)應(yīng)用覆蓋掉另一個(gè)應(yīng)用讯柔。
如果只有包名的概念,那么如果B應(yīng)用與已經(jīng)安裝的A應(yīng)用包名一樣护昧,那就實(shí)現(xiàn)覆蓋魂迄。不合理!
而事實(shí)上是裝不上B的惋耙,它會(huì)提示捣炬,存在包名一致,但是簽名不一樣的绽榛。這就不會(huì)覆蓋湿酸。

如何為APK簽名?

如何簽名就不用說了灭美,這方面的博文數(shù)不勝數(shù)推溃,相信看這篇文章的你也應(yīng)該會(huì)。

在代碼中得到應(yīng)用的簽名届腐?(個(gè)人覺得沒啥用)


public void getSingInfo() {
    try {
        PackageInfo packageInfo = getPackageManager().getPackageInfo(
                "應(yīng)用包名", PackageManager.GET_SIGNATURES);
        Signature[] signs = packageInfo.signatures;
        Signature sign = signs[0];
        parseSignature(sign.toByteArray());
    } catch (Exception e) {
        e.printStackTrace();
    }
}
public void parseSignature(byte[] signature) {
    try {
        CertificateFactory certFactory = CertificateFactory
                .getInstance("X.509");
        X509Certificate cert = (X509Certificate) certFactory
                .generateCertificate(new ByteArrayInputStream(signature));
        String pubKey = cert.getPublicKey().toString();
        String signNumber = cert.getSerialNumber().toString();
        Log.e("TAG", "pubKey:" + pubKey);
        Log.e("TAG", "signNumber:" + signNumber);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

注意問題:

現(xiàn)象:
Android導(dǎo)出APK包時(shí)出現(xiàn)铁坎,編譯調(diào)試時(shí)不會(huì)出現(xiàn)。
錯(cuò)誤信息:
Error:(16) Error: “baidutieba_client_inavailable” is not translated in “en” (English) [MissingTranslation]
Error:(63) Error: “baidutieba” is not translated in “en” (English) [MissingTranslation]
Error:(67) Error: “share_to_baidutieba” is not translated in “en” (English) [MissingTranslation]
錯(cuò)誤截圖:

這里寫圖片描述

解決辦法:
resources 標(biāo)簽內(nèi)增加兩個(gè)屬性即可:

<?xml version="1.0" encoding="utf-8" ?>  
<resources xmlns:tools="http://schemas.android.com/tools"  
  tools:ignore="MissingTranslation">  
</resources>

02.友盟的多渠道打包

說明:

1.什么是多渠道包犁苏?

渠道包就是要在安裝包中添加渠道信息硬萍,也就是channel,對(duì)應(yīng)不同的渠道围详,例如:小米市場(chǎng)朴乖、360市場(chǎng)、應(yīng)用寶市場(chǎng)等

2.為什么要提供多渠道包助赞?

我們要在安裝包中添加不同的標(biāo)識(shí)买羞,應(yīng)用在請(qǐng)求網(wǎng)絡(luò)的時(shí)候攜帶渠道信息,方便后臺(tái)做運(yùn)營統(tǒng)計(jì)(這就是添加渠道信息的用處)雹食。

3.實(shí)現(xiàn)多渠道打包的原理:

一般來講哩都,這個(gè)渠道的標(biāo)識(shí)會(huì)放在AndroidManifest.xml的Application的一個(gè)Metadata中。然后就可以在java中通過API獲取對(duì)應(yīng)的數(shù)據(jù)了婉徘。

4.如何實(shí)現(xiàn)漠嵌?

現(xiàn)在android渠道多種多樣咐汞,其實(shí)渠道不僅僅局限于應(yīng)用市場(chǎng),一種推廣方式也可以看做一個(gè)渠道儒鹿,比如:通過人拉人的方式去推廣化撕,官網(wǎng)上推廣,百度推廣等约炎。所以說渠道成千上萬植阴,為了推廣,有時(shí)候一次也會(huì)打成千的安裝包圾浅,那你半天或者一天啥都別干了掠手,所以介紹幾個(gè)大公司高效的打包方式,借鑒一下狸捕。

第一種:友盟就提供了多渠道打包的方式喷鸽,可用于渠道統(tǒng)計(jì)等。
現(xiàn)在Android的構(gòu)建工具換成了gradle灸拍,通過gradle做祝,簡單配置后就可以實(shí)現(xiàn)自動(dòng)打所有渠道包。

實(shí)現(xiàn)步驟:

1.按照umeng的要求鸡岗,manifest文件中需要有


<meta-data
 android:name="UMENG_CHANNEL"
 android:value="${UMENG_CHANNEL_VALUE}" />

這段配置混槐,value那里就是wandoujia,360之類的渠道名稱轩性,但是我們?cè)谶@里不會(huì)去寫渠道名声登,寫的是一個(gè)占位符,后面gradle編譯的時(shí)候會(huì)動(dòng)態(tài)的替換掉它揣苏。

2悯嗓、在module(一般也就是app)的build.gradle的android{}中添加如下內(nèi)容:

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

productFlavors是android節(jié)點(diǎn)的一個(gè)自節(jié)點(diǎn)。你需要打什么渠道的包舒岸,就在這里按umeng的要求用渠道名給UMENG_CHANNEL_VALUE賦值。

3芦圾、優(yōu)化1:上面只是兩個(gè)渠道蛾派,如果有幾十個(gè)渠道,都這樣寫个少,重復(fù)的東西太多洪乍,觀察到每個(gè)渠道就是flavor的名稱,所以修改如下:

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

4夜焦、優(yōu)化2:上面經(jīng)過簽名打包后生成的apk的名稱是有默認(rèn)命名規(guī)則的壳澳,如:xxx-xiaomi-release.apk 但是我們想包含版本信息如:xxx-xiaomi-release-1.0.apk,所以最終打包腳本如下:

productFlavors{
    wandoujia{
 
    }
    xiaomi{
 
    }
 }
 productFlavors.all { flavor ->
    flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
 }
 applicationVariants.all { variant ->
    variant.outputs.each { output ->
        def outputFile = output.outputFile
        if (outputFile != null && outputFile.name.endsWith('.apk')) {
            def fileName = outputFile.name.replace(".apk", "-${defaultConfig.versionName}.apk")
            output.outputFile = new File(outputFile.parent, fileName)
        }
    }
 }

4.獲取渠道
在代碼中我們可以通過讀取mate-data信息來獲取渠道,然后添加到請(qǐng)求參數(shù)中茫经,獲取方法如下:


private String getChannel() {
   try {
       PackageManager pm = getPackageManager();
       ApplicationInfo appInfo = pm.getApplicationInfo(getPackageName(), PackageManager.GET_META_DATA);
       return appInfo.metaData.getString("UMENG_CHANNEL");
   } catch (PackageManager.NameNotFoundException ignored) {
   }
   return "";
}

5巷波、執(zhí)行簽名打包


這里寫圖片描述

這時(shí)候你去app/build/outputs/apk中就能看到自動(dòng)打好的渠道包了萎津。

6、缺點(diǎn):
這樣的打包方式效率比較低下抹镊,如果是幾十個(gè)包還可以應(yīng)付锉屈,打一個(gè)包快的話需要十幾秒,慢的話需要幾分鐘不等垮耳,跟機(jī)器性能很有關(guān)系颈渊。

03、美團(tuán)多渠道打包

原理:

把一個(gè)Android應(yīng)用包當(dāng)作zip文件包進(jìn)行解壓终佛,然后發(fā)現(xiàn)在簽名生成的目錄下(META-INF)添加一個(gè)空文件不需要重新簽名俊嗽。利用這個(gè)機(jī)制,該文件的文件名就是渠道名铃彰。這種方式不需要重新簽名等步驟绍豁,非常高效,但是貌似在Android7.0之后豌研,Google為了增強(qiáng)簽名的安全性妹田,采用了新的簽名規(guī)則,不是針對(duì)每個(gè)文件來進(jìn)行數(shù)字編碼鹃共,而是對(duì)zip包文件結(jié)構(gòu)編碼簽名后產(chǎn)生一個(gè)唯一的數(shù)據(jù)叫做apk signing block鬼佣。如果修改了zip文件的任何模塊的內(nèi)容,APK Signing Block都會(huì)發(fā)生改變霜浴,從而無法再繞過簽名機(jī)制晶衷。

方法:

首先你需要去下載相關(guān)的工具:


這里寫圖片描述

詳細(xì)步驟:

1、將要打包的apk放到PythonTool中
2阴孟、在PythonTool/info/channel.txt中寫入需要的渠道晌纫,一個(gè)渠道占一行
3、雙擊執(zhí)行PythonTool/MultiChannelBuildTool.py文件(需要Python環(huán)境)永丝,就會(huì)生成渠道包
4锹漱、獲取渠道信息:將JavaUtil文件中的ChannelUtil.java拷貝到工程,調(diào)用ChannelUtil.getChannel即可獲取渠道.

優(yōu)缺點(diǎn):

優(yōu)點(diǎn):
這種打包方式速度非衬饺拢快哥牍,900多個(gè)渠道不到一分鐘就能打完

缺點(diǎn):
1、google現(xiàn)在已經(jīng)修改了新的簽名規(guī)則喝检,若使用新的簽名規(guī)則則無法使用(老的無所謂)嗅辣。
2、一些不法的渠道商很容易通過工具修改渠道挠说,如果一個(gè)渠道商澡谭,通過網(wǎng)絡(luò)劫持和篡改渠道的組合方式來獲取暴利,對(duì)于程序開發(fā)者來說可能會(huì)存在著巨大的經(jīng)濟(jì)損失

04损俭、360多渠道打包:

apk文件本質(zhì)就是zip文件,利用zip文件“可以添加comment(摘要)”的數(shù)據(jù)結(jié)構(gòu)特點(diǎn)蛙奖,在文件的末尾寫入任意數(shù)據(jù)潘酗,而不用重新解壓zip文件,我們就可以將渠道信息寫入摘要區(qū)

方法:

首先還是去下載相關(guān)工具:


這里寫圖片描述

步驟:

1外永、將要寫入渠道信息的apk放入MCPTool文件夾中
2崎脉、修改MCPTool.bat批處理文件,更改渠道和密碼(渠道信息為了安全需要加密)

3伯顶、將apk拖到MCPTool.bat上執(zhí)行囚灼,將會(huì)生成渠道包

4、修改MCPTool-check.bat中的密碼和MCPTool.bat中的密碼一致

5祭衩、將渠道包拖到MCPTool-check.bat上執(zhí)行灶体,就可以檢查渠道信息是否正確

6、獲取渠道:將MCPTool.java添加到工程或者將MCPTool.jar導(dǎo)入工程掐暮,調(diào)用
MCPTool.getChannelId(this,”12345678”,”“) 第一個(gè)參數(shù)為context蝎抽,第二個(gè)是密碼,第三個(gè)是默認(rèn)值路克。

優(yōu)缺點(diǎn):

優(yōu)點(diǎn):
1樟结、5M的apk,1秒種能打300個(gè)
2精算、在下載apk的同時(shí)瓢宦,服務(wù)端可以寫入一些信息,例如邀請(qǐng)碼灰羽,分享信息等

缺點(diǎn):
渠道信息也是很容易修改驮履,雖然可以加密,只是提高了修改的門檻

以上就是多渠道打包的一些方法廉嚼,目前大部分公司常用的還是友盟的打包方式玫镐。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市怠噪,隨后出現(xiàn)的幾起案子恐似,更是在濱河造成了極大的恐慌,老刑警劉巖傍念,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件矫夷,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡捂寿,警方通過查閱死者的電腦和手機(jī)口四,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門孵运,熙熙樓的掌柜王于貴愁眉苦臉地迎上來秦陋,“玉大人,你說我怎么就攤上這事治笨〔蹈牛” “怎么了赤嚼?”我有些...
    開封第一講書人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長顺又。 經(jīng)常有香客問我更卒,道長,這世上最難降的妖魔是什么稚照? 我笑而不...
    開封第一講書人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任蹂空,我火速辦了婚禮,結(jié)果婚禮上果录,老公的妹妹穿的比我還像新娘上枕。我一直安慰自己,他們只是感情好弱恒,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開白布辨萍。 她就那樣靜靜地躺著,像睡著了一般返弹。 火紅的嫁衣襯著肌膚如雪锈玉。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,679評(píng)論 1 305
  • 那天义起,我揣著相機(jī)與錄音拉背,去河邊找鬼。 笑死并扇,一個(gè)胖子當(dāng)著我的面吹牛去团,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播穷蛹,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼土陪,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了肴熏?” 一聲冷哼從身側(cè)響起鬼雀,我...
    開封第一講書人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蛙吏,沒想到半個(gè)月后源哩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鸦做,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年励烦,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片泼诱。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡坛掠,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情屉栓,我是刑警寧澤舷蒲,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站友多,受9級(jí)特大地震影響牲平,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜域滥,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一纵柿、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧启绰,春花似錦藐窄、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至撤缴,卻和暖如春刹枉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背屈呕。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來泰國打工微宝, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人虎眨。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓蟋软,卻偏偏與公主長得像,于是被迫代替她去往敵國和親嗽桩。 傳聞我的和親對(duì)象是個(gè)殘疾皇子岳守,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355