赞
踩
工作中需要使用OTA对设备进行升级,于是梳理了一下OTA前后的升级流程,将过程制作成了过程图,可以按这个过程图去查找代码,分析请看后面的梳理,所有的代码环境:android10。
首先分析OTA包中的文件为: ├─firmware-update └─META-INF └─com ├─android ├─metadata ├─otacert └─google └─android ├─update-binary ├─updater-script ├─boot.img ├─system.new.dat.br ├─system.patch.dat ├─system.transfer.list ├─vendor.new.dat.br ├─vendor.patch.dat ├─vendor.transfer.list firmware-update:目录下主要是一些固件的升级,如mbn、dtbo、vbmeta等 boot.img:更新boot分区所需要的文件,包括kernel+ramdisk system.new.dat.br:Android8.1镜像后新的压缩格式,为数据部分,里面是system.img数据。 system.transfer.list:数据转换的描述列表。 system.patch.dat:升级时用到,ota包中大小为0。 vendor和system类似。 update-binary:二进制文件,相当于一个脚本解释器,能够识别updater-script中描述的操作,文件的命名由bootable/recovery/install.cpp 中的UPDATE_BINARY_NAME值而定。 updater-script:升级包的升级脚本,文件的命名由bootable/recovery/updater/updater.cpp中的SCRIPT_NAME值而定。 metadata:描述设备信息及环境变量的元数据,主要包括一些编译选项、签名公钥,时间戳以及设备型号等。 otacert:ota签名。
system_server(RecoverySystemService)通过socket与uncrypt建立了通信,uncrypt做了如下操作: 1.指令保存在misc分区 2.update.zip所在内存地址被保存在/cache/recovery/block.map 另外,update.zip包的路径需要以/data开头 细节如下: 1)在android7.0中,recovery模式中已经不在挂载data分区,而且data分区可以设置加密,这样更促进了在recovery分区中不挂载data分区,加强了用户的安全性。但是这样就会有问题,当升级包较大时cache分区是放不下的,增大cache分区只会浪费资源,最好的办法还是把它放在data分区下。但是因为加密和不挂载的原因导致在recovery模式下是无法使用升级包的。而uncrypt机制就是解决这个问题的。它的基本原理就是,在正常模式下记录升级包所在的磁盘区块号,而且如果加密了就通过读进行解密,再绕过加密写到存储磁盘上。当记录好了磁盘区块号后,启动到recovery模式后就可以不挂载data分区,直接根据区块号读取升级包中的数据进行升级 2)system_server把update.zip路径保存在文件/cache/recovery/uncrypt_file uncrypt读取/cache/recovery/uncrypt_file生成/cache/recovery/block.map 3)/cache/recovery/block.map 是update.zip存放的数据地址 4) 如果要测试uncrypt的功能,可以在adb shell环境下测试,将ota包推到data目录下,直接执行uncrypt命名。 # uncrypt /data/ota.zip /cache/recovery/block.map # cat /cache/recovery/block.map /dev/block/bootdevice/by-name/userdata //block device 1189005639 4096 //文件大小,block块大小 2 //block块的个数 440320 524288 //第一个block块的范围区间 561152 767469 //第二个block块的范围区间 5) OTA升级重启前,主要的操作是对升级包进行处理的过程,对升级包提前处理的原因是因为在进入recovery模式进行升级时无法加载升级包所在的分区。在重启前的主要操作如下: 1.通过SystemProperties设置属性(setup-bcb),向BCB中设置升级的Command; 2.通过SystemProperties设置属性(uncrypt),开启uncrypt服务,将升级包生成一系列的block块,recovery可以读取block.map文件并获取这个文件的数据作为升级包; 3.uncrypt完成后,重启。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。