打包工具
Android打包工具,100個渠道包只需要10秒鐘
重要說明:1.若360等需要加固的渠道,先加固,再打渠道包(注意注意注意)
? ? ? ? ? ? ? ? ? 2.使用最新版SDK(Android Gradle Plugin 2.2.0+)時,請務(wù)必在signingConfigs里加入v2SigningEnabled false,否 ? ? ? ? ? ? ? ? ? ? ? ?則打包時會報錯
? ? ? ? ? ? ? ? ?3.如果需要UMeng統(tǒng)計,請在自己的Application中獲取渠道信息并傳給UMeng
Stringchannel = PackerNg.getChannel(this);
MobclickAgent.startWithConfigure(newMobclickAgent.UMAnalyticsConfig(this,AppConfig.UMENG_KEY,channel));
applyplugin:'packer'
dependencies {compile'com.mcxiaoke.gradle:packer-helper:1.0.8'}??
android {
signingConfigs {? ??
? release {
//如果要支持最新版的系統(tǒng) Android 7.0
//這一行必須加,否則安裝時會提示沒有簽名
//作用是只使用舊版簽名,禁用V2版簽名模式
v2SigningEnabled ?false
}? ? }? }
為了提高Android系統(tǒng)的安全性,Google從Android 7.0開始增加一種新的增強簽名模式,從Android Gradle Plugin 2.2.0開始,構(gòu)建系統(tǒng)在打包應(yīng)用后簽名時默認使用APK signature scheme v2,該模式在原有的簽名模式上,增加校驗APK的SHA256哈希值,如果簽名后對APK作了任何修改,安裝時會校驗失敗,提示沒有簽名無法安裝,使用本工具修改的APK會無法安裝,解決辦法是在signingConfigs里增加v2SigningEnabled false,禁用新版簽名模式,技術(shù)細節(jié)請看官方文檔:APK signature scheme v2,還有這里Issue 31的討論 。
使用方式
方式一:使用命令行工具(推薦)
使用步驟:
1.下載打包工具
2.打一個基礎(chǔ)包,不包含渠道信息
3.編寫渠道.text文件(如下格式)

4.隨便位置創(chuàng)建一個文件夾,將打包工具和渠道文件.text和基礎(chǔ)包一同放進去(只為了,操作方便)

5.打開命令行,定位到該目錄,輸入命令:
java -jar PackerNg-x.x.x.jar apkFile marketFile outputDir

方式二:使用該庫提供的gradle插件(不推薦)
使用步驟:(具體使用,請到github查看)
1.在app/build.gradle中添加依賴:
dependencies {
compile 'com.mcxiaoke.gradle:packer-helper:1.0.9'
}
2.程序入口添加以下代碼(即配置友盟統(tǒng)計的渠道名):
final String market =PackerNg.getMarket(Context);
MobclickAgent.startWithConfigure(newMobclickAgent.UMAnalyticsConfig(context, umeng_appkey, market));
3.去除manifest中關(guān)于友盟統(tǒng)計的metadata,以及**build.gradle**中的相關(guān)內(nèi)容
android:name="UMENG_CHANNEL"
android:value="${UMENG_CHANNEL_VALUE}"
/>
實現(xiàn)原理
[原作者原理說明](https://github.com/mcxiaoke/packer-ng-plugin)
一個xx.apk文件是一個簽名過的.zip文件,根據(jù)[ZIP文件結(jié)構(gòu)(https://users.cs.jmu.edu/buchhofp/forensics/formats/pkzip.html),它的末尾是該文件的注釋,注釋包含兩個部分Comment Length和File Comment。該工具利用zip文件的評論區(qū),進行flavor的讀寫寫入注釋區(qū)的結(jié)構(gòu)如下,data即渠道名
[filecontent] [commentLength][commentContent]
2 bytes |由以下構(gòu)成
[data] ? [dataLength] ?[magic]
?nbytes ? 2bytes ? ? 5bytes
byte[] magic = {0x21, 0x5a, 0x58, 0x4b, 0x21};