Android bsdiff/bspatch imgdiff/applypatch
来源:互联网 发布:蓝牙控制单片机程序 编辑:程序博客网 时间:2024/06/05 18:56
Google在Android系统了提供了自己的二进制差分工具,bsdiff/bspatch,代码位于external/bsdiff目录下。
在Ubuntu系统上可以直接通过apt进行安装。
sudo apt-get install bsdiff
使用方法如下:
diff:bsdiff oldfile newfile patchpatch:bspatch oldfile newfile patch
虽然针对普通文件bsdiff/bspatch效率非常高。但对于一些压缩文件,由于压缩前内容非常小的变化会导致压缩后整个二进制文件产生非常巨大的变化,这样patch文件会非常大。如Android系统中常用的boot.img/recovery.img,本质上就是一块包含压缩和非压缩数据的二进制文件。
为了解决这个问题,Android也提供了imgdiff工具(bootable/recovery/applypatch)。在source文件中搜索压缩部分(0x1f8b0800),将其划分成多个小块。
- 非压缩部分称为normal,直接使用bsdiff生成补丁。
- gzip压缩部分成为GZIP类型,先将内容解压缩,逐个文件使用bsdiff生成补丁,将这些补丁通过GZIP再压缩到一起。
最后将各部分的补丁合并到一起添加一个文件头生成最终的补丁文件。
* * "IMGDIFF1" (8) [magic number and version] * chunk count (4) * for each chunk: * chunk type (4) [CHUNK_{NORMAL, GZIP, DEFLATE, RAW}] * if chunk type == CHUNK_NORMAL: * source start (8) * source len (8) * bsdiff patch offset (8) [from start of patch file] * if chunk type == CHUNK_GZIP: (version 1 only) * source start (8) * source len (8) * bsdiff patch offset (8) [from start of patch file] * source expanded len (8) [size of uncompressed source] * target expected len (8) [size of uncompressed target] * gzip level (4) * method (4) * windowBits (4) * memLevel (4) * strategy (4) * gzip header len (4) * gzip header (gzip header len) * gzip footer (8) * if chunk type == CHUNK_DEFLATE: (version 2 only) * source start (8) * source len (8) * bsdiff patch offset (8) [from start of patch file] * source expanded len (8) [size of uncompressed source] * target expected len (8) [size of uncompressed target] * gzip level (4) * method (4) * windowBits (4) * memLevel (4) * strategy (4) * if chunk type == RAW: (version 2 only) * target len (4) * data (target len) *
在patch时候,同样根据不同的部分使用不同的patch方式,最终合并到一起。Android提供了库libapplypatch和可执行程序applypatch用于补丁操作。
目前只支持GZIP压缩格式,我们也可以根据这种思想进行扩展,比如EXT4格式的IMG等等。
另外,source和dest必须划分成同样数量的小块,source/dest 文件中压缩部分必须使用与imgdiff同样的GZIP压缩算法,即使用minizip进行压缩。
另外,根据patch操作所使用的内存大小依赖于source以及patch的大小,根据这种分块的思想,我们可以在diff时将文件划分成一定大小的小块,针对这些小块逐一生成patch,在patch时,也分块进行patch,这样可以减少patch操作的内存使用量,可以将算法应用到一些内存受限设备上。
- Android bsdiff/bspatch imgdiff/applypatch
- Android 增量更新 bsdiff bspatch
- Android 增量更新 bsdiff bspatch
- android 增量更新 bsdiff\bspatch库编译
- Android增量更新——bsdiff&bspatch
- window下直接运行的bsdiff和bspatch文件
- Android:Windows系统中使用bsdiff
- android bsdiff 增量升级更新 热补丁 hotpatch(一)
- install-recovery.sh & applypatch
- bsdiff源码
- bsdiff test
- Android 增量更新 -- 客户端bsdiff库的编译及jni调用
- Android增量升级之bsdiff.c:(.text+0x151b):对‘BZ2_bzWriteOpen’未定义的引用的解决
- 采用 bsdiff 开源库 Android 的增量更新,差分更新 服务器端&客户端
- bsdiff for ubuntu
- bsdiff 文档翻译
- Windows中使用bsdiff
- Bsdiff增量更新实现
- Linux基础命令学习:文本编辑vim
- phpcms伪静态设置方法
- HDU 2604 Queuing
- Angular的内置指令
- Visualizing Representations: Deep Learning and Human Beings 简单翻译(数据可视化:深度学习和人类)(未完)
- Android bsdiff/bspatch imgdiff/applypatch
- linux环境下搭建 j2ee环境
- 最后一次异常法_操作笔记
- JNA调用C语言动态链接库学习实践总结
- 字符串与整数的转换函数 atoi 和sprintf
- SS3.1_Hibernate_ByMyEclipse 使用MyEclipse创建Hibernate项目
- Spring学习
- 机器学习十大算法
- C++--第五课-继承