写在前面:
“build/tools/releasetools/ota_from_target_files -u lk.bin -n target.zip update.zip”这是制作整包的命令,很显然这里支持lk升级。本系列博文主要对该命令的执行流程及原理进行一个系统的分析,涉及到/build/tools/releasetools/目录下多个模块如ota_from_target_files、common等。由于本人对python了解粗浅,文中所涉及到的python语法大都做了注释,以便帮助部分对python有兴趣的同学能够读懂相应的语句。
整个流程看起来有些繁琐冗杂,希望有兴趣的同学能够耐心的去看,已经比较熟悉python语法的同学可以挑选感兴趣的部分作为参考。
一,执行脚本
那么首先,我们从命令中可以看到整包的制作流程是从ota_from_target_files模块开始的。而ota_from_target_files模块最先执行的方法是从下面这段语句开始的,如下:
#__name__作为模块的内置属性,指.py文件的调用方式;.py文件有两种使用方式:作为模块被调用和直接使用。如果它等于"__main__"就表示是直接执行。也就是说在if __name__ == "__main__":之后的语句作为模块被调用的时候不执行;直接使用的时候,语句之后的代码执行。而这里很显然是直接使用。
if __name__ == '__main__':
try:
common.CloseInheritedPipes()"""MAC系统中却是一些描述文件(PIPE),这里在开始之前关闭fds;这里主要是根据当前所使用的操作系统做的一些调整"""
main(sys.argv[1:])"""这是编译脚本主要的方法"""
except common.ExternalError, e:
print " ERROR: %s" % (e,)
sys.exit(1) 下面是脚本的入口函数main(arg)
def main(argv):
"""将用户设定的 Option 存入 OPTIONS 变量中。OPTIONS是一个Python Class, 我们将其理解为一个C Struct或者一个java的封装即可"""
def option_handler(o, a):
if o in ("-b", "--board_config"):#in是一个布尔操作符,用来测试左边的操作数是否包含于右边的元祖,这里用来判断参数o所传入的值是否包含在("-b", "--board_config")中;
pass # deprecated
elif o in ("-k&#