• 在windows8之前,微软的Windows平台一直没有提供一个想苹果的AppStore或者Linux的包管理这样的统一软件管理工具。所以Windows下的软件安装、升级、卸载的事情一般都是软件自己去负责。这样导致Windows下的软件安装、升级、卸载的方式五花八门,但总体上来说方法都大同小异。安装程序主要分两种,下载器的安装包和离线安装包,这个不赘述。
  • 今天重点聊一下升级,升级功能看似简单,但对于一个想持续经营的客户端软件来说却是一个重要的生命线。开发团队辛苦修改的bug、做的新功能都希望用户能马上通过升级新版本体验到。
  • 在互联网还没普及的蛮荒年代,很多软件公司升级都是发布离线升级包,一般这种包就是一个安装程序,它只负责安装程序需要更新的部分,然后做一些修改注册表之类的系统配置以适应新版本的功能。
  • 现在互联网普及后,所有的PC客户端软件基本上都是使用的在线升级。
    • 最简单的在线升级方式是首先客户端发送检测更新的消息到服务器,服务器给返回是否有新版本,最新版本号以及下载地址等信息,客户端就根据这些信息处理。如果有更新就去刚刚获取到的地址下载最新的安装程序,然后执行安装程序更新。
    • 后来大家觉得每次都重新安装太麻烦,而且安装包也特别大,下载也非常耗时。于是这个下载的程序被替换成了一个压缩包,里面装的是程序需要更新的文件。升级程序下载好压缩包后再解压到安装目录中就完成了软件的升级。
  • 随着敏捷开发方式的普及,软件的升级就变得越来越频繁了。对于PC客户端软件每次升级时主程序以及一些重要的动态库都有可能更新,所以下载的压缩包也会比较大。于是就产生了比较文件二进制差异的算法BsDiff,以及Google基于其进一步改进的Courgette(小胡瓜)。这些算法的加入可以让补丁包缩小了n个数量级。这样需要客户端去下载的压缩包就会很小了,下载耗时也会大大缩短。
  • 另外值得一提的是,随着软件升级包大小越来越大,用户下载更新文件的等待时间也越来越长,于是有些软件就采用了后台静默下载的方式。这种方式虽然流氓,但可能对于用户来说体验要好一些。那么这种情况下主程序一般都还在运行,而升级程序下载完成后想要更新文件立即升级就必须关闭主程序然后进行文件替换,以免文件被占用,导致升级失败。于是Google的chorme搞出一个双目录更新的方法来应对这种情况。所谓双目录更新就是把原来的文件先复制到另一个目录下,更新程序的时候就更新这个文件目录,升级完成后就直接从新的目录中启动新版本。
  • chrome的目录结构是这样的:
Chorme+Application+57.0.2987.110+57.0.2987.88chrome.exe
  • 可以看到,他是以版本号做目录名。以后启动chrome.exe时去加载最新版本就可以了。当然它能这样做主要因为chrome.exe本身是个很小的程序,基本它自身是不需要升级的,它主要负责的就是检测版本号然后加载新版本的dll。
  • 当然现在的客户端升级程序还涉及一些入灰度,md5完整性检测断点续传等技术这里也不在赘述。下面我简单介绍一下BsDiff和Courgette。

BsDiff: Linux中的一个开源工具,致力于快速和轻量的更新Linux的操作系统漏洞(跟微软的安全补丁类似),其算法的核心思想是基于统计学规律进行近似匹配,然后通过一系列的变化(比如BWT变换)提高“近似段”的压缩率。
Courgette: Google Chrome升级系统的核心模块,基于BsDiff,但对其进行了一系列的改进,将平台相关的信息(即x86汇编指令)融入其中,以期望更精确的定位指针,从而避免统计算法在差异明显时候的错误率。

  • Google官方给了一个10M的升级包例子使用bsdiff可以看到包小了不少,用Courgette更是少了几个数量级。

  • 使用bsdiff算法我们的升级过程是这样的:
server:diff = bsdiff(original, update)transmit diffclient:receive diffupdate = bspatch(original, diff)
  • 大致流程就是这使用bsdiff算法比较不同版本的二进制文件制作补丁包,客户端下载补丁包后调用bspatch生成新的二进制文件。

  • 使用Courgette的升级过程是这样的:

server:asm_old = disassemble(original)asm_new = disassemble(update)asm_new_adjusted = adjust(asm_new, asm_old)asm_diff = bsdiff(asm_old, asm_new_adjusted)transmit asm_diffclient:receive asm_diffasm_old = disassemble(original)asm_new_adjusted = bspatch(asm_old, asm_diff)update = assemble(asm_new_adjusted)
  • Courgette对于bsdiff的优化主要就是在adjust这一步上,具体可以参考Courgette官方说明。

  • 最后,Google还开源了一套Windows下的升级协议,大家有兴趣也可以研究下omaha。

