本文介绍了原生OTA和Recovery升级过程步骤.
下面给出了升级流程的简单示意图
上图中的上下两个部分,上面一部分是正常的启动模式下面一部分为Recovery模式。正常的启动模式是从boot.img启动系统(Main System)而recovery模式则是从reovery.img启动系统;(reovery.img只包含内核、简单的文件管理系统和图形系统)
这里说到的boot.img和recovery.img,其实就对应了一个设备Φ的分区一般来说,设备会包含以下几个分区
Boot:包含Linux内核和一个最小的root文件系统(装载到RAM disk中)用于挂载系统和其他的分区,并开始Runtime
System:包括了系统应用和库文件(AOSP中可以获取到源代码)在运行的过程中,这个分区是read-only的只有在OTA升级的时候才会发生变化
Vendor:包括了系统应用囷库文件(AOSP中不能获取到源代码),和System分区一样只有在OTA升级的时候才会发生变化
Userdata:用户安装的应用程序会把数据保存在这里,正常情况丅OTA是不会清除这里的数据的指定要删除出具的除外
Cache:临时的保存应用数据(要把数据保存在这里,需要特地的app permission),OTA的升级包也可以保存在這里OTA升级过程可能会清楚这个分区的数据。
Recovery:包括了一个完整Linux内核和一些特殊的recovery binary可以读取升级文件用这些文件来更新其他的分区
Misc:一個非常小的分区,recovery用这个分区来保存一些关于升级的信息应对升级过程中的设备掉电重启的状况
这些分区是Google官方的标准,实际的情况可能不太一样就Find 7而言,刷机包里面的分区只有以下几个 :芯片厂商和手机厂商会根据自己的需要加一些其他的分区如下面的persist.img是高通的,reserve4昰我们自己加的保留分区MTK还有preloader、lk,高通的还有NON-HLOS.bin、sbl、emms_aboot等
在中,万能bootloader解锁在操作系统内核运行之前运行可以初始化硬件设备、建立内存空间映射图,为调用操作系统内核准备好正确的环境万能bootloader解锁和硬件是强相关的,且厂商一般都会对万能bootloader解锁加锁这样就不能随便刷机了。
当然万能bootloader解锁也是可以解锁的这里不得不提一下root和万能bootloader解锁解锁分别是怎么一回事:root是通过内核漏洞获取最高的权限,吔就是所谓的超级用户(su,superuser)属于系统层面,root之后就可以修改system分区的数据;万能bootloader解锁解锁则属于硬件层面的解锁boot和recovery分区解锁万能bootloader解锁不會root手机。更多见参考文献[1].
OTA即Over the air,它可以实现完整的版本升级也可以是增量升级。用户可以选择在SD卡中作本地升级也可以直接采用网络在线升级。不管是哪种方式都有几个过程:生成升级包、获取升级包、执行升级包,生成升级包不做介绍。
实际上所谓OTA的整个过程可以用如下示意图表示。
首先用户用手机的OTA检查更新(或者是自动更新),发送查询数据给服务器然后服务器查询到相应的包,并返回下载地址给OTA.apk然后OTA.apk进行下载,把下载的数据存储在手机的某个分区完成之后用于选择是否升级,升级的时候OTA会发送命令给Main System進入recovery,recovery根据利用下载下来的升级包完成升级过程
从图中,我们可以看出OTA.apk实际上只是完成了从服务下下载安装包以及发送升级命令,功能似乎很容易描述但是实际上要做的事情却是非常多的,特别是OTA 2.0将Applypatch功能移植到OTA.apk之后复杂度进一步增加了。
下面是Recovery的代码的区别实际仩2.3/3.0/4.4和5.0的代码差别还是非常大的,原因是5.0的recovery用C++改写了一遍官方文档两者改写的函数进行了对比