上文简单介绍了Target包,本文重点分析完整升级包。
一、OTA的流程图(转)
网上看到的一份不错的流程图。
二、升级包制作命令
制作升级包需要用到alps/build/tools/releasetools/ota_from_target_files.py这个脚本文件。可以配置很多参数。
但此命令必然有两个不带前缀的参数:要升级到的版本对应的Target包 和 要生成的升级包的名字。
一般需要的命令格式如下:
./build/tools/releasetools/ota_from_target_files -v --block -k ./build/target/product/security/releasekey -i ./out/ota_old.zip ./out/ota_new.zip ./out/update.zip
其中:
-v 表示显示出当前执行的代码的行号。
--block 代码生成基于块的升级包,其实已经没有意义了。android P的代码,不再支持基于文件的升级包。Keeping this flag here to not break existing callers.这是google给的解释。
-k 表示用后面紧跟的密钥重新签名升级包。
-i 表示后面紧跟的文件是旧版本的Target包,即 此命令是要生成增量升级包,而不是完整升级包。
其实还有很多参数可以添加,到脚本中查看一下就一目了然了。比如做增量升级包的时候添加–log_diff,做完增量升级包后,运行脚本target_files_diff.py 打印出差异的log。
三、升级包主要涉及的文件
首先就是之前文件提到的Target包涉及的文件:
1、alsp/build/core/Makefile
2、target包中的ota_update_list.txt
做升级包需要的:
1、alps/build/tools/releasetools/ota_from_target_files (这其实是链向同目录下的ota_from_target_files.py的软链接)
2、alps/build/tools/releasetools/common.py
3、alps/build/tools/releasetools/edify_generator.py
4、过程中生成的脚本文件updater-script,最终在升级包的META-INF/com/google/android目录下
5、从alps/vendor/mediatek/proprietary/scripts/releasetools/releasetools.py拷贝到Target包中的releasetools.py
四、重点函数分析:
1、ota_from_target_files.py中的main函数:
def main(argv):
def option_handler(o, a):
if o in ("-k", "--package_key"):
OPTIONS.package_key = a
elif o in ("-i", "--incremental_from"):
OPTIONS.incremental_source = a
elif o == "--full_radio":
OPTIONS.full_radio = True
elif o == "--full_bootloader":
OPTIONS.full_bootloader = True
elif o == "--wipe_user_data":
OPTIONS.wipe_user_data = True
elif o == "--downgrade":
OPTIONS.downgrade = True
OPTIONS.wipe_user_data = True
elif o == "--override_timestamp":
OPTIONS.downgrade = True
elif o in ("-o", "--oem_settings"):
OPTIONS.oem_source = a.split(',')
elif o == "--oem_no_mount":
OPTIONS.oem_no_mount = True
elif o in ("-e", "--extra_script"):
OPTIONS.extra_script = a
elif o in ("-t", "--worker_threads"):
if a.isdigit():
OPTIONS.worker_threads = int(a)
else:
raise ValueError("Cannot parse value %r for option %r - only "
"integers are allowed." % (a, o))
elif o in ("-2", "--two_step"):
OPTIONS.two_step = True
elif o == "--include_secondary":
OPTIONS.include_secondary = True
elif o == "--no_signing":
OPTIONS.no_signing = True
elif o == "--verify":
OPTIONS.verify = True
elif o == "--block":
OPTIONS.block_based = True
elif o in ("-b", "--binary"):
OPTIONS.updater_binary = a
elif o == "--stash_threshold":
try:
OPTIONS.stash_threshold = float(a)
except ValueError:
raise ValueError("Cannot parse value %r for option %r - expecting "
"a float" % (a, o))
elif o == "--log_diff":
OPTIONS.log_diff = a
elif o == "--payload_signer":
OPTIONS.payload_signer = a
elif o == "--payload_signer_args":
OPTIONS.payload_signer_args = shlex.split(a)
elif o == "--extracted_input_target_files":
OPTIONS.extracted_input = a
elif o == "--skip_postinstall":
OPTIONS.skip_postinstall = True
else:
return False
return True
##lyc
#进行参数解析,调用common.py中的方法解析,并用上面的函数option_handler添加一些ParseOptions本身不支持的参数。
args = common.ParseOptions(argv, __doc__,