目录
- 一 储备知识
- 二 友盟多渠道打包
- 2.1 简介
- 2.2 过程
- 步骤1 准备工作
- 步骤2 打包环节
- 1. 手动打包
- 2. 自动打包
- 三 美团多渠道打包
- 3.1 简介
- 3.1.1. 第一代(META-INF方式)
- 3.1.2 第二代(美团Walle)
- 3.2 过程
- 3.3 注意点
- 四、 360多渠道打包
- 4.1简介
- 4.2过程
- 五 总结
- 六 参考文献
一 储备知识
先了解V1和V2的定义
- V1 :
v1是jar Signature来自JDK,是对ZIP条目进行验证,这样APK签名后可进行许多修改 - 可以移动甚至重新压缩文件 - V2:
验证压缩文件的所有字节,而不是单个ZIP条目,因此,在签名后无法再更改(包括 zipalign)。正因如此,现在在编译过程中,我们将压缩、调整和签署合并成一步完成。好处显而易见,更安全而且新的签名可缩短在设备上进行验证的时间(不需要费时地解压缩然后验证),从而加快应用安装速度。 - 引入V2后,签名可选用以下几种方案
- 只使用v1签名:并不会影响什么,但是在7.0上不会使用更安全的验证方式
- 只使用V2签名: 7.0以下会直接安装完显示未安装,7.0以上则使用了V2的方式验证
- 同时使用V1和V2: 所有机型都没问题。 在Android studio打签名包时默认使用的就是这种方式
再看下这几类热门多渠道打包方式的对比
二 友盟多渠道打包
2.1 简介
原理:
这种打包方式是使用Android Studio的编译工具gradle配合使用的,原理就是通过脚本修改AndroidManifest.xml中的mate-date内容,执行N次打包签名操作实现多渠道打包的需求
优点:
- 安全且适合V1与V2
缺点
- 因为每个渠道都是重新编译打包,所以耗时很久
补充知识点
-
Flavors
:产品渠道,通过productFlavors
针对不同的渠道进行配置 -
flavorDimensions
: flavors的作用是扩大维度,flavorDimensions则是将维度再次扩大。
举个例子,flavors渠道有小米,但是小米有分收费和免费版。这时候可以通过flavorDimensions
来扩大维度(具体的可以找下博客很多的)。 -
BuildTypes
: 构建类型,AndroidStudio的Gradle组件默认提供给了“debug”“release”两个配置。
2.2 过程
步骤1 准备工作
- 先在AndroidManifest.xml文件下输入以下这段配置
//这段包裹在application下,与activity同级别
<meta-data
android:name="UMENG_CHANNEL"
//value 用占位符
android:value="${UMENG_CHANNEL_VALUE}"/>
- 在app的build.gradle的android{}中添加如下
//单独只有一个选择项时,所有渠道默认为该选项
flavorDimensions "default"
productFlavors {
xiaomi {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "xiaomi"]
}
q360 {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "360"]
}
}
如果几十个平台这样子写有点麻烦,可以直接这样子写,如下所示
//
flavorDimensions "default"
productFlavors {
xiaomi {
}
q360 {
}
}
//使用productFlavors.all字段统一配置
productFlavors.all {
flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
}
- 通过mate-data信息来获取渠道
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 "";
}
步骤2 打包环节
打包方式分为两种
- 手动打包
- 自动打包
1. 手动打包
根据如下步骤
- 选择
Generate Signed APK
- 下一步
- 选择多个渠道,点击finish接着你的文件夹下就生成这两个apk了。
2. 自动打包
- 先打开
Project Structure
- 添加签名信息
- 切换到Build Types标签,将Signing config选择为"release"
- 查看app的build.gradle 多出了如下红框部分的内容
- 接着通过Task打包,就会发现 app/build/outputs/apk 目录下有所有渠道的包
三 美团多渠道打包
3.1 简介
作者传送门 多渠道神器walle 美团打包总共有两代
3.1.1. 第一代(META-INF方式)
原理:
把一个Android应用包当作zip文件包进行解压,然后发现在签名生成的目录下(META-INF)添加一个空文件不需要重新签名。利用android签名不校验META-INF文件夹内容的漏洞,在此文件夹内放置渠道信息文件将不受签名限制
优点:
直接使用已有的apk,解压放入渠道文件,再压缩,不用再签名。所以这种方式速度非常快,900个渠道包用时不到一分钟
缺点:
1、只适用于V1
2、一些不法的渠道商很容易通过工具修改渠道。
3.1.2 第二代(美团Walle)
原理:
利用V2签名的校验方式不校验APK Signing Block并且忽略APK Signing Block中多余的ID-VALUE这个特点,将渠道信息写到APK Signing Block中。
优点
- 由于是直接对zip格式文件的操作,性能与添加zip注释方式相当,也是很快
- 适用与V2
缺点
1、还是不安全
3.2 过程
Walle提供两种打渠道包方式:
- Gradle插件方式,方便快速集成
- 命令行方式,最大化满足各种自定义需求
- 配置好根目录下的Gradle
dependencies {
classpath 'com.android.tools.build:gradle:3.0.1'
classpath 'com.meituan.android.walle:plugin:1.1.6'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
- 配置好App的build.gradle文件中的apply这个插件
并在当前App的 build.gradle 文件中apply这个插件,并添加上用于读取渠道号的AAR
apply plugin: 'walle'
dependencies {
compile 'com.meituan.android.walle:library:1.1.6'
}
- 配置好签名(具体步骤就是上面自动打包1,2,3步骤)
最后也是 - 添加channel文件(用来获取所有渠道名)
- 配置插件(配置在app的build.gradle的android{}下 )
walle {
// 指定渠道包的输出路径
apkOutputFolder = new File("${project.buildDir}/outputs/channels");
// 定制渠道包的APK的文件名称
apkFileNameFormat = '${appName}-${packageName}-${channel}-${buildType}-v${versionName}-${versionCode}-${buildTime}.apk';
// 渠道配置文件
channelFile = new File("${project.getProjectDir()}/channel")
}
- 获取渠道名
String channel = WalleChannelReader.getChannel(this.getApplicationContext());
- 打包方式(一)通过指令打包
//加clen就是先清除原先的
./gradlew clean assembleReleaseChannels
- 打包方式(二)通过task打包,点击下方红框内
3.3 注意点
- 使用360加固后,需要重新签名的,所以这种多渠道打包方式失效了。
解决方案:
- 先加固后签名,然后用walle对这个签名后的apk进行多渠道(亲测可行)。
- 使用该大神提供的打包脚本ProtectedApkResignerForWalle
- **有时候执行命令多渠道会导致R.java文件丢失,但是通过clean又能重新生成。
解决方案:我们把命令中的clean
去掉,变为./gradlew assembleReleaseChannels
四、 360多渠道打包
4.1简介
作者传送门 com/seven456/MultiChannelPackageTool">360多渠道原理
利用的是Zip文件“可以添加comment(摘要)”的数据结构特点,在文件的末尾写入任意数据,而不用重新解压zip文件(apk文件就是zip文件格式);
优点:
没有解压缩、压缩、重签名,没有兼容性问题,速度最快;写入的渠道号数据支持加密;
缺点:
只适用于V1,不适用于V2,安全。
4.2过程
过程很简单因为有可视化工具下载一下就好了
使用一看就懂如下
五 总结