作者:吴尼玛cs
链接:https://www.jianshu.com/p/ca40bfc4a81f
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

PC客户端软件升级方式简史相关推荐

  1. 关于PC客户端软件开发的一些思考

    PC客户端(Win/Mac)开发四年的从业者来回答一波,PC客户端广义的应该指的是所有运行在个人电脑上的软件(包括Mac.Linux.Win)这三类主流的操作系统. 它的前景好坏的话,主要的对比对象, ...

  2. 基于Qt开发PC客户端软件

    Qt 软件库用来开发PC端软件非常方便,如果有一套系统,即有服务端.移动端及PC端,那么PC端最适合用Qt来开发,设计界面所见即所得.基于C++语言高效灵活.下面基于本人之前开发的一个小软件来说说. ...

  3. PC客户端软件的安装和卸载测试知识点

    一.安装测试 (一)安装方式 1.默认安装 2.自定义安装 (1)选择C盘安装 (2)选择非C盘安装 (3)安装路径带有中文 3.首次安装 4.重复安装 5.卸载后重新安装 6.不同电脑分辨率下安装 ...

  4. pc客户端软件自动化测试工具,自动化测试工具(QuickTester)

    自动化测试工具(QuickTester)是一款先进的web自动化测试解决方案,用于创建功能和回归测试.它自动捕获.验证和重放用户的交互行为.QuickTester V7.0 版本支持Windows X ...

  5. 更新无限无线连接更新服务器,02-H3C WBC560多业务无线控制器软件升级操作指导...

    本文中的绿洲平台指的是WBC560多业务无线控制器中的本地绿洲. 1.1.1  软件升级方式简介 AC支持通过命令行进行软件升级和通过Web页面进行软件升级,命令行升级方式只能通过以太网口telnet ...

  6. 以互联网思维做好客户端软件

    加入爱奇艺的时间不长,但我感受到的震撼却不小.在外企打拼了十几个春秋,今年终于有机会进入一家国内顶尖的互联网企业,真真切切地有一番不太一样的体验. 不过,我今天并不想说在外企工作与国内企业的差别.目前 ...

  7. PC客户端的互联网化设计

    伴随着手机,平板电脑为代表的移动互联网的不断发展,云计算和云服务的兴起,更是推动着传统企业不断地往互联网方向转型.作为Windows客户端程序员,自己也在时刻地警醒着:要抛弃传统软件开发思维,努力学习 ...

  8. 一个能发朋友圈微信pc客户端

    一个能发朋友圈微信pc端! 微信通信接口定义 1.基础消息类型 1.客户端发送的心跳包 HeartBeatReq = 1001; 2.消息接收确认回复(接收或拒绝接收) MsgReceivedAck ...

  9. 嵌入式开发<单片机软件升级>

    嵌入式开发<单片机软件升级> 前言 一.单片机软件升级方式 二.IAP升级原理 1.FLASH区域划分 2. FLASH各个区域作用 三.IAP软件BOOT设计 1. 第一种设计方法 2. ...

最新文章

  1. matlab学习200316
  2. react native release语法问题解决
  3. 教你如何更改xshell中的转发规则
  4. 雷赛运动控制卡_EeIE智博会展商推荐雷赛智能—智能装备运动控制领域的知名品牌和行业领军企业...
  5. Vue 2.x + Webpack 4.x的那些事---萌新必备
  6. matlab 计算N天前(后)的日期
  7. [Spring5]IOC容器_底层原理
  8. 设定应用程式上的 Badge -- IOS
  9. 赤小豆和红小豆有什么区别,哪种和薏米煮粥更好些?
  10. Android之汽车音频
  11. Django的rest_framework的视图之Mixin类编写视图源码解析...
  12. es6转es5_ES6 配置运行环境
  13. Atitit mtp ptp rndis midi协议的不同区别
  14. Reportlab生成图文并茂的pdf报告
  15. php如何让img显示为圆形,css如何将图片设置为圆形图片
  16. 基于AlexNet网络的猫十二分类
  17. java 中常用英语_java中常用英语
  18. 元学习:实现通用人工智能的关键!
  19. MySQL基础(附练习题+答案)
  20. vs环境下的 时间差值

热门文章

  1. qt检测网络状态 Linux,Qt检测设备是否在线(Ping)
  2. IE11兼容性问题——网站提示“打印插件只支持IE浏览器”
  3. C++ ~ 深拷贝与浅拷贝图文详解
  4. 怎样制作一个横版格斗过关游戏 Cocos2d-x 2.0.4
  5. Origin软件2022中文版下载安装,Origin软件数据分析绘图特色功能
  6. php redis限流,【PHP】用Redis实现限流的常见方案
  7. 维修一块山寨三星860EVO固态,得一微YS9082HC+3颗intel QLC黑片
  8. assert 能提高编程效率?你确定?
  9. Centri防火墙(技术介绍)
  10. 算了一笔植发的账,决定还是秃着吧