疑难问题之bsdiff 问题背景 项目中使用到了bsdiff命令进行增量包的生成,不过在使用中发现对于某些文件,bsdiff命令会卡住。...诊断问题 刚开始以为是操作系统的问题,换了个全新的系统,按网上的教程从http://www.daemonology.net/bsdiff/下载bsdiff的源码,重新编译得到bsdiff,这里把原来卡住的两个文件重新试了一次...看来这个是bsdiff本身存在问题,在网上搜索了下,终于发现有人遇过一样的问题。很奇怪,在国内也有很多人用bsdiff生成增量包,但却没人反馈这个问题。...这样就好办了,直接编译google版的bsdiff命令出来就好了。...mv $HOME/local/bin/bsdiff $HOME/local/bin/bsdiff2 效果 使用新的bsdiff2命令测试了下,目前生成增量包一切正常,再也没有卡住的现象了,而且占用的内存也比原来小不少
以上便是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...xiaoyzhang$ md5 bsdiff bspatch_new MD5 (bsdiff) = e775531d35bb8aff34ffd733fdf47605 MD5 (bspatch_new)...20.png 游戏更新还需要哪些能力 有了BSDiff,我们可以很方便的做到二进制文件的差异更新,但BSDiff也并非完美,比如其存在一些应对移动应用时的稳定性以及对DEX文件的压缩效率不高等问题。
然后我们需要生成.dll动态库,需要我们在配置中,将“配置类型”改为“动态库(.dll)” 编译生成.dll动态库后 , 赋值到服务器项目的目录下 , 或是Java项目也可以 。...4.创建JNI方法 , 修改main函数 既然知道了需要传入的参数 , 那么就可以创建一个Java工程 , 编写JNI方法了。...两个文件 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...修改了CMakeLists.txt文件的路径之后 , 需要在build.gradle中修改一下配置了: 并且配置一下build环境 4.然后就是在java代码中编写合并差分文件的JNI方法 public
Apk文件的拆分和合并需要用bsdiff和bzip2这两个工具 官方下载: bsdiff:http://www.daemonology.net/bsdiff/ (包含了两个,一个window平台的...第三个是新文件的名称 第四个是拆分(.patch)文件名 利用下载下来的源码实现自己的可执行文件或者dll包 这边以生产dll动态库,在java工程调用为例 工具:vs2015 创建一个win32...中使用它(或相反)问题的解决方案 解决方法:右键工程 ---> 属性 ---> c++------>预编译头 ----> 预编译头 不使用预编译头 注:vs 切换平台之后 需要重新配置上述依赖 在java...工程调用生成的dll文件,实现文件拆分 将生成的BsDiffUtil.dll的文件复制到java项目工程 ?...${log-lib} ) 编写jni方法去调用bspatch的api 将bspatch的main方修改为bspatch_main; 创建一个在java文件中创建native方法 public class
工具 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" ?...Step4:编写代码 Java层: BsPatchUtil.java ? 调用: ? C层: bspatch-util.h: ? bspatch-util.c ?...Step5:将通过bsdiff生成的差量包1.0.0-to-1.0.1.patchpush到手机sdcard目录 Step6:运行程序,点击”增量更新“ ?
三、实现步骤 1、生成差异包 apk文件的差分和合并都是使用的开源的二进制比较工具 bsdiff 实现。...下载的bsdiff-4.3版本中有几个文件,其中bsdiff.c用于生成差异包的源码,bspatch.c用于合成apk的源码,makefile是生成可执行文件的脚本。...亲测在linux系统中,执行makefile文件,可生成一个bsdiff工具,使用该工具即可生成差异包。 在服务器端使用bsdiff工具生成差异包。...-1)) err(1, "%s", argv[2]); free(new); free(old); return 0; } JNIEXPORT jint Java_com_tencent_smartpatch_utils_PatchUtils_patch...ReleaseStringUTFChars(env, new_apk, ch[2]); (*env)->ReleaseStringUTFChars(env, patch, ch[3]); return ret; } java
丢弃前面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
Android热补丁技术应该分为以下两个流派: Native,代表有阿里的Dexposed、AndFix与腾讯的内部方案KKFix; Java,代表有Qzone的超级补丁、大众点评的nuwa、百度金融的...Native流派与Java流派都有着自己的优缺点。事实上从来都没有最好的方案,只有最适合自己的。...另一方面,由于无法增加变量与类等限制,无法做到功能发布级别; java的代表Qzone;最大挑战在于性能,即Dalvik平台存在插桩导致的性能损耗,Art平台由于地址偏移问题导致补丁包可能过大的问题;...它的粒度是Dex格式的每一项,可以充分利用原本Dex的信息,而BsDiff的粒度是文件,AndFix/QZone 的粒度为class。 关于微信所使用的三种算法,如图所示 ?...BsDiff;它格式无关,但对Dex效果不是特别好,而且非常不稳定。
工程名称 工程描述 aes 高级加密标准(Advanced Encryption Standard) apache-http Http服务器 bison (主机)自动生成语法分析器程序 bluez 蓝牙库 bsdiff...(主机)用于二进制文件生成补丁 bzip2 (主机/目标机)压缩文件工具 clearsilver (主机)模板语言,包括Python、Java、Perl、C的库 dbus freedesktop下的开源...服务器和客户端 e2fsprogs (主机)ext2、3、4文件系统的工具 elfcopy (主机)ELF工具 elfutils (主机)ELF工具 embunit 嵌入式C系统的测试框架 emma (java...)java代码覆盖工具 esd (仅头文件) expat (主机/目标机)XML Parser fdlibm 精确实现IEEE754浮点数 freetype C语言实现的字体光栅化引擎制作的一个软件库...IBM支持的软件国际化的开源项目 iptables 建构在Xtables的架构下,定义“表”(tables)、“键”(chain)、“规则”(rules)来处理封包 jdiff (主机java库)比较工具
github https://github.com/alibaba/dexposed 2.andfix github https://github.com/alibaba/AndFix 3.bsdiff...至于bsdiff,只是阅览了一下,还没研究过。...android.annotation -dontwarn com.alipay.euler.** -keep class com.alipay.euler.** {*;} -keep class * extends java.lang.annotation.Annotation
, 以及 为管理操作界面进行后端支持 ; 管理操作界面 : Android 开发者通过该界面 , 构建 | 发布 | 管理 | 监控 修复包文件 ; 一般情况下 管理操作界面 和 后端服务器 是一个 Java...自定义 DexClassLoader 类加载器 通过各种 代理 | 反射 | HOOK 等操作 加载外部的字节码数据 ; 热修复 , 插件化 , 换肤框架 都用到该技术 ; 差分打包技术 : 使用 bsdiff.so
Xposed框架,完美诠释了AOP编程,这里用到最核心的知识点就是在native层获取到指定方法的结构体,然后改变他的nativeFunc字段值,而这个值就是可以指定这个方法对应的native函数指针,所以先从Java...层跳到native层,改变指定方法的nativeFunc值,然后在改变之后的函数中调用Java层的回调即可。...Tinker还支持资源和So包的更新,So补丁包使用BsDiff来生成,资源补丁包直接使用文件md5对比来生成,针对资源比较大的(默认大于100KB属于大文件)会使用BsDiff来对文件生成差量补丁。
Tinker还支持资源和So包的更新,So补丁包使用BsDiff来生成,资源补丁包直接使用文件md5对比来生成,针对资源比较大的(默认大于100KB属于大文件)会使用BsDiff来对文件生成差量补丁。
类加载方案时效性较差,因为Java的双亲委派机制的原因,首次打开不会重复加载类,需要再次打开才能生效,修复范围广,实现简单,易于控制。 动态加载dex实现热修复 ?...使用bsdiff对新旧apk做差异化分析,获得差异化产物patch.apk补丁文件。...如上图这一过程发生在准备补丁apk的过程中,补丁生成好之后,内部会包含java的class类classes.dex文件、so的打包文件library.so、补丁资源文件; 2.
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方案和我们的优化方案使用后,最终实际下载包的大小对比,可以看出优化效果非常明显, ?
在笔者看来Android热补丁技术应该分为以下两个流派: Native,代表有阿里的Dexposed、AndFix与腾讯的内部方案KKFix; Java,代表有Qzone的超级补丁、大众点评的nuwa、...Native流派与Java流派都有着自己的优缺点,它们具体差异大家可参考上文。事实上从来都没有最好的方案,只有最适合自己的。...Tinker v1.0—性能极致追求之路 为了稳定性与兼容性,微信选择了Java流派。...但我们可以将新旧两个Dex的差异放到补丁包中,这里我们可以调研的方法有以下几个: [1501227617905_8506_1501227617797.jpg] 1、BsDiff;它格式无关,但对Dex...当前微信对于so与部分资源,依然使用bsdiff算法; 2、DexMerge;它主要问题在于合成时内存占用过大,一个12M的dex,峰值内存可能达到70多M; 3、DexDiff;通过深入Dex格式,实现一套生成产物小
因此优化方法是读取这个资源的二进制差分文件,只下载之前二进制文件不存在的二进制内容,然后根据现有的二进制文件计算出新的版本的文件 本文使用的算法请看 二进制数据差异算法 用于减小OTA内容 这些算法相关的也没有什么内容 和 BSDiff
领取专属 10元无门槛券
手把手带您无忧上云