本文轉載自: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:
- DIFF_PROGRAM_BY_EXT = {
- ".gz" : "imgdiff",
- ".zip" : ["imgdiff", "-z"],
- ".jar" : ["imgdiff", "-z"],
- ".apk" : ["imgdiff", "-z"],
- ".img" : "imgdiff",
- }
- class Difference(object):
- def __init__(self, tf, sf, diff_program=None):
- self.tf = tf
- self.sf = sf
- self.patch = None
- self.diff_program = diff_program
- def ComputePatch(self):
- """Compute the patch (as a string of data) needed to turn sf into
- tf. Returns the same tuple as GetPatch()."""
- tf = self.tf
- sf = self.sf
- if self.diff_program:
- diff_program = self.diff_program
- else:
- ext = os.path.splitext(tf.name)[1]
- diff_program = DIFF_PROGRAM_BY_EXT.get(ext, "bsdiff")
基本上明白了,針對gz zip jar apk img這種壓縮的格式,我們使用imgdiff工具來生成patch,否則我們使用bsdiff工具,這兩個工具,有不同的針對性,imgdiff對壓縮格式的文件效率更高,普通的不帶格式的文件bsdiff更合適,我們姑且這么理解。
之前有個客戶在制作差分包的時候失敗了,后來看了下,發現是有兩個300M+的文件在差分,好像提示超時了,然后我寫了個sh,看看這兩個文件的差分到底需要多久:
- date
- imgdiff file_old file_new file_patch
- date
結果過了30+分鍾之后,生成了file_patch
我們看看,這個common.py中定義的超時時間:
- def ComputePatch(self):
- """Compute the patch (as a string of data) needed to turn sf into
- tf. Returns the same tuple as GetPatch()."""
- ..........................
- try:
- ptemp = tempfile.NamedTemporaryFile()
- if isinstance(diff_program, list):
- cmd = copy.copy(diff_program)
- else:
- cmd = [diff_program]
- cmd.append(stemp.name)
- cmd.append(ttemp.name)
- cmd.append(ptemp.name)
- p = Run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
- err = []
- def run():
- _, e = p.communicate()
- if e:
- err.append(e)
- th = threading.Thread(target=run)
- th.start()
- th.join(timeout=300) # 5 mins
- if th.is_alive():
- print "WARNING: diff command timed out"
- p.terminate()
- th.join(5)
- if th.is_alive():
- p.kill()
- th.join()
這里默認的5分鍾超時,那么當imgdiff大於5分鍾的時候,就無法差分升級成功了,如果差分失敗了,就需要修改這里的超時時間。
說個后話,用300M+的文件去差分升級,也是醉了,還不如直接整包升級得了。