android4.0 recovery流程详解

一、前言

  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
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值