recovery 差分升级包制作超时【转】

本文转载自: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:

 

[python] view plain copy
 
  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.   
  9. class Difference(object):  
  10.   def __init__(self, tf, sf, diff_program=None):  
  11.     self.tf = tf  
  12.     self.sf = sf  
  13.     self.patch = None  
  14.     self.diff_program = diff_program  
  15.   
  16.   def ComputePatch(self):  
  17.     """Compute the patch (as a string of data) needed to turn sf into 
  18.     tf.  Returns the same tuple as GetPatch()."""  
  19.   
  20.     tf = self.tf  
  21.     sf = self.sf  
  22.   
  23.     if self.diff_program:  
  24.       diff_program = self.diff_program  
  25.     else:  
  26.       ext = os.path.splitext(tf.name)[1]  
  27.       diff_program = DIFF_PROGRAM_BY_EXT.get(ext, "bsdiff")  

 

 

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

 

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

 

[plain] view plain copy
 
  1. date  
  2. imgdiff   file_old   file_new  file_patch  
  3. date  

 

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

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

 

[python] view plain copy
 
  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+的文件去差分升级,也是醉了,还不如直接整包升级得了。

posted @ 2018-06-12 11:26  请给我倒杯茶  阅读(1378)  评论(0编辑  收藏  举报