MultiChannelPackageTool

Introduction: Android Multi channel package tool (安卓多渠道打包工具)
More: Author   ReportBugs   
Tags:
高效打包-zip 添加 comment 打包-Android打包-打包-

Android Multi channel package tool (安卓多渠道打包工具)

@deprecated 本工具以落后,推荐使用美团多渠道打包工具; APK Signature Scheme v2,新一代开源 Android 渠道包生成工具 Walle: https://github.com/Meituan-Dianping/walle https://tech.meituan.com/android-apk-v2-signature-scheme.html

为什么需要这个工具

1、国内应用市场繁多,上线的 apk 应用需要知道自己在哪个渠道下载的;
2、简直是急速啊:5M 的 apk,1 秒种能打 300 个;
3、因为是急速,可以做网页下载时动态打渠道包功能(如:分享 apk 给好友,好友下载打开 apk 后直接计算准确的分享量);

该工具的原理

利用的是 Zip 文件“可以添加 comment(摘要)”的数据结构特点,在文件的末尾写入任意数据,而不用重新解压 zip 文件(apk 文件就是 zip 文件格式);
所以该工具不需要对 apk 文件解压缩和重新签名即可完成多渠道自动打包,高效速度快,无兼容性问题;

另外美团的适配渠道包方案(不同的渠道嵌入不同的 SDK):
美团 Android 自动化之旅—适配渠道包(Gradle flavor 解决内嵌第三方 SDK 适配)(http://tech.meituan.com/mt-apk-adaptation.html)

与现有多渠道打包工具的对比

友盟(https://github.com/umeng/umeng-muti-channel-build-tool)
    打包:解压 apk 文件 -> 替换 AndroidManifest.xml 中的 meta-data -> 压缩 apk 文件 -> 签名
    读取渠道号:直接通过 Android 的 API 读取 meta-data
    特点:需要解压缩、压缩、重签名耗费时间较多,重签名会导致 apk 包在运行时有兼容性问题;
美团(http://tech.meituan.com/mt-apk-packaging.html)
    打包:解压 apk 文件 -> META-INF 目录下创建一个以渠道号为文件名的空文件 -> 压缩 apk 文件
    读取渠道号:解压已安装的 data/app/<package>.apk -> 读取以渠道号为文件名的空文件的文件名
    特点:比友盟高效点,只有解压缩和压缩,没有签名,兼容性也比较好,但是读取渠道号需要解压缩 apk,速度比较慢;
我自己
    打包:直接写入渠道号到 apk 文件的末尾
    读取渠道号:直接读取 data/app/<package>.apk 文件末尾的渠道号
    特点:没有解压缩、压缩、重签名,没有兼容性问题,速度最快;写入的渠道号数据支持加密,安全可靠;

除了多渠道打包,我还能做什么?

由于速度极快,我还可以作为服务器端下载 apk 时动态写入“特定数据”,用户下载到 apk 后安装启动,读取“特定数据”完成特定的操作;
如:加好友功能,下载前写入用户 ID,用户下载后启动 apk,读取写入的用户 ID,完成加好友操作,用户体验大大提升,没有断裂感;
当然,也可以写入 JSON 数据,想做什么就做什么;

解决安装时报 INSTALL_PARSE_FAILED_NO_CERTIFICATES 错误问题(Android 7.0 版本适配)

安装时的错误提示:Failed to install xxx.apk.1: Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES: Failed to collect certificates from   /data/app/xxx.tmp/base.apk.1 using APK Signature Scheme v2: SHA-256 digest of contents did not verify]
Android 7.0 引入一项新的应用签名方案 APK Signature Scheme v2
在 build.gradle 中添加“v2SigningEnabled false”强制使用旧版签名;
signingConfigs {
release {
    ...
    v2SigningEnabled false // 使用旧版签名,禁用 V2 版签名模式,同时满足两个条件才需要此配置:“Gradle 版本 >= 2.14.1”和“Android Gradle Plugin 版本 >= 2.2.0”
    }
}
官方说明:https://developer.android.com/about/versions/nougat/android-7.0.html#apk_signature_v2

如何使用

1、命令行使用说明:
用法:java -jar MCPTool.jar [-path] [arg] [-contents] [arg] [-password] [arg]
-path        APK 文件路径
-outdir        输出路径(可选),默认输出到 APK 文件同一目录
-contents    写入内容集合,多个内容之间用“;”分割,如:googleplay;m360; 当没有“-contents”参数时输出已有文件中的 content
-password    加密密钥(可选),长度 8 位以上,如果没有该参数,不加密
-version    显示版本号
例如:
写入:java -jar MCPTool.jar -path D:/test.apk -outdir ./ -contents googleplay;m360; -password 12345678
读取:java -jar MCPTool.jar -path D:/test.apk -password 12345678

2、Android 代码中读取写入的渠道号:
导入 MCPTool.jar 中的 MCPTool 类,MCPTool.getChannelId(context, mcptoolPassword, defValue)读出写入的渠道号;

3、jenkins、hudson、ant 使用说明:
请看 MultiChannelPackageTool\build-ant\MCPTool\build.xml 文件;

4、Windows 下 bat 脚本运行说明:
拖拽文件即可完成多渠道打包:MultiChannelPackageTool\build-ant\MCPTool\MCPTool.bat;
拖拽文件检查渠道号是否写入成功:MultiChannelPackageTool\build-ant\MCPTool\MCPTool-check.bat;
上面 2 个 bat 文件中有密码,可以自行修改;

更新日志

V1.1
20150829    更新内容
    修复 Android5.0 及以上系统不能安装打出的渠道包问题(校验 apk 文件的 comment 数据的长度)
V1.0
20141216    更新内容
    创建项目

License

Copyright (C) 2014 seven456@gmail.com

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
Apps
About Me
GitHub: Trinea
Facebook: Dev Tools