浅析android应用增量升级

本文深入探讨了Android应用增量升级的原理,包括差分升级的原理、操作步骤、工具使用以及实现过程。详细介绍了如何利用二进制差分工具bsdiff生成补丁包,以及补丁包在客户端的合成方法。同时,指出了增量升级存在的不足之处,并通过实验验证了理论的正确性。最后,推荐了性能优化后的Courgette算法作为进一步的研究方向。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景

          随着android应用体积的不断增大,以及应用版本发布的不断更迭,用户的升级成了一个问题,google也意识到不断更新应用对用户流量的损耗,在Google I/O 上提及的 Smart App update,即应用增量升级,或者叫做差分升级的做法,并在新版本的Google Play中得到支持,某天在和群友聊天是扯到这方面的话题,好奇就稍微研究了一下。

增量升级的原理

        今天我们就来实现类似的应用的增量升级。其实增量升级的原理很简单,即首先将应用的旧版本Apk与新版本Apk做差分,得到更新的部分的补丁,例如旧版本的APK有5M,新版的有8M,更新的部分则可能只有3M左右(这里需要说明的是,得到的差分包大小并不是简单的相减,因为其实需要包含一些上下文相关的东西),使用差分升级的好处显而易见,那么你不需要下载完整的8M文件,只需要下载更新部分就可以,而更新部分可能只有3、4M,可以很大程度上减少流量的损失。

          在用户下载了差分包之后,需要在手机端将他们组合起来。可以参考的做法是先将手机端的旧版本软件(多半在/data/下),复制到SD卡或者cache中,将它们和之前的差分patch进行组合,得到一个新版本的apk应用,如果不出意外的话,这个生成的apk和你之前做差分的apk是一致的。

增量升级的操作

        在了解基本的原理之后,我们来逐步解决其中的各个难点。首先是差分包patch的生成。如果做过android手机OTA升级的同学应该注意到,在update.zip中的patch文件夹中有需要与系统文件同名但是以xxx.p 为后缀的文件,他们就是生成的差分patch文件。我们可以借鉴OTA系统升级的差分生成工具来生成我们单个应用apk的差分patch文件。
OTA系统差分包的制作,使用命令:
  1. ./build/tools/releasetools/ota_from_target_files -n -i <</span>旧包> <</span>新包> <</span>差分包名>  
  ./build/tools/releasetools/ota_from_target_files -n -i <旧包> <新包> <差分包名>
        在查阅ota_from_target_files 的代码可知,是在函数WriteIncrementalOTAPacka ge里生成差分包的,在这个函数里边创建了common.Difference这个类,我们继续跟进,在common.py中的类   class Difference(object):里可以看到:    
  1. diff_program DIFF_PROGRAM_BY_EXT.get(ext, "bsdiff")  
    diff_program = DIFF_PROGRAM_BY_EXT.get(ext, "bsdiff")
        至此我们就看到了android中提供我们用来制作差分增量升级包的工具,"bsdiff",这是一个很牛X开源的二进制差分工具.相关的介绍 传送门
相关的代码 地址 或者在android的代码目录下 \external\bsdiff

        bsdiff是二进制差分工具,其对应的bspatch是相应的补丁合成工具
        需要注意的是增量升级的补丁包,是需要在服务器端,即PC端完成,大致流程如,制作补丁时调用bsdiff函数,根据两个不同版本的二进制文件,生成补丁文件。  
  1. 命令:bsdiff oldfile newfile patchfile  
  2. 例如: bsdiff xx_v1.0.apk xx_v2.0.apk xx.patch  
