杂乱记录一下,以后再做整理
这里主要跟踪升级高通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方法