本文转载自: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+的文件去差分升级,也是醉了,还不如直接整包升级得了。

最新文章

  1. Stack Overflow: The Architecture - 2016 Edition
  2. Struts2框架的自定义类型转换器
  3. Hibernate中易错地方的总结
  4. java 19 -13 FIle类的一些方法2
  5. 【UVA 11462】 Age Sort(基数排序)
  6. php比较加赋值语句
  7. ResultSet结果集判断是否为空
  8. 斌哥的 Docker 进阶指南—监控方案的实现
  9. 有趣的hello word
  10. 【树莓PI】下载机
  11. 三种php连接access数据库方法
  12. Gnuradio 学习
  13. Hook linux 网络封包
  14. HDU 1005 Number Sequence【多解,暴力打表,鸽巢原理】
  15. 【java多线程系列】java中的volatile的内存语义
  16. mysql-高级操作
  17. Scrapy+Scrapy-redis+Scrapyd+Gerapy 分布式爬虫框架整合
  18. hello2 Source Analisis
  19. 20155228 2017-5-10 课堂测试:Arrays和String单元测试
  20. Spring Boot + Spring Cloud 实现权限管理系统 后端篇(三):搭建开发环境

热门文章

  1. git commit --amend用法
  2. linux命令小结
  3. SQL.Cookbook 读书笔记4 插入更新和删除
  4. log4j分级别打印和如何配置多个Logger
  5. jqgrid动态添加rowlist
  6. 3 Steps(二分图)
  7. Tomcat 配置连接池
  8. Django报:AttributeError: tuple object has no attribute get
  9. Python 中星号作用:解包&打散
  10. Python3.6全栈开发实例[014]