update-script脚本是整个ota升级的核心文件,它里面的内容就是控制升级流程的主要逻辑,实际控制着升级过程中大部分重要操作的实施细节,而处于升级包中同目录下的update-bianry负责真正执行update-script记录的操作。
在负责生成升级包的脚本ota_from_target_files.py中,不论我们调用这个脚本来产生全量包,增量包,或者是安卓新加入的block方式的增量包,在这个脚本中分别主要由 WriteFullOTAPackage(input_zip, output_zip) 、WriteIncrementalOTAPackage(target_zip, source_zip, output_zip)、WriteBlockIncrementalOTAPackage(target_zip, source_zip, output_zip) 这三个函数负责完成它们的创建,在这些函数的刚开始,都有类似的这样一句,这里以生成全量包为例:
这里就是调用 /build/tools/releasetools下的edify_generator.py,创建一个edify格式的脚本,创件的这个script脚本就是最终升级包中的update-script
在之后的操作中,对script的各种操作,都是直接调用edify_generator.py中定义的方法,然后再这些方法中,对script传来的参数做各种处理,最终通过self.script.append向update-script中写入了各种命令,
比如说在WriteFullOTAPackage(input_zip, output_zip)中会有:
如果我们在调用ota_from_target_files.py时没有添加-n参数,表示我们不忽略时间戳检查,根据ota_from_target_files.py的main中:
然后根据另一篇分析ota升级过程的blog, GetBuildProp会读取target files中的misc_info.txt以及build.prop,分别读取到ro.build.date,ro.build.date.utc
ro.build.date=Wed Apr 13 03:29:53 CST 2016
ro.build.date.utc=1460489393
最后在edify_generator.py中,根据AssertOlderBuild的定义:
最终会向update-script输出下面这句话:
(!less_than_int(1460489393, getprop("ro.build.date.utc"))) || abort("Can't install this package (Wed Apr 13 03:29:53 CST 2016) over newer build (getprop("ro.build.date")))