打包工具
Android打包工具,100个渠道包只需要10秒钟
重要说明:1.若360等需要加固的渠道,先加固,再打渠道包(注意注意注意)
2.使用最新版SDK(Android Gradle Plugin 2.2.0+)时,请务必在signingConfigs里加入v2SigningEnabled false,否 则打包时会报错
3.如果需要UMeng统计,请在自己的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 {
//如果要支持最新版的系统 Android 7.0
//这一行必须加,否则安装时会提示没有签名
//作用是只使用旧版签名,禁用V2版签名模式
v2SigningEnabled false
} } }
为了提高Android系统的安全性,Google从Android 7.0开始增加一种新的增强签名模式,从Android Gradle Plugin 2.2.0开始,构建系统在打包应用后签名时默认使用APK signature scheme v2,该模式在原有的签名模式上,增加校验APK的SHA256哈希值,如果签名后对APK作了任何修改,安装时会校验失败,提示没有签名无法安装,使用本工具修改的APK会无法安装,解决办法是在signingConfigs里增加v2SigningEnabled false,禁用新版签名模式,技术细节请看官方文档:APK signature scheme v2,还有这里Issue 31的讨论 。
使用方式
方式一:使用命令行工具(推荐)
使用步骤:
1.下载打包工具
2.打一个基础包,不包含渠道信息
3.编写渠道.text文件(如下格式)
4.随便位置创建一个文件夹,将打包工具和渠道文件.text和基础包一同放进去(只为了,操作方便)
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.程序入口添加以下代码(即配置友盟统计的渠道名):
final String market =PackerNg.getMarket(Context);
MobclickAgent.startWithConfigure(newMobclickAgent.UMAnalyticsConfig(context, umeng_appkey, market));
3.去除manifest中关于友盟统计的metadata,以及**build.gradle**中的相关内容
android:name="UMENG_CHANNEL"
android:value="${UMENG_CHANNEL_VALUE}"
/>
实现原理
[原作者原理说明](https://github.com/mcxiaoke/packer-ng-plugin)
一个xx.apk文件是一个签名过的.zip文件,根据[ZIP文件结构(https://users.cs.jmu.edu/buchhofp/forensics/formats/pkzip.html),它的末尾是该文件的注释,注释包含两个部分Comment Length和File Comment。该工具利用zip文件的评论区,进行flavor的读写写入注释区的结构如下,data即渠道名
[filecontent] [commentLength][commentContent]
2 bytes |由以下构成
[data] [dataLength] [magic]
nbytes 2bytes 5bytes
byte[] magic = {0x21, 0x5a, 0x58, 0x4b, 0x21};