type
status
date
slug
summary
tags
category
icon
password
Property
Apr 18, 2023 04:06 AM
腾讯多渠道方案VasDolly
Gradle Plugin方案
利用
AndroidManifest.xml渠道占位符,同时在build.gradle中配置多渠道信息缺点:每个渠道都需要重复构建过程,效率比较低
VasDolly方案
接入方式
- 根目录build.gradle
- 配置渠道列表
channel.txt
- app的build.gradle
缺点(?):单渠道风格化的配置,无法实现
实现原理
Android N之前:V1签名方式
信息位于zip末尾的comment区域:最终渠道信息渠道字符串+渠道字符串长度+魔数

读取:
先读取8个字节的
V1_MAGIC(0x6c746c6f76657a68),对应ltlovezh;再向前读取两个字节,对应渠道信息长度(实际为9);最后向前读取9个字节,读取到渠道kepuchina。写入:
EOCD区分4部分:
- 4字节的固定值:0x06054b50(小端字节序存储)
- 16个字节的信息
- 2字节注释长度
- N字节注释内容

无注释:从后向前移动2字节,组装注释信息,写入内容,写入magic魔数
有注释:通过0x504B0506 定位EOCD区,读取原有注释,处理后再写入
Android N之后:V2签名方式



读取:
- 找到签名块(定位EOCD,获取中央目录偏移量)
- 找到签名块中的ID-value的地方
- 读取出所有的ID-value,找到特定的key(0x881155ff)对应的渠道信息
写入:
- 找到APK的EOCD块,定位签名块
- 获取已有的ID-value Pair
- 添加包含渠道信息的ID-value(0x881155ff)
- 基于所有的ID-value生成新的签名块
- 修改EOCD的中央目录的偏移量
- 用新的签名块替代旧的签名块,生成带有渠道信息的APK
QA
1. 多渠道打包和友盟统计
在旧版本中,我们是通过在
AndroidManifest.xml文件中配置通过
productFlavor来实现多渠道打包,现在采用友盟提供了新的接入方式:UMUtils.setChannel();只需要通过
ChannelReaderUtil.getChannel();获取到渠道信息提供给友盟即可。2. 多渠道和mapping
多渠道方案是根据生成的base包来生成
channe.txt下配置的多个渠道包,只有base包生成时真正参与构建流程(混淆过程),因此多个渠道包对应的唯一的mapping文件。同时单个mapping文件也方便热修复时的操作。3. bugly后台mapping文件关联
bugly后台按照渠道符号表>全渠道符号包的优先级进行匹配,所以把生成的唯一一个mapping文件作为全渠道符号表上传实现符号表文件关联
4. 为什么推荐用rebuildChannel这个task
项目打包流程包含加固操作,使用
rebuildChannel的方式,可以先生成base.apk,进行加固和签名操作后得到base_jiagu_signed.apk,再以base_jiagu_signed.apk作为基准包参与多渠道包的生成,节省时间。5.打包脚本
原有流程 :
- 执行gradle命令生成base包
- 通过
VasDolly的gradle命令生成多渠道包
- 根据各个渠道包分别加固(除应用宝渠道使用乐固加固方案,其他渠道使用360加固)
新的流程 :
- 先执行gradle命令生成base包
- 将base包分别进行360加固和乐固加固
- 对加固包签名后利用
VasDolly的命令行方式生成渠道包 - 先用360加固后的base包生成全渠道包
- 再针对
yingyongbao渠道,单独处理乐固加固后的base包
- 保留base包和对应的mapping文件以备热修复时使用