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

05-19 11:20