一、前提条件

要进行Android系统升级,必须首先进入recovery模式,进入recovery模式的方式有:

1. 通过读取 /cache 分区中文件 /cache/recovery/command 内容进入,当然在重启之前已经向文件 /cache/recovery/command 写入了命令字段
2. 通过按键操作进入 (G1 通过同时按 HOME 和 挂断键)
以上两种方式进入都需要 blob的支持

二、基本升级过程

Android 升级分为两种,一种是对系统中单个文件升级,一种是对 mtd 整个分区进行升级,升级包是用 zip 格式压缩的经过签名的压缩文件。升级过程主要流程描述如下:

1. bootloader 发现用户按住升级键或/cache/recovery/command中有对应字段,将 recovery.img 作为 ramdisk 读取到内存。

2. 内核根据 ramdisk 中的 init.rc 执行 recovery 脚本。 Recovery 脚本在 sdcard 中找到升级文件后调用 recovery 程序依次做以下操作:

1) 检查升级文件的数字签名是否可靠。检查签名使用的本地密钥为 /res/keys

2)如果签名合法则执行提取压缩包中 META-INF/com/google/android/update-binary 文件重命名到 /tmp/update_binary 并执行该文件。

3)update_binary 解析压缩文件中的 META-INF/com/google/android/updater-script 文件并执行。其升级进度通过管道回传给 recovery 程序。升级 / 更新可以直接覆盖目标文件,也可采用二进制补丁形式以减少升级文件的容量,采用的工具为 bsdiff 和 imgdiff 。对于补丁包升级形式,升级数据源可靠性鉴别的依据为 sha1 校验和数据长度比对。具体要求为: 1 升 级包提供的目标文件的 sha1 值和目标文件计算值符合,即目标正确。 2 进行补丁后的文件 sha1 值和长度符合升级包提供的补丁后的目标文件的长度和 sha1 数值,保证结果正确。两项有一项不符合则升级过程停止。为保证第二项操作不损毁最终目标,打补丁的文件会先临时存储到 cache 中,等到结果比对正确才进行实际写入 / 替换目标文件操作。所以此过程要求 cache 目录必须有足够空间能够保存临时文件。

三、recovery.img与boot.img的比较

从上图可知:
1) recovery.img其实已经是进入了Linux系统。

2) recovery.img为了具有恢复系统的能力,比普通的boot.img目录结构中:
1、多了/res/images目录,在这个目录下的图片都是恢复时我们看到的背景画面。
2、多了/sbin/recovery二进制程序,这个就是恢复用的程序。
3、/sbin/adbd不一样,应该和恢复有关。

3) Android系统中的初始化程序(init)和初始化配置文件(default.prop、init.trout.rc、init.rc、init.goldfish.rc、)都不一样。这就是系统没有进入图形界面而进入了类似文本界面,并可以通过简单的组合键进行恢复的原因。

Android可以通过Recovery模式,实现恢复出厂设置、OTA升级、patch升级及firmware升级。在关机后,同时按下home + power键可以进入recovery模式。
大部分升级(包括刷机)都可以通过一个SD卡中的"updata.zip"文件升级包进行傻瓜式升级(步骤简单的升级)。而这一过程就是在系统进入Recovery模式后,通过升级程序运行升级包中“META-INF/com/google/android/update-script脚本来执行各种不同的自定义升级,脚本中是一组recovery模式下系统能识别的UI控制命令和文件系统操作命令,例如write_raw_image(烧写FLASH分区)、copy_dir(复制目录)等等。

更多相关文章

  1. Ubuntu 下不能识别android设备的解决方法
  2. eclipse 上调试android的自带应用方法 一
  3. [置顶] 我的Android进阶之旅------>Android声明和使用权限
  4. Android——使用AIDL实现进程间传递对象案例
  5. android 增加新按键
  6. 实例详解Android文件存储数据方式
  7. Android(安卓)USB OTG U盘读写相关使用最全总结
  8. Android(安卓)Repo的manifest XML文件格式
  9. Linux与Android休眠唤醒对比(二)

随机推荐

  1. Android(安卓)WebView封装及定制js的aler
  2. 【整理】android开源项目【项目篇】
  3. Android应用程序永久获取root权限方法
  4. windows 下 Android NDK开发配置(window +
  5. Android(安卓)常用Adapter(ArrayAdapter ,S
  6. Android(安卓)设置屏幕不待机
  7. android SQLite数据库总结
  8. android 基于BroadcastReceiver广播 完全
  9. android之意图
  10. Android Butterknife框架