如下的篇幅开始分析咱们在上两个篇幅中生成的update.zip包在具体更新中所通过的过程,并根据源码分析每一部分的工做原理。app
1、 系统更新update.zip包的两种方式源码分析
1. 经过上一个文档,咱们知道了怎样制做一个update.zip升级包用于升级系统。Android在升级系统时得到update.zip包的方式有两种。一种是离线升级,即手动拷贝升级包到SD卡(或NAND)中,经过settings-->About phone-->System Update-->选择从SD卡升级。另外一种是在线升级,即OTA Install(over the air)。用户经过在线下载升级包到本地,而后更新。这种方式下的update.zip包通常被下载到系统的/CACHE分区下。ui
2. 不管将升级包放在什么位置,在使用update.zip更新时都会重启并进入Recovery模式,而后启动recovery服务(/sbin/recovery)来安装咱们的update.zip包。spa
3. 为此,咱们必须了解Recovery模式的工做原理以及Android系统重启时怎样进入Recovery工做模式而不是其余模式(如正常模式)。命令行
2、 Android系统中三种启动模式ip
首先咱们要了解Android系统启动后可能会进入的几种工做模式。先看下图:开发
由上图可知Android系统启动后可能进入的模式有如下几种:
文档
(一) MAGIC KEY(组合键):源码
即用户在启动后经过按下组合键,进入不一样的工做模式,具体有两种: it
① camera + power:若用户在启动刚开始按了camera+power组合键则会进入bootloader模式,并可进一步进入fastboot(快速刷机模式)。
② home + power :若用户在启动刚开始按了home+power组合键,系统会直接进入Recovery模式。以这种方式进入Recovery模式时系统会进入一个简单的UI(使用了minui)界面,用来提示用户进一步操做。在tcc8800开发板中提供了一下几种选项操做:
“reboot system now”
“apply update from sdcard”
“wipe data/factory reset”
“wipe cache partition”
(二)正常启动:
若启动过程当中用户没有按下任何组合键,bootloader会读取位于MISC分区的启动控制信息块BCB(Bootloader Control Block)。它是一个结构体,存放着启动命令command。根据不一样的命令,系统又 能够进入三种不一样的启动模式。咱们先看一下这个结构体的定义。
struct bootloader_message{
char command[32]; //存放不一样的启动命令
char status[32]; //update-radio或update-hboot完成存放执行结果
char recovery[1024]; //存放/cache/recovery/command中的命令
};
咱们先看command可能的值,其余的在后文具体分析。command可能的值有两种,与值为空(即没有命令)一块儿区分三种启动模式。
①command=="boot-recovery"时,系统会进入Recovery模式。Recovery服务会具体根据/cache/recovery/command中的命令执行相应的操做(例如,升级update.zip或擦除cache,data等)。
②command=="update-radia"或"update-hboot"时,系统会进入更新firmware(更新bootloader),具体由bootloader完成。
③command为空时,即没有任何命令,系统会进入正常的启动,最后进入主系统(main system)。这种是最一般的启动流程。
Android系统不一样的启动模式的进入是在不一样的情形下触发的,咱们从SD卡中升级咱们的update.zip时会进入Recovery模式是其中一种,其余的好比:系统崩溃,或则在命令行输入启动命令式也会进入Recovery或其余的启动模式。
为了解咱们的update.zip包具体是怎样在Recovery模式中更新完成,并重启到主系统的,咱们还要分析Android中Recovery模式的工做原理。
下一篇幅开始看具体的Recovery模式工做原理,以及其在更新中的重要做用。