当前位置: 首页 > news >正文

Bsdiff,Bspatch 的差分增量升级(基于Win和Linux)

目录

背景

内容

准备工作

在windows平台上

在linux平台上

正式工作

生成差分文件思路

作用差分文件思路

在保持相同目录结构进行差分增量升级

服务端(生成差分文件)

客户端(作用差分文件)


背景

像常见的Android 的linux平台,游戏,系统更新都会用到这一种方式。

以我自己的理解,这种方式有些像git中的版本管理, 以最少的时间进行版本管理.核心在于如何去记录文件的差异.

服务器端:

通过

 bsdiff  old  new  patchfile_path 

生成差分文件.一般以.patch的文件命名.

客户端: 根据patch文件 通过

bspatch oldfile newfile patchfile_path

一般情况下,本以为可以直接通过压缩包的形式去进行, 安卓平台的.apk文件是可以的,单片机的可执行hex等格式的文件也是可以的. 但通过压缩的压缩包则可能会有隐患. 通过开会讨论以及本人查询资料发现 会因为压缩算法,压缩文件顺序的不一样而导致差分包出现问题.

原因有

主要原因有:

1. 不同的压缩算法会产生不同的压缩数据。即使原始数据相同,通过不同算法压缩结果也不完全一样。这会直接影响bsdiff的比较结果。

2. 即使使用同一压缩算法,压缩文件内原始数据的顺序改变也可能改变压缩效果。压缩算法利用重复模式来达到压缩效果。顺序改变会打乱这种模式。

3. bsdiff是按顺序比较数据生成差分的。所以就算压缩原理数据相同,其在压缩文件中的顺序变化也会导致bsdiff生成不同的差分补丁。

4. 压缩算法本身就利用了字典及顺序来提高压缩率。这与bsdiff的工作原理有一定冲突。综上,为了生成一致的bsdiff补丁,同一个数据生成压缩包时需要保证使用同一算法和稳定的顺序。否则差分结果可能会有较大变化。一般需要压缩数据再差分时,需要注意控制这两个因素,或者考虑在解压后对原始数据文件差分。

所以,考虑解压后保持相同的目录结构进行差分,即为生成的.patch文件和原工程有相同的目录.

所以需要写一个脚本,生成一个差分文件夹(目录),这个差分文件夹与原工程有相同的目录结构.

后面再根据这个差分文件夹进行升级,即为patch文件与原文件作用生成新文件,新目标和原目标相同.通过这种服务器上生成差分包,客户端上作用差分包的形式,差分包可以压缩,在客户端上解压缩,这样能更快更合理.

所以,总共需要有2个bash脚本,一个放服务器上,生成差分包.一个放客户端上,在收到差分包后进行本地升级.

内容

bsdiff和bspatch去官网上截至2023年10月27日没有下载源码的权限,所以得去别的地方找找源码.

准备工作

在windows平台上

参考

whistle713/bsdiff-win: bsdiff Windows binaries and Visual Studio 2015/2019 project. (github.com)

里面有提供能够在windows平台上允许的.exe可执行文件.

在linux平台上

参考

红橙Darren视频笔记 bsdiff bspatch 使用(Linux下)_洌冰的博客-CSDN博客

完成编译

正式工作

这里需要考虑到旧的目标和新的目标的一些特殊情况.

  1. 新目标有新增文件的情况
  2. 新目标有删除原来旧文件的情况
  3. 新目标和旧目标的目录和文件都能对上,只是有变化.
  4. 旧目标和新目标有 大小为0 bytes 文件的情况(bsdiff失效)

相信一般的升级都会遇到 1.2.3.4所有情况,

对于第4种情况,不清楚是不是bsdiff的版本问题还是linux系统的问题,我在本地的liunx没有这个问题.

bsdiff在处理 大小为 0 bytes的文件时在linux上报错

报错

bsdiff:mmap()  xxx:Invalid argument

思路:

对于第一种和第二种情况.

新目标新增: 在旧目标中生成一个相同名字的文件,不过大小为0 bytes

