国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Android > 正文

Android 打包三種方式實例詳解

2019-12-12 02:58:42
字體:
來源:轉載
供稿:網(wǎng)友

 Android 打包三種方式實例詳解

前言:

現(xiàn)在市場上很多app應用存在于各個不同的渠道,大大小小幾百個,當我們想要在發(fā)布應用之后統(tǒng)計各個渠道的用戶下載量,我們就要進行多渠道打包。

01.應用的打包簽名什么是打包?

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

簽名是什么?

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

2.用來標識不同的應用開發(fā)者:開發(fā)者A,開發(fā)者B

3.一個應用開發(fā)者開發(fā)的多款應用使用同一個簽名

就好比是一個人寫文章,簽名就相當于作者的署名。

如果兩個應用都是一個開發(fā)者開發(fā)的,那么簽名就是一樣的。

這個開發(fā)者,可以是個人,也可以是公司、團體。

為什么要用簽名?原因1:最簡單直接的回答: 系統(tǒng)要求的。

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

原因2:

不同程序員開發(fā)的應用包名可能會相同, 導致一個應用覆蓋掉另一個應用。

如果只有包名的概念,那么如果B應用與已經(jīng)安裝的A應用包名一樣,那就實現(xiàn)覆蓋。不合理!

而事實上是裝不上B的,它會提示,存在包名一致,但是簽名不一樣的。這就不會覆蓋。

如何為APK簽名?

如何簽名就不用說了,這方面的博文數(shù)不勝數(shù),相信看這篇文章的你也應該會。

在代碼中得到應用的簽名?(個人覺得沒啥用)

public void getSingInfo() {  try {    PackageInfo packageInfo = getPackageManager().getPackageInfo(        "應用包名", 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導出APK包時出現(xiàn),編譯調試時不會出現(xiàn)。

錯誤信息:

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]

錯誤截圖:

這里寫圖片描述 

解決辦法:

resources 標簽內增加兩個屬性即可:

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

02.友盟的多渠道打包說明:1.什么是多渠道包?

渠道包就是要在安裝包中添加渠道信息,也就是channel,對應不同的渠道,例如:小米市場、360市場、應用寶市場等

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

我們要在安裝包中添加不同的標識,應用在請求網(wǎng)絡的時候攜帶渠道信息,方便后臺做運營統(tǒng)計(這就是添加渠道信息的用處)。

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

一般來講,這個渠道的標識會放在AndroidManifest.xml的Application的一個Metadata中。然后就可以在java中通過API獲取對應的數(shù)據(jù)了。

4.如何實現(xiàn)?

現(xiàn)在android渠道多種多樣,其實渠道不僅僅局限于應用市場,一種推廣方式也可以看做一個渠道,比如:通過人拉人的方式去推廣,官網(wǎng)上推廣,百度推廣等。所以說渠道成千上萬,為了推廣,有時候一次也會打成千的安裝包,那你半天或者一天啥都別干了,所以介紹幾個大公司高效的打包方式,借鑒一下。

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

實現(xiàn)步驟:

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

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

這段配置,value那里就是wandoujia,360之類的渠道名稱,但是我們在這里不會去寫渠道名,寫的是一個占位符,后面gradle編譯的時候會動態(tài)的替換掉它。

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

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

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

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

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

4、優(yōu)化2:上面經(jīng)過簽名打包后生成的apk的名稱是有默認命名規(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信息來獲取渠道,然后添加到請求參數(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í)行簽名打包
這里寫圖片描述
這時候你去app/build/outputs/apk中就能看到自動打好的渠道包了。

6、缺點:

這樣的打包方式效率比較低下,如果是幾十個包還可以應付,打一個包快的話需要十幾秒,慢的話需要幾分鐘不等,跟機器性能很有關系。

03、美團多渠道打包原理:

把一個Android應用包當作zip文件包進行解壓,然后發(fā)現(xiàn)在簽名生成的目錄下(META-INF)添加一個空文件不需要重新簽名。利用這個機制,該文件的文件名就是渠道名。這種方式不需要重新簽名等步驟,非常高效,但是貌似在Android7.0之后,Google為了增強簽名的安全性,采用了新的簽名規(guī)則,不是針對每個文件來進行數(shù)字編碼,而是對zip包文件結構編碼簽名后產(chǎn)生一個唯一的數(shù)據(jù)叫做apk signing block。如果修改了zip文件的任何模塊的內容,APK Signing Block都會發(fā)生改變,從而無法再繞過簽名機制。

方法:

首先你需要去下載相關的工具:
這里寫圖片描述

詳細步驟:

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

優(yōu)缺點:

優(yōu)點:

這種打包方式速度非常快,900多個渠道不到一分鐘就能打完

缺點:

1、google現(xiàn)在已經(jīng)修改了新的簽名規(guī)則,若使用新的簽名規(guī)則則無法使用(老的無所謂)。

2、一些不法的渠道商很容易通過工具修改渠道,如果一個渠道商,通過網(wǎng)絡劫持和篡改渠道的組合方式來獲取暴利,對于程序開發(fā)者來說可能會存在著巨大的經(jīng)濟損失

04、360多渠道打包:

apk文件本質就是zip文件,利用zip文件“可以添加comment(摘要)”的數(shù)據(jù)結構特點,在文件的末尾寫入任意數(shù)據(jù),而不用重新解壓zip文件,我們就可以將渠道信息寫入摘要區(qū)

方法:

首先還是去下載相關工具:
這里寫圖片描述

步驟:

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

3、將apk拖到MCPTool.bat上執(zhí)行,將會生成渠道包

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

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

6、獲取渠道:將MCPTool.java添加到工程或者將MCPTool.jar導入工程,調用 MCPTool.getChannelId(this,”12345678”,”“) 第一個參數(shù)為context,第二個是密碼,第三個是默認值。

優(yōu)缺點:

優(yōu)點:

1、5M的apk,1秒種能打300個
2、在下載apk的同時,服務端可以寫入一些信息,例如邀請碼,分享信息等

缺點:

渠道信息也是很容易修改,雖然可以加密,只是提高了修改的門檻

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

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 东兴市| 修水县| 玉林市| 通渭县| 扶余县| 林芝县| 普定县| 衡东县| 荥阳市| 徐州市| 融水| 札达县| 沁源县| 威海市| 榆林市| 丰宁| 赣榆县| 渑池县| 平阴县| 丰台区| 长顺县| 南投市| 安阳县| 鄂温| 上栗县| 大理市| 长治市| 沅江市| 筠连县| 天全县| 景谷| 怀安县| 新民市| 永春县| 邵东县| 天峨县| 福贡县| 墨脱县| 连山| 江津市| 酉阳|