本文转载自:https://blog.csdn.net/csdn66_2016/article/details/73800349

我们在对android系统升级的时候,可以减少升级包的大小,只升级差异部分,也就是差分包升级,相关的描述可以参考:http://blog.csdn.net/csdn66_2016/article/details/70256757

我们在对两个不同的文件进行差分的时候,使用到了两个工具,分别是imgdiff与bsdiff,通过这两个工具产生差异部分的patch,升级的时候打patch即可。这两个工具有什么区别呢,我们看看py中是怎么样区别的:

build/tools/releasetools/common.py:

  1. DIFF_PROGRAM_BY_EXT = {
  2. ".gz" : "imgdiff",
  3. ".zip" : ["imgdiff", "-z"],
  4. ".jar" : ["imgdiff", "-z"],
  5. ".apk" : ["imgdiff", "-z"],
  6. ".img" : "imgdiff",
  7. }
  8. class Difference(object):
  9. def __init__(self, tf, sf, diff_program=None):
  10. self.tf = tf
  11. self.sf = sf
  12. self.patch = None
  13. self.diff_program = diff_program
  14. def ComputePatch(self):
  15. """Compute the patch (as a string of data) needed to turn sf into
  16. tf.  Returns the same tuple as GetPatch()."""
  17. tf = self.tf
  18. sf = self.sf
  19. if self.diff_program:
  20. diff_program = self.diff_program
  21. else:
  22. ext = os.path.splitext(tf.name)[1]
  23. diff_program = DIFF_PROGRAM_BY_EXT.get(ext, "bsdiff")

基本上明白了,针对gz zip jar apk img这种压缩的格式,我们使用imgdiff工具来生成patch,否则我们使用bsdiff工具,这两个工具,有不同的针对性,imgdiff对压缩格式的文件效率更高,普通的不带格式的文件bsdiff更合适,我们姑且这么理解。

之前有个客户在制作差分包的时候失败了,后来看了下,发现是有两个300M+的文件在差分,好像提示超时了,然后我写了个sh,看看这两个文件的差分到底需要多久:

  1. date
  2. imgdiff   file_old   file_new  file_patch
  3. date

结果过了30+分钟之后,生成了file_patch

我们看看,这个common.py中定义的超时时间:

  1. def ComputePatch(self):
  2. """Compute the patch (as a string of data) needed to turn sf into
  3. tf.  Returns the same tuple as GetPatch()."""
  4. ..........................
  5. try:
  6. ptemp = tempfile.NamedTemporaryFile()
  7. if isinstance(diff_program, list):
  8. cmd = copy.copy(diff_program)
  9. else:
  10. cmd = [diff_program]
  11. cmd.append(stemp.name)
  12. cmd.append(ttemp.name)
  13. cmd.append(ptemp.name)
  14. p = Run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
  15. err = []
  16. def run():
  17. _, e = p.communicate()
  18. if e:
  19. err.append(e)
  20. th = threading.Thread(target=run)
  21. th.start()
  22. th.join(timeout=300)   # 5 mins
  23. if th.is_alive():
  24. print "WARNING: diff command timed out"
  25. p.terminate()
  26. th.join(5)
  27. if th.is_alive():
  28. p.kill()
  29. th.join()

这里默认的5分钟超时,那么当imgdiff大于5分钟的时候,就无法差分升级成功了,如果差分失败了,就需要修改这里的超时时间。

说个后话,用300M+的文件去差分升级,也是醉了,还不如直接整包升级得了。

