Android APK打渠道包实施方案
最近刚好在做Android打渠道包相关的需求,记录下心得笔记,希望给有需要的朋友一个参考。
首先,我们来理解下概念:
1、母包(就是原始的安卓包)
2、渠道标识(自定义的各个渠道标识,例如:baidu,xiaomi,uc等等)
3、渠道包(在母包中打入了渠道标识之后,生成的新安卓包)
其实就这3个东西,那么我们有了母包,有了渠道标识,如何来获取到我们需要的渠道包呢,需要用到哪些技术,哪些资源呢?这是大家最关心的点!
技术:Java、NodeJS、Python等其他语言开发的打包工具,后面会说目前流行的一些打包方案
资源:ECS服务器、对象储存、域名、CDN、Serverless、函数计算等等
初级思路:
1、把打包工具部署在ECS上,并部署打包需要的语言环境,java环境,Python环境,NodeJS环境等
2、母包也存放在ECS上,打好的渠道包也存放在ECS服务器上
3、根据业务策略,把ECS上打好的渠道包同步到对象存储上
4、使用CDN访问对象储存上的渠道包资源,达到加速的效果
通过这个思路,是可以实现最终的目的,但是方案不够完美,例如:
1、母包、渠道包存放在ECS上,需要维护存储空间
2、ECS服务器配置问题,太高吧,成本也高,太低吧,影响打包效率
3、需要自己部署和维护打包环境
我现在用的Walle这个方案跑的项目!
优化思路:
1、取消打包用的ECS服务器
2、母包、渠道包完全存放在对象存储里面
3、使用Serverless、函数计算服务来实现打包
目前流行的方案对比和说明
Walle:美团开发的Android Signature V2 Scheme签名下的新一代渠道包打包神器,项目地址:https://github.com/Meituan-Dianping/walle
VasDolly:腾讯开发的Android V1 and V2 Signature Channel Package Plugin,项目地址:https://github.com/Tencent/VasDolly/
ApkTool和Android Gradle Plugin:安卓开发的小伙伴应该都很熟悉了!
EdgeOne边缘APK动态打包:腾讯云 EdgeOne +腾讯云 COS + 腾讯云 SCF 产品组合在边缘实现 Android APK 多渠道的动态打包方案
渠道信息注入形式说明:
动态:无需把渠道信息真的打入到母包里面,一般是通过【加速域名+渠道标识参数】来访问母包,动态的将渠道标识插入到母包里面并返回给客户端下载
静态:需要把渠道信息真的打入到母包里面,生成一个新的渠道包
渠道信息注入端说明:
边缘:渠道信息写入的包是加速节点上的包
源站:渠道信息写入的包是源站里面的母包
理解了这些概念,接下里我们一起看看,EdgeOne边缘APK动态打包是如何实现的,先来一张流程图
从图上,我们可以总结出如下几个步骤:
1、原始母包(A)上传到COS
2、自动触发函数计算将原始母包处理成一个新的母包(B)
3、用户使用加速域名+渠道参数请求新母包(B)
4、触发函数计算,将渠道信息动态注入到新母包里面,得到一个渠道包(C)
5、将渠道包(C)返回给用户下载安装
整个过程,出现3个包,我分别用ABC来标注了
A包很好理解,就是我们的原始母包,存放在COS上
B包也好理解,就是函数计算自动处理之后得到一个新的包,也存放在COS上
C包,其实这里是不可见的,但是用户最终下载得到的就是C包,但是这个C包又没有存放在COS里面 ,那么它在哪里呢,我认为它是存放在加速节点上,缓存起来了,就像我们使用CDN访问一个图片资源一样,一旦节点上有缓存了,那么之后访问就不会到源站来访问,而是直接访问节点上的资源,所以说,C包对我们来说,其实是透明的,我们也不用过分多关注它,知道是这么回事儿就可以了。
那么这里的A包和B包有什么区别呢,这就是步骤2里面函数计算实现的功能,函数计算向A包注入了空白数据,并重新生成了一个合法的B包,为后面的C包提供了基础
这里的【注入空白数据】的相关知识,涉及到V1版本签名,V2版本签名等原理,有需要的小伙伴,自行查阅资料了解,这里不展开细说。
最后,获取到的渠道包如何验证和获取包体里面的渠道标识,Walle和VasDolly开发里面都有介绍!