命令:bsdiff oldfile newfile patchfile
例如: bsdiff xx_v1.0.apk xx_v2.0.apk xx.patch

        将生成的补丁包 xx.patch放置在升级服务器上,供用户下载升级,对应多版本需要对不同的版本进行差分,对于版本跨度较大的,建议整包升级。
        用户在下载了 xx.patch补丁包后,需要用到补丁所对应的apk,即原来系统安装的旧版本apk和补丁合成的bspatch工具。系统旧版本的apk可以通过copy系统data/app目录下的apk文件获取,而补丁合成的bspatch可以通过将bspatch源码稍作修改,封装成一个so库,供手机端调用。
  1. bspatch的命令格式为:  
  2. bspatch oldfile newfile patchfile  
   bspatch的命令格式为:
   bspatch oldfile newfile patchfile
      和差分时的参数一样。合成新的apk便可以用于安装。
    以上只是简单的操作原理,增量升级还涉及很多其他方面,例如,升级补丁校验等问题,可以参考android源码中bootable\recovery\applypatch的相关操作,本文只是浅析,在此不表。

不足

      增量升级并非完美无缺的升级方式,至少存在以下两点不足:
    1.增量升级是以两个应用版本之间的差异来生成补丁的,你无法保证用户每次的及时升级到最新,所以你必须对你所发布的每一个版本都和最新的版本作差分,以便使所有版本的用户都可以差分升级,这样操作相对于原来的整包升级较为繁琐,不过可以通过自动化的脚本批量生成。
    2.增量升级成功的前提是,用户手机端必须有能够让你拷贝出来且与你服务器用于差分的版本一致的apk,这样就存在,例如,系统内置的apk无法获取到,无法进行增量升级;对于某些与你差分版本一致,但是内容有过修改的(比如破解版apk),这样也是无法进行增量升级的,为了防止合成补丁错误,最好在补丁合成前对旧版本的apk进行sha1sum校验,保证基础包的一致性。