recovery 差分升级包制作超时【转】的更多相关文章

  1. recovery 差分升级包制作超时

    我们在对android系统升级的时候,可以减少升级包的大小,只升级差异部分,也就是差分包升级,相关的描述可以参考:http://blog.csdn.net/csdn66_2016/article/de ...

  2. android OTA升级包制作

    0.签名 java -Xmx2048m -jar out/host/linux-x86/framework/signapk.jar -w build/target/product/security/t ...

  3. android OTA升级包制作【转】

    本文转载自:http://www.thinksaas.cn/topics/0/445/445670.html 0.签名 java -Xmx2048m -jar out/host/linux-x86/f ...

  4. OTA升级包制作工具处理过程分析

    http://blog.csdn.net/ly890700/article/details/56048815 Android Recovery(30)  1.概述  OTA升级包制作工具是一个用pyt ...

  5. Android系统OTA升级包制作【转】

    本文转载自:http://blog.csdn.net/dingfengnupt88/article/details/52882788 Android系统升级分为整包升级和差分包升级,整包升级就是将系统 ...

  6. Android开发小问题集

    由于安卓系统比较复杂,开发中会发中会碰见各种小问题,在此做一些记录,只要觉得有必要就会添加进来. 1.触屏鼠标模式和触屏模式 开发android4.3高通400平台时,用atmel_max 640T作 ...

  7. 制作OTA升级包

    OTA 软件包工具 本文地址http://wossoneri.github.io/2018/09/21/%5BAndroid%5D%5BFramework%5Dcreate-ota-update-zi ...

  8. nno_setup制作升级包必须面临的几个问题 2

    这两天的时间一直在制作应用程序的升级包,期间碰到一些问题这里一并记录下来,相信这是制作升级包必须面临和解决的问题: 1. 升级包安装程序如何不再产生新的安装.卸载程序 Inno_setup中AppId ...

  9. Inno_setup制作升级包必须面临的几个问题

    Inno_setup制作升级包必须面临的几个问题 分类: c/c++/GamingAnyWhere JavaScript linux shell基础知识 2013-12-18 22:14 1496人阅 ...

随机推荐

  1. src.rpm包安装方法

    有些软件包是以.src.rpm结尾的,这类软件包是包含了源代码的rpm包,在安装时需要进行编译.这类软件包有多种安装方法,以redhat为例说明如下: 注意: 如果没有rpmbuild可以从系统安装光 ...

  2. ASP.NET动态网站制作(28)-- 三层框架(2)

    前言:三层框架的第二节课,继续上次课的内容. 内容: 1.三层框架的使用目的:可以将视图层和业务逻辑层及实体层分开,可以提高代码的扩展性,安全性,可以实现程序的低耦合性. 2.GetModel方法及G ...

  3. Unity3D学习笔记——IDE菜单栏

    一:菜单栏: 1.File: 2.Edit: 3.Assets: 4.GameObject: 5.Component: 6.Window: 7.Help:

  4. linux 复制粘贴

    如果想把文件内的第三行内容黏贴到第十五行: 1.进入你的文件,(处于命令模式,而不是编辑模式) 2.将你的光标移到你的第三行的开头(用方向键) 3,按下v,(你发现切换到可视模式了),按方向键,知道选 ...

  5. Linux命令之paste

    介绍 cut用来从文本文件或标准输出中抽取数据列或者域,然后再用paste可以将这些数据粘贴起来形成相关文件.粘贴两个不同来源的数据时,首先需将其分类,并确保两个文件行数相同. paste将按行将不同 ...

  6. Linux下权限掩码umask

    一 权限掩码umask umask是chmod配套的,总共为4位(gid/uid,属主,组权,其它用户的权限),不过通常用到的是后3个,例如你用chmod 755 file(此时这文件的权限是属主读( ...

  7. jconsole监控JVM

    1.查找catalina.sh,使用tomcat中的catalina.sh 目录地址/opt/apache-tomcat-7.0.82/bin 2.配置JAVA_OPTS JAVA_OPTS=&quo ...

  8. 使你的C/C++代码支持Unicode(CRT字符串处理的所有API列表,甚至有WEOF字符存在)

    悉Microsoft支持Unicode的方式. 它的主要目的是方便你查询相关的数据类型和函数,以及修正相应的拼写错误. I18nGuy 主页 XenCraft (Unicode 咨询公司) Engli ...

  9. 解决Raize日历控件显示的问题

    解决Raize日历控件显示的问题 近自己的程序被测试人员发现一个小问题,就是程序中的日历选择框,显示中的“星期一.星期二....”都显示成了“星.....”,我自己看了代码,原来是raize的控件问题 ...

  10. MySQL中有关icp mrr和bka的特性

    文辉考我的问题,有关这三个的特性,如果在面试过程中,个人见解可以答以下 icp MyQL数据库会在取出索引的同时,判断是否进行WHERE条件过滤,也就是把WHERE的部分过滤操作放在存储引擎层,在某些 ...