您的位置:首页 > 移动开发 > Android开发

从零开始——Android 4.0 实现recovery模式,出厂设置功能

2014-12-28 16:20 483 查看
在移植recovery之前,我们需要知道为什么需要移植recovery?

1、需要实现恢复出厂设置功能

2、需要实现recovery升级功能(主要是方便用户自己定制ROM)

在移植这个recovery的时候遇到了N多的问题,没人指导,没有可供参考的书籍,只有度娘和谷歌陪伴。下面将会提到一些典型会遇到的问题。

如何进入recovery?

1、开机的时候按下组合按键

2、在系统中重启至recovery模式(需要root权限或者相关软件)

3、在系统中设置了恢复出厂设置(选择了这个功能后,系统会重启至recovery模式)

从上面的几个进入recovery模式的方式中,我们可以发现几个问题:

1、如何实现组合按键进入recovery模式?

2、如何实现系统重启进入recovery模式?

3、进入recovery模式的流程是?

我们来看看这些问题:

1、如何实现组合按键进入recovery模式?

答:要实现组合按键进入recovery模式,我们应该在uboot中实现按键检测的功能。

但是我们又该在哪里实现这个按键检测的功能?

想想,我们应该在uboot初始化完硬件,检测按键进入到命令行的这个位置加上按键检测的功能。至于在哪里初始化按键操作这个就不用我说了。

检测到组合按键之后,又该如何跳转到recovery模式?

从uboot跳转到recovery模式和从uboot跳转到kernel的方式是一样的,通过bootcmd配置参数,加载对应的recovery.img或kernel.img,并进入。

2、如何实现系统重启进入recovery模式?

答:这回答这个问题之前,我们需要知道系统重启指的是软重启,而不是硬件复位或者掉电重启。软重启的话,CPU内部的大部分寄存器会重置,RAM的数据也会丢失。

在这种情况下要实现从系统中传递参数或者标志给uboot,让uboot知道你要进入到哪个模式,就需要设置一些参数,可以在这种情况下都保存的。如:把参数保存到Nand中,

或者写入参数到CPU的一些不变的寄存器中(软重启时不被重置的寄存器)。只要实现软重启在系统中传递参数到uboot,那么就差不多了。然后在uboot根据这个参数来进入

到recovery就OK。如果使用CPU的寄存器传递,那么请参考你的CPU的reset部分的寄存器,看看哪些是软重启不重置的。

3、进入recovery模式的流程是?

答:整体流程就是: uboot --> 检测到进入recovery的条件 --> 传递内核参数、加载kernel --> 加载recovery的文件系统。

在这里有必要说一下,这个recovery.img有两种形式:一种是包含boot信息、kernel和recovery微型文件系统压缩而成的镜像,另一种是只包含recovery文件系统未经压缩的镜像。如果是使用前者,则必须要能识别到kernel的入口地址和recovery的入口地址。

下面来看一个非常重要的情况:

uboot进入系统和uboot进入recovery的区别在哪?

首先,我们来看看uboot是如何引导进入系统的:

在uboot初始化完一些操作后,需要指定kernel的入口地址和ramdisk文件系统的入口地址。使用bootm把kernel和ramdisk加载到RAM指定的位置,然后加载到RAM指定的kernel的起始地址,这样系统就会进入kernel。进入kernel的同时,也把ramdisk的地址传递进去了,这样在kernel完成一些操作后就会进入到ramdisk文件系统,最后进入到系统。

然而,uboot引导进入recovery却有点不同:

在uboot初始化完一些操作后,检测到进入recovery的条件(可以是组合按键,也可以是软启进入recovery传递下来的参数),然后就需要使用确定kernel的入口地址和recovery文件系统的入口地址。在这里,如果你的recovery.img是纯文件系统的,那么方式跟进入系统的一样,只不过是地址稍微有点不同而已。如果recovery.img是包含kernel和boot的呢过信息的。那么bootm只需要加载recovery分区的信息到RAM,然后指定这个起始地址。在准备加载kernel的时候,需要实现解析这个boot的信息,并提取出其中的kernel的起始地址和recovery文件系统的其实地址。这里面需要解压对应的kernel和recovery的ramdisk,并加载到RAM的指定位置中。才可以引导进入到kernel,再进入到recovery。

只要实现了系统软启进入recovery模式,那么恢复出厂设置就差不多完成了。软启进入recovery最终是要修改kernel,在kernel中配置传递的参数,在uboot中获取这个参数来判断是否需要进入recovery。

说白了,要实现recovery和出厂设置只要修改uboot和kernel就OK

其他的请参考下列文章:

Android重启流程

Android Recovery 的流程分析

dm37xx android2.3.4增加recovery升级功能(一)

dm37xx android2.3.4增加recovery升级功能(二)

09年初写的Android Recovery - Coding Guy

【高级开发教程】编译recovery.img教程
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