android P OTA (MTK)初探 —— 3、基于块(Block)的OTA:升级包的制作流程

本文深入探讨了Android P在MTK平台上的OTA升级包制作过程,涵盖OTA流程图、升级包制作命令、涉及的关键文件及重点函数分析。通过ota_from_target_files.py脚本生成升级包,并提到了增量升级的相关参数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上文简单介绍了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__,
                         
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值