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

本文探讨了Android系统差分升级过程中遇到的超时问题,主要涉及imgdiff和bsdiff两个工具的使用。对于.gz, .zip, .jar, .apk, .img等压缩格式的文件,使用imgdiff生成patch效率更高;其他情况下,bsdiff更为适用。作者通过实例展示了当处理大文件时,imgdiff可能超过默认300秒的超时限制,导致差分失败。解决方案是调整超时时间或考虑直接使用完整升级包。" 107785131,9673738,Java多线程更新数据失败问题,"['Java', '多线程', '并发编程', '数据库操作', '问题排查']
摘要由CSDN通过智能技术生成

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式小庄老师

要是觉得不错,就给我点支持吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值