小实验

        多说无益,实践才是王道。下面就来简单实践一下,检测之前理论的正确性。 下载实验包  ( http://download.youkuaiyun.com/detail/hmg25/4676737),解压后文件如下
  1. ├── bsdiff-4.3        //bsdiff的源码路径,官网获取  
  2. │   ├── bsdiff.1  
  3. │   ├── bsdiff.c  
  4. │   ├── bspatch.1  
  5. │   ├── bspatch.c  
  6. │   └── Makefile  
  7. ├── bsdiff-4.3.tar.gz      
  8. ├── bsdiff4.3-win32     //windows PC端的测试工具  
  9. │   ├── Binary diff.txt  
  10. │   ├── bsdiff.exe  
  11. │   ├── bspatch.exe  
  12. │   └── LICENSE  
  13. ├── bspatch             //手机端的测试工具  
  14. ├── iReader1.6.2.0(v35).apk      // 旧版本的apk  
  15. └── iReader1.8.0.1(v40).apk    //新版本的apk  
├── bsdiff-4.3        //bsdiff的源码路径,官网获取
│   ├── bsdiff.1
│   ├── bsdiff.c
│   ├── bspatch.1
│   ├── bspatch.c
│   └── Makefile
├── bsdiff-4.3.tar.gz    
├── bsdiff4.3-win32     //windows PC端的测试工具
│   ├── Binary diff.txt
│   ├── bsdiff.exe
│   ├── bspatch.exe
│   └── LICENSE
├── bspatch             //手机端的测试工具
├── iReader1.6.2.0(v35).apk      // 旧版本的apk
└── iReader1.8.0.1(v40).apk    //新版本的apk

        以附带的iReader来做测试,在shell进入test\bsdiff4.3-win32文件夹,并下运行命令:
  1. bsdiff.exe   ../iReader1.6.2.0(v35).apk   ../iReader1.8.0.1(v40).apk   ../ireader.patch  
   bsdiff.exe   ../iReader1.6.2.0(v35).apk   ../iReader1.8.0.1(v40).apk   ../ireader.patch
        原来的apk(2.94M),新版本的(3.24M),得到的patch文件为1.77M,用户需要下载的就只是1.77M,流量节省了很多。
      下面先在电脑端将他们合并。
     
  1. bspatch.exe  ../iReader1.6.2.0(v35).apk   ../new.apk    ../ireader.patch  
  bspatch.exe  ../iReader1.6.2.0(v35).apk   ../new.apk    ../ireader.patch
      执行后得到名为new.apk 的合成版本应用,我在ubuntu下进行校验可以看出他们是一样的。

   
    下面我们在手机端合成看看,将根目录下的bspatch(此为手机端运行的)、iReader1.6.2.0(v35).apk 和ireader.patch ,通过adb push到你有权限操作的目录,最好是在/sdcard/下,然后设置bspatch的执行权限,重复操作上述命令,可以合成新版本的apk,稍后安装查看验证版本即可,不详述。

扩展阅读

      使用bsdiff 进行差分升级,还并不是最优的方式,google在它的Chromium项目中,对这个差分算法进行了优化,优化后的版本叫做小胡瓜 Courgette,据说性能优化了很多不是一个数量级了,官方的一个例子:
Full update        10,385,920
bsdiff update      704,512
Courgette update       78,848
        大牛们可以去研究下。
      最近有些小忙,稍后有时间会对增量升级进行封装下,将合成的代码弄成一个lib库,供java调用。有兴趣的童鞋可以自己操作一下~~~
内容概要:本文介绍了多种开发者工具及其对开发效率的提升作用。首先,介绍了两款集成开发环境(IDE):IntelliJ IDEA 以其智能代码补全、强大的调试工具和项目管理功能适用于Java开发者;VS Code 则凭借轻量级和多种编程语言的插件支持成为前端开发者的常用工具。其次,提到了基于 GPT-4 的智能代码生成工具 Cursor,它通过对话式编程显著提高了开发效率。接着,阐述了版本控制系统 Git 的重要性,包括记录代码修改、分支管理和协作功能。然后,介绍了 Postman 作为 API 全生命周期管理工具,可创建、测试和文档化 API,缩短前后端联调时间。再者,提到 SonarQube 这款代码质量管理工具,能自动扫描代码并检测潜在的质量问题。还介绍了 Docker 容器化工具,通过定义应用的运行环境和依赖,确保环境一致性。最后,提及了线上诊断工具 Arthas 和性能调优工具 JProfiler,分别用于生产环境排障和性能优化。 适合人群:所有希望提高开发效率的程序员,尤其是有一定开发经验的软件工程师和技术团队。 使用场景及目标:①选择合适的 IDE 提升编码速度和代码质量;②利用 AI 编程助手加快开发进程;③通过 Git 实现高效的版本控制和团队协作;④使用 Postman 管理 API 的全生命周期;⑤借助 SonarQube 提高代码质量;⑥采用 Docker 实现环境一致性;⑦运用 Arthas 和 JProfiler 进行线上诊断和性能调优。 阅读建议:根据个人或团队的需求选择适合的工具,深入理解每种工具的功能特点,并在实际开发中不断实践和优化。
内容概要:本文围绕低轨(LEO)卫星通信系统的星间切换策略展开研究,针对现有研究忽略终端运动影响导致切换失败率高的问题,提出了两种改进策略。第一种是基于预测的多属性无偏好切换策略,通过预测终端位置建立切换有向图,并利用NPGA算法综合服务时长、通信仰角和空闲信道数优化切换路径。第二种是多业务切换策略,根据不同业务需求使用层次分析法设置属性权重,并采用遗传算法筛选切换路径,同时引入多业务切换管理方法保障实时业务。仿真结果显示,这两种策略能有效降低切换失败率和新呼叫阻塞率,均衡卫星负载。 适合人群:从事卫星通信系统研究的科研人员、通信工程领域的研究生及工程师。 使用场景及目标:①研究和优化低轨卫星通信系统中的星间切换策略;②提高卫星通信系统的可靠性和效率;③保障不同类型业务的服务质量(QoS),特别是实时业务的需求。 其他说明:文章不仅详细介绍了两种策略的具体实现方法,还提供了Python代码示例,包括终端位置预测、有向图构建、多目标优化算法以及业务感知的资源分配等关键环节。此外,还设计了完整的仿真测试框架,用于验证所提策略的有效性,并提供了自动化验证脚本和创新点技术验证方案。部署建议方面,推荐使用Docker容器化仿真环境、Redis缓存卫星位置数据、GPU加速遗传算法运算等措施,以提升系统的实时性和计算效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值