设为首页 加入收藏

TOP

Android Recovery升级原理(一)
2019-09-19 11:10:27 】 浏览:141
Tags:Android Recovery 升级 原理

摘要

Recovery模式指的是一种可以对安卓机内部的数据或系统进行修改的模式(类似于windows PE或DOS)。也可以称之为安卓的恢复模式,在这个所谓的恢复模式下,我们可以刷入新的安卓系统,或者对已有的系统进行备份或升级,也可以在此恢复出厂设置(格式化数据和缓存)。

1. Recovery相关概念

  • Recovery: Recovery模式指的是一种可以对安卓机内部的数据或系统进行修改的模式,也指Android的Recovery分区
  • OTA: Over-the-Air Technology,即空中下载技术,是 Android 系统提供的标准软件升级方式。 它功能强大,提供了完全升级、增量升级模式,可以通过 SD 卡升级,也可以通过网络升级。不管是哪种方式,都有几个过程:生成升级包、下载升级包、安装升级包。
  • RecoverySystem:Android系统内部实现的一个工具类,Android应用层操作Recovery模式的一个重要途径,它提供了几个重要的API,用于实现OTA包校验、升级以及恢复出厂设置(格式化数据和缓存)。
  • Main System:主系统模式,即Android正常开机所进入的Android系统
  • Bootloader:Bootloader是嵌入式系统在加电后执行的第一段代码,在它完成CPU和相关硬件的初始化之后,再将操作系统映像或固化的嵌入式应用程序装在到内存中然后跳转到操作系统所在的空间,启动操作系统运行。
  • BCB:Bootloader Control Block,启动控制信息块,位于misc分区,从代码上看,就是一个结构体。

2. Android系统的启动模式

2.1 Android 各个分区介绍

一般来说,安卓手机和平板一般包括以下标准内部分区:


Boot:包含Linux内核和一个最小的root文件系统(装载到ramdisk中),用于挂载系统和其他的分区,并开始Runtime。正如名字所代表的意思(注:boot的意思是启动),这个分区使Android设备可以启动。如果没有这个分区,Android设备通常无法启动到Android系统。


System:这个分区几乎包含了除kerner和ramdisk之外的整个android操作系统,包括了用户界面、和所有预装的系统应用程序和库文件(AOSP中可以获取到源代码)。在运行的过程中,这个分区是read-only的。当然,一些Android设备,也允许在remount的情况下,对system分区进行读写。 擦除这个分区,相当于删除整个安卓系统,会导致不能进入Main System, 但不会影响到Recovery。因此,可以通过进入Recovery程序或者bootloader程序中,升级安装一个新ROM。


Userdata:用户数据区,用户安装的应用程序会把数据保存在这里,包含了用户的数据:联系人、短信、设置、用户安装的程序。擦除这个分区,本质上等同于手机恢复出厂设置,也就是手机系统第一次启动时的状态,或者是最后一次安装官方或第三方ROM后的状态。在Recovery程序中进行的“data/factory reset ”操作就是在擦除这个分区。正常情况下OTA是不会清除这里的数据的,指定要删除数据的除外。


Cache:系统缓存区,临时的保存应用数据(要把数据保存在这里,需要特地的app permission), OTA的升级包也可以保存在这里。OTA升级过程可能会清楚这个分区的数据。一般来讲,Android差分包升级也需要依赖此分区存放一些中间文件。


Recovery:包括了一个完整Linux内核和一些特殊的recovery binary,可以读取升级文件用这些文件来更新其他的分区。


Misc:一个非常小的分区,4 MB左右。recovery用这个分区来保存一些关于升级的信息,应对升级过程中的设备掉电重启的状况,Bootloader启动的时候,会读取这个分区里面的信息,以决定系统是否进Recovery System 或 Main System。


以上几个分区是Google官方的标准,对于第三方Android设备厂商来讲,分区的情况可能稍微不一样,比如Rockchip平台,还增加了user分区、kernel分区和backup分区。其中:

kernel:顾名思义,是存放kernel.img镜像的。在boot分区里面的kernel内核镜像损坏的情况下(比如flash损坏),bootloader会尝试加载kerner分区里面的内核镜像。

backup:存放整个系统镜像(update.img), 可用于恢复设备到出厂ROM。

user: 用户分区,也就是平时我们所说的内置sdcard。另外还有外置的sdcard分区,用于存放用户相片、视频、文档、ROM安装包等。

2.2 Android的启动模式

一般来讲,Android有三种启动模式:Fastboot模式,Recovery System 以及Main System。

  • Fastboot:在这种模式下,可以修改手机的硬件,并且允许我们发送一些命令给Bootloader。如使用电脑刷机,则需要进入fastboot模式,通过电脑执行命令将系统镜像刷到通过USB刷到Android设备中中。
  • Recovery:Recovery是一个小型的操作系统,并且会加载部分文件系统,这样才能从sdcard中读取升级包。
  • Main System: 即我们平时正常开机后所使用的手机操作系统模式

首先说一下,正常启动和进入Recovery的区别,一图以概之:

image

2.3 如何进入Recovery模式

一般来讲,进入recovery有两种方式,一种是通过组合键进入recovery,按键指引的方式,各个Android平台都不一样,比如三星的手机是在关机状态下同时按住【音量上】、【HOME键】、【电源键】,等待屏幕亮起后即可放开,进入Recovery模式。而Rockchip的机顶盒,则是使用按【Reset键】加【电源键】开机的方式,形式不一。

另一种,则是使用系统命令启动到Recovery模式的,这对绝大部分Android设备是通用的:

reboot recovery

3. Recovery升级原理

3.1 应用层升级流程

在Android应用层部分,OTA系统升级流程。大概的流程图如下所示:

image

以上部分,只介绍了应用层层面的 ota升级包的下载、校验以及最后的发起安装过程。在这里,重要讲解进入Recovery模式后,OTA包的升级过程。

首先,在应用层下载升级包后,会调用RecoverySystem.installPackage(Context context, File packageFile)函数来发起安装过程,这个过程主要的原理,实际上只是往 /cache/recovery/command 写入ota升级包存放路径,然后重启到recovery模式,仅此而已。

    public static void installPackage(Context context, File packageFile)
        throws IOException {
        String filename = packageFile.getCanonicalPath();
        Log.w(TAG, "!!! REBOOTING TO INSTALL &
首页 上一页 1 2 3 4 5 下一页 尾页 1/5/5
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇linux 的swap、swappiness及kswap.. 下一篇android-ramdisk.img分析、recove..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目