一、前言
从上面我们可以看出,recovery的init.rc文件较android系统的简单了太多,它的主要作用就是启动ueventd初始化设备,然后启动/sbin/目录下的recovery程序,最后配置启动adb。recovery所有的工作都是由/sbin/目录下的recovery程序来做的。它是以标准的linux应用程序。接下来我们主要分析recovery这个linux应用程序的代码。
/cache/recovery/command 主系统给recovery的命令行 每条命令一行
/cache/recovery/log recovery的log文件,主系统可以通过读取这个文件看,recovery干了点什么
/cache/recovery/intent recovery 给主系统的 intent
主系统给recovery的命令行一共有5条
--send_intent=anystring 将字符串写入到/cache/recovery/intent
--update_package=path 升级的package 可用于OTA升级中
--wipe_data 删除用户数据然后重启
--wipe_cache 删除cache文件,不删除用户数据然后重启
--set_encrypted_filesystem=on|off 使能文件系统加密
知道了上面这些,我们就可以分析一下系统的一些过程
* 2. 系统向/cache/recovery/command 中写入 "--wipe_data"
* 3. 主系统重启并告诉bootloader下次启动进入recovery模式
* 4. recovery读取到command 中的参数
* 5. 格式化 /data
* 6. 格式化/cache
recovery是android除了主系统之外的一个辅助系统,它可以完成用户数据格式化,主系统升级,回复出厂设置等一系列功能。平时爱刷机的朋友对这个一定很熟悉,wipe data、update package是刷机必备操作。我们这篇文章主要就是来分析一下,recovery的工作流程,我们用到的wipe data、update package 等等操作是怎么实现的。
二、流程分析
我们知道正常的android系统启动顺序是bootloader->kernel->system,而recovery就是一个与system并列系统,只是功能比较简单。也就是说recovery也是一个标准的android文件系统,有自己的磁盘分区和文件目录。这个文件系统的启动是由bootloader控制的。在我用的平台上,同时摁住音量下+电源键 可以进入recovery。
具体的流程是:
1.当bootloader检测到开机时同时摁住音量下+电源键,启动kernel时,向kernel传递参数,让kernel执行recovery分区下的init.rc文件
我们的init.rc内容如下
on early-init
start ueventd //先启动ueventd来初始化内核的各种设备
on init //设置一些环境变量
export PATH /sbin
export ANDROID_ROOT /system
export ANDROID_DATA /data
export EXTERNAL_STORAGE /sdcard
symlink /system/etc /etc //将system/etc目录连接到recovery/etc目录
mkdir /sdcard /建立一些必备文件夹
mkdir /system
mkdir /data
mkdir /cache
mount tmpfs tmpfs /tmp/
on boot
ifup lo
hostname localhost
domainname localdomain
class_start default
service ueventd /sbin/ueventd
critical
service recovery /sbin/recovery //运行/sbin/recovery
service adbd /sbin/adbd recovery //启动adb
disabled
# Always start adbd on userdebug and eng builds //配置adb
on property:ro.debuggable=1
write /sys/class/android_usb/android0/enable 0
write /sys/class/android_usb/android0/idVendor 18D1
write /sys/class/android_usb/android0/idProduct D001
write /sys/class/android_usb/android0/functions adb
write /sys/class/android_usb/android0/enable 1
write /sys/class/android_usb/android0/iManufacturer $ro.product.manufacturer
write /sys/class/android_usb/android0/iProduct $ro.product.model
write /sys/class/android_usb/android0/iSerial $ro.serialno
start adbd
# Restart adbd so it can run as root
on property:service.adb.root=1
write /sys/class/android_usb/android0/enable 0
restart adbd //重启adb
write /sys/class/android_usb/android0/enable 1
从上面我们可以看出,recovery的init.rc文件较android系统的简单了太多,它的主要作用就是启动ueventd初始化设备,然后启动/sbin/目录下的recovery程序,最后配置启动adb。recovery所有的工作都是由/sbin/目录下的recovery程序来做的。它是以标准的linux应用程序。接下来我们主要分析recovery这个linux应用程序的代码。
2.recovery应用程序的一些介绍
作为一个可以升级修改android主系统的应用程序,recovery需要有相应的方法来与android主系统交流。交流的方法是通过/cache/目录/cache/recovery/command 主系统给recovery的命令行 每条命令一行
/cache/recovery/log recovery的log文件,主系统可以通过读取这个文件看,recovery干了点什么
/cache/recovery/intent recovery 给主系统的 intent
主系统给recovery的命令行一共有5条
--send_intent=anystring 将字符串写入到/cache/recovery/intent
--update_package=path 升级的package 可用于OTA升级中
--wipe_data 删除用户数据然后重启
--wipe_cache 删除cache文件,不删除用户数据然后重启
--set_encrypted_filesystem=on|off 使能文件系统加密
知道了上面这些,我们就可以分析一下系统的一些过程
恢复出厂设置流程:
* 1. 用户选择恢复出厂设置* 2. 系统向/cache/recovery/command 中写入 "--wipe_data"
* 3. 主系统重启并告诉bootloader下次启动进入recovery模式
* 4. recovery读取到command 中的参数
* 5. 格式化 /data
* 6. 格式化/cache