腾讯多渠道方案VasDolly
2019-7-29
| 2023-4-18
0  |  阅读时长 0 分钟
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区域:最终渠道信息渠道字符串+渠道字符串长度+魔数
notion image

读取:

先读取8个字节的V1_MAGIC(0x6c746c6f76657a68),对应ltlovezh;再向前读取两个字节,对应渠道信息长度(实际为9);最后向前读取9个字节,读取到渠道kepuchina

写入:

EOCD区分4部分:
  1. 4字节的固定值:0x06054b50(小端字节序存储)
  1. 16个字节的信息
  1. 2字节注释长度
  1. N字节注释内容
notion image
无注释:从后向前移动2字节,组装注释信息,写入内容,写入magic魔数
有注释:通过0x504B0506 定位EOCD区,读取原有注释,处理后再写入

Android N之后:V2签名方式

notion image
notion image
notion image

读取:

  1. 找到签名块(定位EOCD,获取中央目录偏移量)
  1. 找到签名块中的ID-value的地方
  1. 读取出所有的ID-value,找到特定的key(0x881155ff)对应的渠道信息

写入:

  1. 找到APK的EOCD块,定位签名块
  1. 获取已有的ID-value Pair
  1. 添加包含渠道信息的ID-value(0x881155ff)
  1. 基于所有的ID-value生成新的签名块
  1. 修改EOCD的中央目录的偏移量
  1. 用新的签名块替代旧的签名块,生成带有渠道信息的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文件以备热修复时使用

参考链接

  • 开发
  • Webhook 调试工具PikPak拉新方案实现原理
    Loading...