Recovery menu
Android recovery的主要功能就是对系统进行升级的功能和方法。
Android recovery升级原理:
在通常的嵌入式系统的特点是,在运行状态下是将运行程序全部load到内存中运行。在运行状态中利用在内存中运行的程序进行flash中程序的更改。下次重启时从flash load进内存进行运行的程序就已经是更改过后的程序了。从而实现系统的升级。
Android recovery的功能可以分成三个主要的组成部分:
1 选择引导部分。主要功能是启动是进行选择是启动正常的android系统还是用于recovery的特殊系统。
2 用于进行升级的recovery系统,其中recovery系统拥有自己独立的UI和菜单解析系统。
3 希望升级的程序集合包。在这个升级包中包含升级的目标程序,一个简单的安全验证机制和验证码。一个用于控制升级的脚本和运行脚本所需要的API.
背景知识简述:
一 硬存储中的分区。
通常使用的嵌入式平台使用的硬存储原件,是一个使用连续地址分布,以block为基本单位的掉电保存存储介质。
其中有两点是比较重要的:
1 在硬存储中地址是连续的。
2 为了使用方便,通常会在第一个block中存储一个硬存储中存储内容的列表,列表实际上是将硬存储器根据每个存储内容的大小,将硬存储期间分成地址相互衔接的几个部分。
这个用于说明硬存储器区域划分的列表,在每一项中都会至少有四个信息用于说明其中某一部分的名称,简要说明,在硬存储器中从那个地址开始,到那个地址截止。这个列表我们我们通常称为TOC table,而每一个子部分我们通常称为Partition。TOC分区表会存储在硬存储期间的第一个block中。在程序启动是,是通过读取toc table并通过table中每一项的信息来loader相对应partition到内存中使系统运行起来。
在recovery模式中也是根据toc table通过刷新相对应的分区,实现升级功能。
二 Android平台系统流程(通用arm平台概述,不同的平台会有一些平台和适配软件特点):
Chip rom->SOC->u-boot->kernel->android(system)
Chip rom是固化在芯片内的一片硬存储区,主要功能就是读取和加载外硬存储器的第一个可运行Partition(通常是SOC)到chip ram中,通常烧录模式的判断和烧录协议程序也会包括在其中。当其完成读取一个分区之后,就会跳转并运行第一个分区的程序,当第一个分区的程序开始运行的时候,chip rom程序就完成了他的主要工作,交出所有的CPU功能。
SOC 通常我们叫它片上系统,在arm中soc的主要功能是初始化内存,同时对用于协调多IP工作的单片机,进行初始化。建立最小系统需求的内存,最基本输入输出环境。完成这些工作之后SOC也会根据TOC table引导下一个分区到内存中,并将CPU资源出让给下一个分区。
u-boot的主要的功能就是在基本系统可运行环境中,配置并检验全功能多任务操作系统(Linux)所需要的资源,负责引导Linux启动。
Kernel 在Android中使用的是Linux操作系统。左右的操作系统我个人认为实际上是一个硬件和抽象硬件资源管理器,管理并提供应用程序使用。在kernel完成所有资源的配置之后,会启动第一个(用户级应用程序,通常在Linux下是init)
三 ramdisk
Ramdisk是内存文件系统,作用就是在内存中建立一个可以对多个文件进行独立管理的文件系统。通常Linux在完成自身内核配置之后,启动的最最基本的系统服务都会存在在ramdisk中并运营。Ramdisk可以由kernel配置决定从emmc(flash)中loader到内存中运行或者由u-boot设置并解压一部分程序到特定内存地址来运行。这里需要明确说明的一个ramdisk与其他类型文件系统不同的特点是,ramdisk的所有内容都必须在使用之前,预先在内存中放置完成。所有的修改在掉电之后都不会保存。
四 Android正常启动与recovery模式启动差异
Android正常启动在Kernel完成配置之后,init启动的基本系统服务是存在system(ext4文件系统,存在在emmc的system partition分区中。)
Android recovery的init程序启动的系统基本服务是存在ramdisk中。这样做的好处是,recovery模式下如果不进行升级操作,系统基本没有对与emmc的操作。整个系统的运行被保证在内存中。
在正常启动时,u-boot选择启动是BOOT partition,在recovery模式时,u-boot选择启动是RECOVERY partition。
正常的BOOT partition和recovery partition都由两部分的内容打包生成。其中一部分是Kernel的镜像文件,这部分使用的是相同kernel配置生成的同一个镜像文件;ramdisk中在启动是起关键作用的init.rc(启动配置文件则不同)。
Android recovery系统升级流程:
Chip rom
|
SOC
|
u-boot
|
|—— KEY and boot reason 判断——|
正常启动 recovery
| |
BOOT partition RECOVERY partition
| |
Android recovery UI
|
Check SD or cache
|
Find update package
|
Run update script
OTA package的生成和组成:
Android系统的系统升级包,我们叫做OTA package。
在STE环境下生成的OTA升级包有两种类型:
1 Android定义的用于升级Android系统的升级包(kernel+system partition)
生成命令是在项目根目录下运行:make otapackage
OTA package的文件结构:
META-INF/ android定义的安全验证文件,升级用脚本和升级脚本所必须的API
Recovery/ recovery运行需要的TOC解析信息和脚本
System/ 文件系统模式下存储的需要升级的Android系统文件
boot.img 用于升级kernel的Linux镜像分区文件
recovery相关代码路径:
1 启动引导部分:
2 OTA package打包脚本
build/tools/releasetools/common.py
build/tools/releasetools/edify_generator.py
build/tools/releasetools/ota_from_target_files
3 recovery 主控程序
bootable/recovery/*.*
这部分代码主要完成三部分功能:UI,安全验证,脚本解释器。