Android OTA 脚本流程

这篇博客主要探讨了Android OTA升级过程中高通mbn文件的更新流程,包括WriteBlockIncrementalOTAPackage函数的详细步骤:解析image、检查属性、校验RADIO目录文件、写入升级脚本等。同时,文中提到了IncrementalOTA_VerifyEnd函数的内部操作,如GetRadioFiles和SplitFwTypes等,以及如何处理差分和全分升级的共image需求。
摘要由CSDN通过智能技术生成

杂乱记录一下,以后再做整理
这里主要跟踪升级高通mbn文件的流程
主要根据生成的script脚本来逆向分析

解释会比较繁琐,因为本身对Python也不是特别懂,这里就当自学了:)

下面是WriteBlockIncrementalOTAPackage函数的主要流程
1.解析基础包和目标包中的boot,recovery和system 这三个image
2.检查device属性值是否满足要求
3.检查fingerprint属性值是否满足要求
4.对比bootimage的差异,将差异部分写入boot.img.p并放入patch目录下,在script脚本中写入检测boot的命令
5.在脚本中加入检查空间是否足够的命令
6.校验RADIO目录下的文件
7.写入脚本校验systemimage和vendorimage
8.向脚本中写入升级systemimage vendorimage bootimage的命令
9.升级RADIO目录下的文件

1.1
上面的1~5点
def WriteBlockIncrementalOTAPackage(target_zip, source_zip, output_zip):

  #1.下面这部分比较重要,应该是解析image的信息,以后再看
  source_boot = common.GetBootableImage(
      "/tmp/boot.img", "boot.img", OPTIONS.source_tmp, "BOOT",
      OPTIONS.source_info_dict)
  target_boot = common.GetBootableImage(
      "/tmp/boot.img", "boot.img", OPTIONS.target_tmp, "BOOT")
  updating_boot = (not OPTIONS.two_step and
                   (source_boot.data != target_boot.data))

  target_recovery = common.GetBootableImage(
      "/tmp/recovery.img", "recovery.img", OPTIONS.target_tmp, "RECOVERY")

  system_src = GetImage("system", OPTIONS.source_tmp)
  system_tgt = GetImage("system", OPTIONS.target_tmp)


  #2.检查device属性值是否满足要求
  #方法中会调用script.AssertDevice来检查ro.product.device属性值是否满足要求
  AppendAssertions(script, OPTIONS.target_info_dict, oem_dicts)
  #这里啥也没做
  device_specific.IncrementalOTA_Assertions()

  #打印出fingerprint的值
  script.Print("Source: %s" % (source_fp,))
  script.Print("Target: %s" % (target_fp,))
  #不知道调用到哪里去了,releasetools.py中没有这个方法
  device_specific.IncrementalOTA_VerifyBegin()

     #3.检查fingerprint属性值是否满足要求,具体实现在edify_generator.py中
     script.AssertSomeFingerprint

  #如果要升级bootimage,这里是肯定的
  if updating_boot:
    boot_type, boot_device = common.GetTypeAndDevice(
        "/boot", OPTIONS.source_info_dict)
    d = common.Difference(target_boot, source_boot)
    _, _, d = d.ComputePatch()
    if d is None:
      #没有差异,为什么要全分升级??
      include_full_boot = True
      common.ZipWriteStr(output_zip, "boot.img", target_boot.data)
    else:
      include_full_boot = False

      print("boot      target: %d  source: %d  diff: %d" % (
          target_boot.size, source_boot.size, len(d)))

      #4.将差异部分写入boot.img.p并放入patch目录下
      common.ZipWriteStr(output_zip, "patch/boot.img.p", d)
      #在script脚本中写入检测boot的命令
      script.PatchCheck("%s:%s:%d:%s:%d:%s" %
                        (boot_type, boot_device,
                         source_boot.size, source_boot.sha1,
                         target_boot.size, target_boot.sha1))
      size.append(target_boot.size)

  #5.size肯定不为空,在脚本中加入检查空间是否足够的命令
  if size:
    script.CacheFreeSpaceCheck(max(size))

  #6.这里就是校验mbn文件的地方,非常重要,common.py中调用到device/qcom/common/releasetools.py中的方法
  device_specific.IncrementalOTA_VerifyEnd()
  ......
1.2 详细看一下IncrementalOTA_VerifyEnd函数,第6点
def IncrementalOTA_VerifyEnd(info):
 #调用了OTA_VerifyEnd方法
 OTA_VerifyEnd(info, info.target_version, info.target_zip, info.source_zip)
 return



#来详细看看
def OTA_VerifyEnd(info, api_version, target_zip, source_zip=None):
  #明显,这里加载filesmap文件
  print "Loading radio filesmap..."
  #filesmap是字典格式,键值对中的键是唯一的,注意,这里读取的是目标版本中RADIO目录的文件
  filesmap = LoadFilesMap(target_zip)
  if filesmap == {}:
    print "warning radio-update: no or invalid filesmap file found"
    return False

  print "Loading radio target..."
  #加载目标包中RADIO目录下的文件,tgt_files也是字典格式,key是文件名,value是common.File格式我猜指向的是对应的文件
  #下面会详细看下GetRadioFiles方法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值