增量更新的使用已有一段时间,面对出现的一些问题,对初始的增量更新机制进行了扩展与优化。
丁香医生hybrid开发遇到的问题
增量更新的安全
如何保证客户端获取到的增量包不被篡改。
资源包 diff 的不高效
目前前端大多使用一些前端构建工具,如
webpack
,gulp
, 将分散的源码合并成一个文件。在这种情况下,使用原先的 diff 算法并不能减少增量包的体积。
增量包的安全
通过采用数字签名
技术保证增量包不被篡改。
签名方案:
前端对生成的增量包和全量包进行签名,将签名文件与源文件放在同一目录,并一起发布。
客户端更新时,在获取增量包时,同时获取增量包的签名,通过客户端中预先存储的公钥对签名文件和源文件进行校验,校验成功才进行下一步的更新。
签名工具:
安装 npm install dxy-assets-sign --save-dev
使用
require('dxy-assets-sign')({
publish_folder : publish_folder, //资源发布目录
api : 'http://192.168.200.135:3000/sign', //必须
verify : true, // 可选,是否对签名进行验证
hash : 'sha1', //可选
format : 'base64', //可选
sign : 'RSA-SHA256', //可选
hash_format : 'hex'
})();
bsdiff
bsdiff
可以生成基于二进制的差量包,它的体积比原先算法生成的增量包小很多。尤其是对单文件这种极端情况。
以丁香医生的React Native
的资源包为例,原先的增量包的体积为197KB
,使用bsdiff
算法后的增量包体积为5KB
。
由于兼容旧算法,如果需要使用bsdiff
算法,只需要添加bsdiff
字段
require('gulp-assets-incremental-update')(gulp, {
publish_folder : publish_folder,
name : 'article_detail.zip',
base_url : 'http://assets.dxycdn.com/assets/app/dxydoctor/hybrid-publish',
assets_folder : assets,
limit : 6,
bsdiff : true
});