zoukankan      html  css  js  c++  java
  • 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+的文件去差分升级,也是醉了,还不如直接整包升级得了。

  • 相关阅读:
    Halcon图像分割
    Halcon图像变量
    C# 线程同步
    C# 单例模式实现
    C# 限制窗体弹窗显示必须关闭后才能重新实例化窗体
    Java定时清理过期文件
    GrayLog + Logspout + Docker 实现分布式日志聚合
    基于Spring Security OAuth2搭建的Spring Cloud 认证中心
    快速搭建Docker Registry私有仓库
    让你的Spring Boot应用快速运行在Docker上面
  • 原文地址:https://www.cnblogs.com/zzb-Dream-90Time/p/9172212.html
Copyright © 2011-2022 走看看