疑难问题之bsdiff 问题背景 项目中使用到了bsdiff命令进行增量包的生成,不过在使用中发现对于某些文件,bsdiff命令会卡住。...诊断问题 刚开始以为是操作系统的问题,换了个全新的系统,按网上的教程从http://www.daemonology.net/bsdiff/下载bsdiff的源码,重新编译得到bsdiff,这里把原来卡住的两个文件重新试了一次...看来这个是bsdiff本身存在问题,在网上搜索了下,终于发现有人遇过一样的问题。很奇怪,在国内也有很多人用bsdiff生成增量包,但却没人反馈这个问题。.../chromiumos/third_party/bsdiff 编译 我用的linux服务器没有root权限,安装稍微麻烦一点。...mv $HOME/local/bin/bsdiff $HOME/local/bin/bsdiff2 效果 使用新的bsdiff2命令测试了下,目前生成增量包一切正常,再也没有卡住的现象了,而且占用的内存也比原来小不少
普通二进制文件对比 熟悉Linux的同学提到二进制文件对比自然会想到一个命令:cmp。那可执行文件的二进制更新岂不是有了这个对比结果后, 然后拿更新结果修改旧文件的二进制串为新文件不就OK了?...以上便是bsdiff算法的基本思想,并且作者也将该算法实现并开源出来,供所有有二进制差异更新需求的同学使用(下载链接:http://www.daemonology.net/bsdiff/ )。...随意选择两个可执行文件,这里就选择bsdiff工具里的bsdiff与bspatch,两个完全无关的可执行文件,bsdiff作为新文件,bspatch作为旧文件。...xiaoyzhang$ bsdiff bspatch bsdiff delta.patch xiaoyzhang$ ls -ll -rw-r--r-- 1 xiaoyzhang 1085706827...20.png 游戏更新还需要哪些能力 有了BSDiff,我们可以很方便的做到二进制文件的差异更新,但BSDiff也并非完美,比如其存在一些应对移动应用时的稳定性以及对DEX文件的压缩效率不高等问题。
Apk文件的拆分和合并需要用bsdiff和bzip2这两个工具 官方下载: bsdiff:http://www.daemonology.net/bsdiff/ (包含了两个,一个window平台的...,一个是linux的) bzip2:http://www.bzip.org/downloads.html 个人链接下载: bsdiff-win:链接:https://pan.baidu.com/s.../1KZ46wP0dThJ9CvY-8uz4tQ 提取码:kw63 bsdiff- linux:链接:https://pan.baidu.com/s/1H8yzsiDod2wiIo1WonE2Nw...采用Android studio项目为例,来处理客户端的的文件合并 复制bsdiff的bspatch.c文件和bzip2的.c和.h文件copy到项目的cpp目录下 由于Android是基于linux...内核的,所以这边采用的是linux包的bspatch.c的代码: ?
需要使用的资源 进行增加更新主要是通过开源项目bsdiff项目来进行实现,还需要一些辅助的工具,列表如下: bsdiff — bsdiff (win环境) 生成差分包及合并差分包库 , 源码内已包含...bzip2 项目地址: https://github.com/hymanAndroid/tools/tree/master/bsdiff-4.3 bzip2 — bzip2 bsdiff 依赖..."); } } 接下来使用javah命令,生成头文件 , 将.h头文件拷贝到我们 VS的工程中,同时com_dispatch_bsdiff_BsDiff.h头文件还需要依赖jni.h和jni_md.h...两个文件 com_dispatch_bsdiff_BsDiff.h中引入jni.h 将头文件com_dispatch_bsdiff_BsDiff.h引入到bsdiff.cpp文件中 5.编写调用的...编写bsdiff.cpp的native函数 //JNI 调用 JNIEXPORT void JNICALL Java_com_dispatch_bsdiff_BsDiff_diff (JNIEnv *env
三、实现步骤 1、生成差异包 apk文件的差分和合并都是使用的开源的二进制比较工具 bsdiff 实现。...下载的bsdiff-4.3版本中有几个文件,其中bsdiff.c用于生成差异包的源码,bspatch.c用于合成apk的源码,makefile是生成可执行文件的脚本。...亲测在linux系统中,执行makefile文件,可生成一个bsdiff工具,使用该工具即可生成差异包。 在服务器端使用bsdiff工具生成差异包。.../bsdiff karaoke_3.2.apk karaoke_3.3.apk 3.2_3.3.patch 命令即可生成差异包3.2_3.3.patch。 ?...我们需要把bsdiff中的bspatch.c整合到我们C代码中,并将其编译生so供Android手机使用,其中bspatch依赖bzip2,需要自己下载依赖的c文件。
工具 bsdiff、bspatch 下载地址:http://www.daemonology.net/bsdiff/ 编译源码: Step1: make 出错信息: ?.../bsdiff v1.0.0.apk v1.0.1.apk 1.0.0-to-1.0.1.patch ? 合并差分包 ....Step3:将bsdiff中的bspatch.c文件导入到Android项目中,并将bspatch.c中的#include 改成#include "bzip2/bzlib.h" ?...Step5:将通过bsdiff生成的差量包1.0.0-to-1.0.1.patchpush到手机sdcard目录 Step6:运行程序,点击”增量更新“ ?
丢弃前面old大小的数据,后面的就是新生成的new 优缺点: 容易实现,算法选择的好时效果很赞;适应范围较窄(数据较大时补丁可能突然异常变大),因为要压缩速度可能慢等 ---- 覆盖线diff算法 BsDiff...二维矩阵概念 覆盖线概念 后缀数组(QuickSort\libdivsufsort) 优缺点: 补丁小、diff内存占用大、运行慢、patch快 patch内存占用O(m+n)复杂度的误解: 这只是BsDiff...甚至允许C损坏)、速度快、可以支持超大文件;(xdelta对超大文件支持不好) ---- Apk的diff算法选择 zip、jar、apk的关系 (另外: ipa) Jar包签名(Apk v1 Sign) BsDiff...ApkDiffPatch: v1.0 BsDiff: v4.3 HDiffPatch: v2.2.6 Google Play patches: https://github.com/andrewhayden...=========================================================== BsDiff
工程名称 工程描述 aes 高级加密标准(Advanced Encryption Standard) apache-http Http服务器 bison (主机)自动生成语法分析器程序 bluez 蓝牙库 bsdiff...主机)用于二进制文件生成补丁 bzip2 (主机/目标机)压缩文件工具 clearsilver (主机)模板语言,包括Python、Java、Perl、C的库 dbus freedesktop下的开源linux...netcat 用来网络连线TCP或者UDP进行读、写 netperf 网络性能测量工具 neven 人脸识别的一套库 opencore 多媒体框架 openssl SSL加密相关 oprofile Linux
间的影响很可观.Tinker的亮点是通过全量替换dex的方式避免unexpectedDEX,这样做所有的类自然都在同一个dex中.但这会带来补丁 包dex过大的问题,由此微信自研了DexDiff算法来取代传统的BsDiff...它的粒度是Dex格式的每一项,可以充分利用原本Dex的信息,而BsDiff的粒度是文件,AndFix/QZone 的粒度为class。 关于微信所使用的三种算法,如图所示 ?...BsDiff;它格式无关,但对Dex效果不是特别好,而且非常不稳定。...当前微信对于so与部分资源,依然使用bsdiff算法; DexMerge;它主要问题在于合成时内存占用过大,一个12M的dex,峰值内存可能达到70多M; DexDiff;通过深入Dex格式,实现一套diff
Tinker还支持资源和So包的更新,So补丁包使用BsDiff来生成,资源补丁包直接使用文件md5对比来生成,针对资源比较大的(默认大于100KB属于大文件)会使用BsDiff来对文件生成差量补丁。
github https://github.com/alibaba/dexposed 2.andfix github https://github.com/alibaba/AndFix 3.bsdiff...至于bsdiff,只是阅览了一下,还没研究过。
bsdiff是目前最常用的一种差分算法,其压缩效率高,算法稳定性也好。 ...bsdiff差分默认使用bzip2压缩算法,其压缩效率虽高,但相应地也要求解压端侧最小内存400KB,所以并不适合资源受限的嵌入式芯片。...为了适配更多的物联网终端,ZETA自研高效的压缩算法,兼顾压缩效率和平台兼容性,利用bsdiff差分包0比较多的特点进行简化压缩--只压缩0。
我们的方案是使用bsdiff做差分: 1、服务端拿最新包和打包到App里面的基准包计算差量,生成patch; 2、客户端下载到该patch文件后,和打包到app里面的原始文件merge,生成最新包; 看起来很完美的方案...经过反复测试,我们发现zip文件解压之后比较里面的变化文件,生成diff文件,然后将diff文件生成一个zip包,比直接bsdiff计算2个zip包生成的diff,会小很多。...下图是某个版本中发布的4个差分包,传统bsdiff方案和我们的优化方案使用后,最终实际下载包的大小对比,可以看出优化效果非常明显, ?
因此优化方法是读取这个资源的二进制差分文件,只下载之前二进制文件不存在的二进制内容,然后根据现有的二进制文件计算出新的版本的文件 本文使用的算法请看 二进制数据差异算法 用于减小OTA内容 这些算法相关的也没有什么内容 和 BSDiff
Linux 文件系统 目录 说明 bin 存放二进制可执行文件 sbin 存放二进制可执行文件,只有 root 才能访问 boot 存放用于系统引导时使用的各种文件 dev 用于存放设备文件 etc...是超级管理员 localhost 表示主机名 ~ 表示当前目录(家目录),其中超级管理员家目录为 /root,普通用户家目录为 /home/chan $ 表示普通用户提示符,# 表示超级管理员提示符 Linux...test.tar.gz 文件搜索命令 locate:在后台数据库搜索文件 updatedb:更新后台数据库 whereis:搜索系统命令所在位置 which:搜索命令所在路径及别名 find:搜索文件或文件夹 用户和组 Linux
自定义 DexClassLoader 类加载器 通过各种 代理 | 反射 | HOOK 等操作 加载外部的字节码数据 ; 热修复 , 插件化 , 换肤框架 都用到该技术 ; 差分打包技术 : 使用 bsdiff.so
Linux文件操作 Linux中,一切皆文件(网络设备除外)。 硬件设备也“是”文件,通过文件来使用设备。 目录(文件夹)也是一种文件。...boot:这里存放的是启动Linux时使用的一些核心文件,包括一些连接文件和镜像文件。...deb:deb是Device(设备)的缩写,该目录下存放的是Linux的外部设备,在Linux中访问设备的方式和访问文件的方式是相同的。...系统会自动识别一些设备,例如U盘、光驱等,当识别后,Linux会把识别的设备挂载到这个目录下。...---- Linux文件的操作方式 文件描述符fd fd是一个大于等于0的整数。 每打开一个文件,就创建一个文件描述符,通过文件描述符来操作文件。
如常见的服务端进行 bsdiff,客户端进行 bspatch。
领取专属 10元无门槛券
手把手带您无忧上云