http://blog.csdn.net/haokaihaohe110/article/details/7751410
Android手机开机后,会先运行 bootloader。Bootloader会根据某些判定条件(比如按某个特殊键)决定是否进入 recovery模式。Recovery模式会装载recovery分区,该分区包含recovery.img。recovery.img包含了标准内核(和boot.img中的内核相同)以及recovery根文件系统。
菜单说明:
Options |
名称 |
Description |
Reboot system now |
重启系统 |
立即重启系统 |
Factory reset |
恢复出厂设置 |
1. 从backup分区获取update.img 2. 还原除了backup以外所有分区固件 |
Update from SDCard |
从SD卡升级 |
1. 从“update-script”获取升级命令 2. 从SD卡根目录获取升级固件update.im |
Update from uDisk |
从U盘升级 |
1. 从“update-script”获取升级命令 2. 从uDisk根目录获取升级固update.img |
android recovery总体流程
BCB是bootloader与Recovery的通信接口,也是Bootloader与Main system之间的通信接口。存储在flash中的MISC分区,占用三个page,其本身就是一个结构体,具体成员以及各成员含义如下:
struct bootloader_message{
char command[32];
char status[32];
char recovery[1024];
};
①command成员:其可能的取值我们在上文已经分析过了,即当我们想要在重启进入Recovery模式时,会更新这个成员的值。另外在成功更新后结束Recovery时,会清除这个成员的值,防止重启时再次进入Recovery模式。
②status:在完成相应的更新后,Bootloader会将执行结果写入到这个字段。
③recovery:可被Main System写入,也可被Recovery服务程序写入。该文件的内容格式为:
“recovery\n
该文件存储的就是一个字符串,必须以recovery\n开头,否则这个字段的所有内容域会被忽略。“recovery\n”之后的部分,是/cache/recovery/command支持的命令。可以将其理解为Recovery操作过程中对命令操作的备份。Recovery对其操作的过程为:先读取BCB然后读取/cache/recovery/command,然后将二者重新写回BCB,这样在进入Main system之前,确保操作被执行。在操作之后进入Main system之前,Recovery又会清空BCB的command域和recovery域,这样确保重启后不再进入Recovery模式。
ui_init():Recovery服务使用了一个基于framebuffer的简单ui(miniui)系统。这个函数对其进行了简单的初始化。在Recovery服务的过程中主要用于显示一个背景图片(正在安装或安装失败)和一个进度条(用于显示进度)。另外还启动了两个线程,一个用于处理进度条的显示(progress_thread),另一个用于响应用户的按键(input_thread)。
update.zip包的目录结构
|----boot.img //更新boot分区所需要的文件。这个boot.img主要包括kernel+ramdisk。
|----system/ //system/目录的内容在升级后会放在系统的system分区。主要用来更新系统的一些应用或则应用会用到的一些库等等。
//可以将Android源码编译out/target/product/tcc8800/system/中的所有文件拷贝到这个目录来代替。
|----recovery/ //recovery/目录中的recovery-from-boot.p是boot.img和recovery.img的补丁(patch),主要用来更新recovery分区,
//其中etc/目录下的install-recovery.sh是更新脚本。
`|----recovery-from-boot.p
`|----etc/
`|----install-recovery.sh
|---META-INF/
`|CERT.RSA //与签名文件相关联的签名程序块文件,它存储了用于签名JAR文件的公共签名。
`|CERT.SF //这是JAR文件的签名文件,其中前缀CERT代表签名者。
`|MANIFEST.MF //定义了与包的组成结构相关的数据。类似Android应用的mainfest.xml文件。
`|----com/
`|----google/
`|----android/
`|----update-binary //update-binary是一个二进制文件,相当于一个脚本解释器,能够识别updater-script中描述的操作。
//该文件在Android源码编译后out/target/product/tcc8800/system bin/updater生成,可将updater重命名为update-binary得到。
//该文件在具体的更新包中的名字由源码中bootable/recovery/install.c中的宏ASSUMED_UPDATE_BINARY_NAME的值而定。
`|----updater-script //此文件是一个脚本文件,具体描述了更新过程。我们可以根据具体情况编写该脚本来适应我们的具体需求。
//该文件的命名由源码中bootable/recovery/updater/updater.c文件中的宏SCRIPT_NAME的值而定。
`|----android/
`|----metadata //是描述设备信息及环境变量的元数据。主要包括一些编译选项,签名公钥,时间戳以及设备型号等。
我们还可以在包中添加userdata目录,来更新系统中的用户数据部分。这部分内容在更新后会存放在系统的/data目录下。
update.zip更新包在制作完成后需要对其签名,否则在升级时会出现认证失败的错误提示。而且签名要使用和目标板一致的加密公钥。