1.获取update.zip文件
2.验证签名文件
3.通过installPackage接口升级,往/cache/recovery/command中写入recoveryELF的执行参数
4.系统重新启动进入recovery界面(判断/cache/recovery 是否有cmd文件)
5.try_update_binary执行升级脚本
6.finish_recovery 重启
app执行安装/重置/清楚缓存操作调用代码文件frameworks/base/core/java/android/os/RecoverySystem.java
不同的操作使用不同的方法:
安装升级包 -------- installPackage
清除用户数据------ rebootWipeUserData
清楚缓存 ----------- rebootWipeCache
上面的所有操作都是往/cache/recovery/command文件中写入不同的命令,在进入recovery后(recovery.cpp)对command的关键字进行判断,执行相应的操作,下文会详细讲解,这里先简单提及
根据升级方式不同,分为:A/B(无缝)系统更新(android O新增)、 传统的非 A/B 系统更新、
A/B 系统更新,也称为无缝更新;确保在OTA(Over-The-Air)升级期间,仍然在磁盘上保留有一份可以正常启动的系统。
用于确保可运行的启动系统在无线 (OTA) 更新期间能够保留在磁盘上。这样可以降低更新之后设备无法启动的可能性。
A/B 系统更新使用称为 update_engine 的后台守护进程以及两组分区。这两组分区称为插槽,通常为插槽 A 和插槽 B。系统从其中一个插槽(“当前插槽”)运行,但运行的系统不会访问“未使用的”插槽中的分区(用于正常操作)。
ab升级方式中boot和system均保留了两份,所以对设备的存储容量要求会比传统升级方式要大的多。