新目标有删除有原来旧文件的情况: 在新目标中生成一个相同名字的文件,大小依然为0bytes

这样的话,只要不出现 4 的这种问题都是能够通过bsdiff 生成相应的bspatch文件的.

生成差分文件思路

1.同步旧目标(对应新目标有文件增加时)

2.同步新目标(对应新目标删除了旧文件时)

3.递归遍历目标中的每一个文件,在另一个目标中进行查找, 可以直接通过bsdiiff 生成差分文件,

即使是两个相同的文件,也会生成patch文件,只不过bspatch 作用这个patch文件时并不会起作用,这样是非常方便了,都不需要进行判断了。这样表现为每一个文件都有对应的差分文件.(这个需要再我的代码上改一改)

而我下面并没有这么做,而是根据md5的值判断文件不同后再生成对应的patch文件.

作用差分文件思路

直接遍历生成的差分文件目录结构,调用bspatch.

在保持相同目录结构进行差分增量升级

服务端(生成差分文件)

调用.

 ./gen.sh(脚本名) ./old(旧目录) ./new (新目录)

最终会生成一个以日期后缀的差分文件的目录(和原目录保持相同的目录结构) 

#!/bin/bash# check if two arguments are given
if [ $# -ne 2 ]; thenecho "Usage: $0 oldfolder newfolder"exit 1
fi# check if the arguments are valid directories
if [ ! -d "$1" ] || [ ! -d "$2" ]; thenecho "Invalid directories"exit 2
fi# create a new directory for patch files
patch_dir="patch_$(date +%Y%m%d%H%M%S)"
mkdir -p "$patch_dir"# sync in new target
find "$1" -type f | while read oldfile; do# get the relative path of the filerel_path=${oldfile#$1/}# get the corresponding file in the second directorynewfile="$2/$rel_path"# exist in old and not exist in new and create same name to instead in the new folder if [ ! -f "$newfile" ]; thenecho -e "\033[0;36m [disapper in new]: $newfile Generate 0 Bytes to instead in new target \033[0m"mkdir -p "$(dirname $newfile)"> $newfile  fidone# sync in old target
find "$2" -type f | while read newfile; do# get the relative path of the filerel_path=${newfile#$2/}# get the corresponding file in the second directoryoldfile="$1/$rel_path"# exist in new and not exist in old and create same name to instead in the old folder if [ ! -f "$oldfile" ]; thenecho -e "\033[0;36m [disapper in old]: $oldfile Generate 0 Bytes to instead in old target  \033[0m"#  create the parent directory if neededmkdir -p "$(dirname oldfile)"> $oldfile  fidone# Generate patch 
find "$1" -type f | while read oldfile; do# get the relative path of the filerel_path=${oldfile#$1/}# get the corresponding file in the second directorynewfile="$2/$rel_path"# Haved sync and create the patch file namepatch_file="$patch_dir/$rel_path.patch"# create the parent directory if neededmkdir -p "$(dirname "$patch_file")"# use bsdiff to generate the patch fileoldmd5=$(md5sum $oldfile | awk '{print $1}')newmd5=$(md5sum $newfile | awk '{print $1}')if [ "$oldmd5" = "$newmd5" ]; thenecho -e "\033[0;32m Don't Need to Change \033[0m"elsebsdiff "$oldfile" "$newfile" "$patch_file"echo -e "\033[0;33mGenerated patch for $rel_path \033[0m"fidoneecho "Done. Patch files are in $patch_dir"

客户端(作用差分文件)

 调用

脚本名 旧目标 新目标(也可以是旧目标 ,相当与替换旧目标) 差分目录
#!/bin/bash# check if two arguments are given
if [ $# -ne 3 ]; thenecho "Usage: cmd  oldfolder newfolder patchfolders"exit 1
fi# new generate 
if [ ! -e "$2" ]; then
mkdir $2
fi# check if the arguments are valid directories
if [ ! -d "$1" ] || [ ! -d "$3" ] ; thenecho "Invalid directories"exit 2
fi#loop item in path_item
find "$3" -type f -name "*.patch" | while read patch_item; dotemp=${patch_item#$3/}temp=${temp%.patch}  #equal to   temp=${temp:0:${#temp}-6}oldfile="$1/$temp"newfile="$2/$temp"mkdir -p "$(dirname "$newfile")"echo -e "\033[0;32m Generate $oldfile $newfile \033[0m"# execute bspatchbspatch "$oldfile" "$newfile" "$patch_item"done

一般调用过程

diff -rq ./old ./new(此时会看到文件差异)./gen ./old ./new./upgrate ./old ./old ./patch_xxx diff -rq ./old ./new (没有输出表示更新升级完毕)

相关文章:

Bsdiff,Bspatch 的差分增量升级(基于Win和Linux)

目录 背景 内容 准备工作 在windows平台上 在linux平台上 正式工作 生成差分文件思路 作用差分文件思路 在保持相同目录结构进行差分增量升级 服务端(生成差分文件) 客户端(作用差分文件) 背景 像常见的Android 的linux平台,游戏,系统更新都…...

【3妹教我学历史-秦朝史】2 秦穆公-韩原之战

插: 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 坚持不懈,越努力越幸运,大家一起学习鸭~~~ 3妹:2哥,今天下班这么早&#…...

车载控制器

文章目录 车载控制器电动汽车上都有什么ECU 车载控制器 智能汽车上的控制器数量因车型和制造商而异。一般来说,现代汽车可能有50到100个电子控制单元(ECU)或控制器。这些控制器负责管理各种系统,如发动机管理、刹车、转向、空调、…...

回归预测 | Matlab实现RIME-CNN-SVM霜冰优化算法优化卷积神经网络-支持向量机的多变量回归预测

回归预测 | Matlab实现RIME-CNN-SVM霜冰优化算法优化卷积神经网络-支持向量机的多变量回归预测 目录 回归预测 | Matlab实现RIME-CNN-SVM霜冰优化算法优化卷积神经网络-支持向量机的多变量回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.RIME-CNN-SVM霜冰优化算…...

使用Jaeger进行分布式跟踪:学习如何在服务网格中使用Jaeger来监控和分析请求的跟踪信息

🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 &a…...

添加多个单元对象

开发环境: Windows 11 家庭中文版Microsoft Visual Studio Community 2019VTK-9.3.0.rc0vtk-example参考代码 demo解决问题:不同阶段添加多个单元对象。 定义一个点集和一个单元集合,单元的类型可以是点、三角形、矩形、多边形等基本图形。只…...

十八、模型构建器(ModelBuilder)快速提取城市建成区——批量掩膜提取夜光数据、夜光数据转面、面数据融合、要素转Excel(基于参考比较法)

一、前言 前文实现批量投影栅格、转为整型,接下来重点实现批量提取夜光数据,夜光数据转面、夜光数据面数据融合、要素转Excel。将相关结果转为Excel,接下来就是在Excel中进行阈值的确定,阈值确定无法通过批量操作,除非采用其他方式,但是那样的学习成本较高,对于参考比较…...

HarmonyOS开发:基于http开源一个网络请求库

前言 网络封装的目的,在于简洁,使用起来更加的方便,也易于我们进行相关动作的设置,如果,我们不封装,那么每次请求,就会重复大量的代码逻辑,如下代码,是官方给出的案例&am…...

【杂记】Ubuntu20.04装系统,安装CUDA等

装20.04系统 安装系统的过程中,ROG的B660G主板,即使不关掉Secure boot也是可以的,不会影响正常安装,我这边出现问题的主要原因是使用了Ventoy制作的系统安装盘,导致每次一选择使用U盘的UEFI启动,就会跳回到…...

040-第三代软件开发-全新波形抓取算法

第三代软件开发-全新波形抓取算法 文章目录 第三代软件开发-全新波形抓取算法项目介绍全新波形抓取算法代码小解 关键字: Qt、 Qml、 抓波、 截获、 波形 项目介绍 欢迎来到我们的 QML & C 项目!这个项目结合了 QML(Qt Meta-Object …...

分享一个基于asp.net的供销社农产品商品销售系统的设计与实现(源码调试 lw开题报告ppt)

💕💕作者:计算机源码社 💕💕个人简介:本人七年开发经验,擅长Java、Python、PHP、.NET、微信小程序、爬虫、大数据等,大家有这一块的问题可以一起交流! 💕&…...

Java基于SpringBoot的线上考试系统

1 摘 要 基于 SpringBoot 的在线考试系统网站,功能模块具有课程管理、成绩管理、教师管理、学生管理、考试管理以及基本信息的管理等,通过将系统分为管理员、授课教师以及学生,从不同的身份角度来对用户提供便利,将科技与教学模式…...

flask socketio 实时传值至html上【需补充实例】

目前版本如下 Flask-Cors 4.0.0 Flask-SocketIO 5.3.6from flask_socketio import SocketIO, emit 跨域问题网上的普通方法无法解决。 参考这篇文章解决 Flask教程(十九)SocketIO - 迷途小书童的Note迷途小书童的Note (xugaoxiang.com) app Flask(__name__) socketio Sock…...

C# Onnx P2PNet 人群检测和计数

效果 项目 代码 using Microsoft.ML.OnnxRuntime; using Microsoft.ML.OnnxRuntime.Tensors; using OpenCvSharp; using System; using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms;namespace Onnx…...

idea提交代码一直提示 log into gitee

解决idea提交代码一直提示 log into gitee问题 文章目录 打开setting->Version control->gitee,删除旧账号,重新配置账号,删除重新登录就好 打开setting->Version control->gitee,删除旧账号,重新配置账号,删除重新登…...

ATECLOUD如何进行电源模块各项性能指标的测试?

ATECLOUD平台进行电源模块各项性能指标的测试是通过以下步骤实现的: 连接测试设备:将测试设备与云计算服务器连接,实现数据采集和远程控制。测试设备包括示波器、电子负载、电源、万用表等,这些设备通过纳米BOX连接到云测试平台上…...

Mysql查询训练——50道题

--1.学生表 Student(SId,Sname,Sage,Ssex) --SId 学生编号,Sname 学生姓名,Sage 出生年月,Ssex 学生性别 --2.课程表 Course(CId,Cname,TId) --CId 课程编号,Cname 课程名称,TId 教师编号 --3.教师表 Teacher(TId,Tname) --TId 教师编号,Tname 教师姓名 --4.成绩表 SC(SId…...

学习笔记|正态分布|图形法|偏度和峰度|非参数检验法|《小白爱上SPSS》课程:SPSS第三讲 | 正态分布怎么检验?看这篇文章就够了

目录 学习目的软件版本原始文档为什么要假设它服从正态分布呢?t检验一、图形法1、频数分布直方图解读 2、正态Q-Q图操作解读 3、正态P-P图SPSS实战操作解读 二、偏度和峰度解读: 三、非参数检验法注意事项 四、规范表达五、小结划重点 学习目的 SPSS第三讲 | 正态…...

Android NDK开发详解之ndk-build 脚本

Android NDK开发详解之ndk-build 脚本 内部原理从命令行调用选项可调试 build 与发布 build要求 ndk-build 脚本使用 NDK 的基于 Make 的构建系统构建项目。我们针对 ndk-build 使用的 Android.mk 和 Application.mk 配置提供了更具体的文档。 内部原理 运行 ndk-build 脚本相…...

应用于智慧矿山的皮带跑偏视频分析AI算法

一、引言 随着科技的发展,人工智能技术已经在各个领域得到广泛应用。而在智慧矿山领域,皮带跑偏视频分析是其中一个重要的应用方向。本文将详细介绍皮带跑偏视频分析AI算法的原理,以期为智慧矿山的发展提供有益的参考。 二、算法原理 1. 视…...

ESP32嵌入式Web文件管理器:支持SPIFFS/LittleFS/SD卡

1. EspWebFileManager 库概述EspWebFileManager 是一款专为 ESP32 平台设计的嵌入式 Web 文件管理中间件库,其核心目标是将本地文件系统操作能力通过轻量级 HTTP 服务暴露至浏览器端,实现免串口、免烧录工具的现场文件运维。该库并非独立文件系统驱动&am…...

Android 12 蓝牙权限适配指南:从经典到低功耗的全面解析

1. Android 12蓝牙权限变革全景解读 去年给医疗设备厂商做BLE固件升级功能时,突然发现测试机上的蓝牙扫描失灵了。排查半天才发现是targetSdkVersion升级到31后,沿用老权限方案导致的兼容性问题。这次踩坑经历让我深刻意识到,Android 12的蓝牙…...

GIL消失后的混沌现场:共享对象修改异常、原子性丢失、引用计数溢出,一文收全7种致命报错及防御代码模板

第一章:GIL消失后的并发危机全景图当CPython的全局解释器锁(GIL)真正消失,Python将首次具备原生、安全的多线程并行执行能力。但这并非一劳永逸的性能飞跃,而是一场系统级并发范式的重构风暴——内存模型、对象生命周期…...

保姆级教程:用ESP-IDF Monitor和Heap Tracing给LVGL任务栈“拍个X光”

ESP32-S3深度调试:用Heap Tracing与Monitor透视LVGL内存瓶颈 当LVGL动画在ESP32-S3上随机崩溃时,大多数开发者会本能地调整栈大小参数——这就像给发烧病人直接开退烧药,却不去检查感染源。本文将带您使用ESP-IDF的专业诊断工具,…...

OpenClaw定时任务详解:GLM-4.7-Flash每日自动生成工作报告

OpenClaw定时任务详解:GLM-4.7-Flash每日自动生成工作报告 1. 为什么需要自动化日报系统 上周三晚上11点,我盯着空白的周报文档发呆——明明这周完成了3个需求迭代和2次跨部门协作,却怎么都想不起具体细节。翻遍Git记录、邮件和会议纪要才勉…...

手把手教你用ZPL指令在Zebra打印机上打印动态条码(附完整代码示例)

手把手教你用ZPL指令在Zebra打印机上打印动态条码(附完整代码示例) 在物流仓储、零售结算和智能制造场景中,自动生成并打印条码标签是提升作业效率的关键环节。Zebra打印机凭借其工业级稳定性和ZPL语言的高效指令集,成为行业标配…...

ArcMap新手必看:5分钟搞定面要素的四至信息提取(附字段重命名技巧)

ArcMap新手实战:5分钟高效提取面要素四至信息与字段优化技巧 刚接触ArcMap的GIS实习生或规划人员,常常需要快速处理行政区划数据并生成规范的四至报告。面对属性表中密密麻麻的英文字段名和冗余数据,如何高效完成从数据加载到结果美化的全流程…...

Kafka Connect集群管理可视化界面:高效实现多环境连接器配置实战指南

Kafka Connect集群管理可视化界面:高效实现多环境连接器配置实战指南 【免费下载链接】kafka-connect-ui Web tool for Kafka Connect | 项目地址: https://gitcode.com/gh_mirrors/ka/kafka-connect-ui 在Kafka生态系统中,连接器管理一直是数据…...

OpenClaw+GLM-4.7-Flash:智能客服机器人搭建指南

OpenClawGLM-4.7-Flash:智能客服机器人搭建指南 1. 为什么选择这个技术组合? 去年夏天,我接手了一个小团队的客服系统改造项目。团队只有5个人,却要处理日均300的客户咨询。传统客服系统要么太贵,要么定制化程度不够…...

从SUB、PUSH到栈操作:5条指令带你吃透微程序控制器设计核心

从SUB、PUSH到栈操作:5条指令带你吃透微程序控制器设计核心 在计算机组成原理的探索中,微程序控制器设计一直是连接硬件与软件的桥梁。不同于直接通过硬连线控制,微程序控制采用"存储逻辑"的思想,将每条机器指令的执行分…...