Android 打包三種方式實(shí)例詳解
Android 打包三種方式實(shí)例詳解
前言:
現(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.用來(lái)標(biāo)識(shí)不同的應(yīng)用開(kāi)發(fā)者:開(kāi)發(fā)者A,開(kāi)發(fā)者B
3.一個(gè)應(yīng)用開(kāi)發(fā)者開(kāi)發(fā)的多款應(yīng)用使用同一個(gè)簽名
就好比是一個(gè)人寫(xiě)文章,簽名就相當(dāng)于作者的署名。
如果兩個(gè)應(yīng)用都是一個(gè)開(kāi)發(fā)者開(kāi)發(fā)的,那么簽名就是一樣的。
這個(gè)開(kāi)發(fā)者,可以是個(gè)人,也可以是公司、團(tuán)體。
為什么要用簽名?原因1:最簡(jiǎn)單直接的回答: 系統(tǒng)要求的。
Android系統(tǒng)要求每一個(gè)Android應(yīng)用程序必須要經(jīng)過(guò)數(shù)字簽名才能夠安裝到系統(tǒng)中,也就是說(shuō)如果一個(gè)Android應(yīng)用程序沒(méi)有經(jīng)過(guò)數(shù)字簽名,是沒(méi)有辦法安裝到系統(tǒng)中的!
原因2:
不同程序員開(kāi)發(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簽名?
如何簽名就不用說(shuō)了,這方面的博文數(shù)不勝數(shù),相信看這篇文章的你也應(yīng)該會(huì)。
在代碼中得到應(yīng)用的簽名?(個(gè)人覺(jué)得沒(méi)啥用)
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(); } }
注意問(wèn)題:
現(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.友盟的多渠道打包說(shuō)明: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)營(yíng)統(tǒng)計(jì)(這就是添加渠道信息的用處)。
3.實(shí)現(xiàn)多渠道打包的原理:
一般來(lái)講,這個(gè)渠道的標(biāo)識(shí)會(huì)放在AndroidManifest.xml的Application的一個(gè)Metadata中。然后就可以在java中通過(guò)API獲取對(duì)應(yīng)的數(shù)據(jù)了。
4.如何實(shí)現(xiàn)?
現(xiàn)在android渠道多種多樣,其實(shí)渠道不僅僅局限于應(yīng)用市場(chǎng),一種推廣方式也可以看做一個(gè)渠道,比如:通過(guò)人拉人的方式去推廣,官網(wǎng)上推廣,百度推廣等。所以說(shuō)渠道成千上萬(wàn),為了推廣,有時(shí)候一次也會(huì)打成千的安裝包,那你半天或者一天啥都別干了,所以介紹幾個(gè)大公司高效的打包方式,借鑒一下。
第一種:友盟就提供了多渠道打包的方式,可用于渠道統(tǒng)計(jì)等。
現(xiàn)在Android的構(gòu)建工具換成了gradle,通過(guò)gradle,簡(jiǎn)單配置后就可以實(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ì)去寫(xiě)渠道名,寫(xiě)的是一個(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è)渠道,都這樣寫(xiě),重復(fù)的東西太多,觀察到每個(gè)渠道就是flavor的名稱,所以修改如下:
productFlavors{ wandoujia{ } xiaomi{ } } productFlavors.all { flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name] }
4、優(yōu)化2:上面經(jīng)過(guò)簽名打包后生成的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.獲取渠道
在代碼中我們可以通過(guò)讀取mate-data信息來(lái)獲取渠道,然后添加到請(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è)文件來(lái)進(jìn)行數(shù)字編碼,而是對(duì)zip包文件結(jié)構(gòu)編碼簽名后產(chǎn)生一個(gè)唯一的數(shù)據(jù)叫做apk signing block。如果修改了zip文件的任何模塊的內(nèi)容,APK Signing Block都會(huì)發(fā)生改變,從而無(wú)法再繞過(guò)簽名機(jī)制。
方法:
首先你需要去下載相關(guān)的工具:
詳細(xì)步驟:
1、將要打包的apk放到PythonTool中
2、在PythonTool/info/channel.txt中寫(xiě)入需要的渠道,一個(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ī)則則無(wú)法使用(老的無(wú)所謂)。
2、一些不法的渠道商很容易通過(guò)工具修改渠道。
04、360多渠道打包:
apk文件本質(zhì)就是zip文件,利用zip文件“可以添加comment(摘要)”的數(shù)據(jù)結(jié)構(gòu)特點(diǎn),在文件的末尾寫(xiě)入任意數(shù)據(jù),而不用重新解壓zip文件,我們就可以將渠道信息寫(xiě)入摘要區(qū)
方法:
首先還是去下載相關(guān)工具:
步驟:
1、將要寫(xiě)入渠道信息的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ù)端可以寫(xiě)入一些信息,例如邀請(qǐng)碼,分享信息等
缺點(diǎn):
渠道信息也是很容易修改,雖然可以加密,只是提高了修改的門(mén)檻
以上就是多渠道打包的一些方法,目前大部分公司常用的還是友盟的打包方式。
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
相關(guān)文章
Android?配合Mat工具監(jiān)聽(tīng)查找內(nèi)存泄漏的操作方法
這篇文章主要介紹了Android?配合Mat工具監(jiān)聽(tīng)查找內(nèi)存泄漏問(wèn)題,使用Android Studio Profiler查看內(nèi)存的操作,本文通過(guò)圖文實(shí)例相結(jié)合給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-05-05詳解Android如何實(shí)現(xiàn)不同大小的圓角
在開(kāi)發(fā)過(guò)程中,設(shè)計(jì)常常會(huì)有一些比較炫酷的想法,比如兩邊不一樣大小的圓角啦,甚至四角的radius各不相同,對(duì)于這種情況我們?cè)撛趺磳?shí)現(xiàn)呢,本文小編就和大家來(lái)聊聊,需要的朋友可以參考下2023-08-08AndroidQ分區(qū)存儲(chǔ)權(quán)限變更及適配的實(shí)現(xiàn)
這篇文章主要介紹了AndroidQ分區(qū)存儲(chǔ)權(quán)限變更及適配的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06Android通過(guò)ConnectivityManager檢查網(wǎng)絡(luò)狀態(tài)
這篇文章主要為大家詳細(xì)介紹了Android通過(guò)ConnectivityManager檢查網(wǎng)絡(luò)狀態(tài)的相關(guān)資料,感興趣的小伙伴們可以參考一下2016-08-08Android自定義控件實(shí)現(xiàn)簡(jiǎn)單滑動(dòng)開(kāi)關(guān)效果
這篇文章主要為大家詳細(xì)介紹了Android自定義控件實(shí)現(xiàn)簡(jiǎn)單滑動(dòng)開(kāi)關(guān)效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02Android開(kāi)發(fā)中Signal背后的bug與解決
這篇文章主要為大家介紹了Android開(kāi)發(fā)中Signal背后的bug與解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11Kotlin中l(wèi)et()with()run()apply()also()函數(shù)的使用方法與區(qū)別
在Kotlin中的源碼標(biāo)準(zhǔn)庫(kù)(Standard.kt)中提供了一些Kotlin擴(kuò)展的內(nèi)置函數(shù)可以優(yōu)化kotlin的編碼,今天為大家聊聊let,with,run,apply,also幾個(gè)函數(shù)的用法與區(qū)別2018-03-03Android開(kāi)發(fā)InputManagerService創(chuàng)建與啟動(dòng)流程
這篇文章主要為大家介紹了Android開(kāi)發(fā)InputManagerService創(chuàng)建與啟動(dòng)流程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11Android如何實(shí)現(xiàn)APP自動(dòng)更新
現(xiàn)在一般的android軟件都是需要不斷更新的,當(dāng)你打開(kāi)某個(gè)app的時(shí)候,如果有新的版本,它會(huì)提示你有新版本需要更新。該小程序?qū)崿F(xiàn)的就是這個(gè)功能。有需要的朋友們可以參考借鑒。2016-08-08Android編程實(shí)現(xiàn)根據(jù)不同日期計(jì)算天數(shù)差的方法
這篇文章主要介紹了Android編程實(shí)現(xiàn)根據(jù)不同日期計(jì)算天數(shù)差的方法,涉及Android調(diào)用日期類Calendar實(shí)現(xiàn)時(shí)間運(yùn)算的相關(guān)技巧,需要的朋友可以參考下2016-03-03