恢复工厂设置流程

===== 应用流程 =====
packages/apps/Settings/src/com/android/settings/MasterClear.java
请求checkin服务的masterClear接口

frameworks/base/services/java/com/android/server/FallbackCheckinService.java
masterClear中调用RecoverySystem.rebootAndWipe

frameworks/base/core/java/com/android/internal/os/RecoverySystem.java
rebootAndWipe调用bootCommand("--wipe_data");

bootCommand写参数到/cache/recover/command后调用Power.reboot("recovery");

frameworks/base/core/java/android/os/Power.java
reboot实际是c接口android_os_Power_reboot

frameworks/base/core/jni/android_os_Power.cpp
对于参数reason为空的情况, 直接调用reboot(RB_AUTOBOOT);

bionic/libc/unistd/reboot.c
reboot(); 这个函数是__reboot的封装

===== 内核流程 =====
./bionic/libc/arch-arm/syscalls/__reboot.S
这个文件由gensyscalls.py自动产生,调用系统调用__NR_reboot

bionic/libc/include/sys/linux-syscalls.h
#define __NR_reboot                       (__NR_SYSCALL_BASE + 88)

./arch/arm/kernel/calls.S
__NR_reboot 就是系统函数sys_reboot

sys_reboot定义在./include/linux/syscalls.h,实现在./kernel/sys.c
sys_reboot会调用kernel_restart

kernel_restart调用每一个架构特定的machine_restart, 即machine_restart执行每个架构特定的函数

不同的硬件架构平台对reboot可能有不同的处理, 这里以G1为例
arch/arm/kernel/process.c
machine_restart执行arm_pm_restart

* 对reboot参数的处理
arch/arm/mach-msm/pm.c
msm_pm_init(void)中注册了reboot回调函数
register_reboot_notifier(&msm_reboot_notifier);

msm_reboot_notifier中.notifier_call指向msm_reboot_call

msm_reboot_call处理重启参数,对restart_reason赋值

* 对restart_reason的操作
msm_pm_init(void)中指定了arm_pm_restart的真正接口
arm_pm_restart = msm_pm_restart;

msm_pm_restart中传递restart_reason给msm_proc_comm对机器进行复位

arch/arm/mach-msm/proc_comm.c
restart_reason对应msm_proc_comm的参数data1

data1会被写入到对应寄存器中
void __iomem *base = MSM_SHARED_RAM_BASE;
writel(data1 ? *data1 : 0, base + APP_DATA1);

===== bootloader流程 =====
机器重启, 重新进入bootloader。bootloader首先会读寄存器地址base + APP_DATA1的内容, 根据这个地址的值决定是否进入recovery模式或者其它模式。bootloader还会读取MISC分区第一块的内容, 决定进入recovery模式还是升级BP或做其它事情

bootloader根据寄存器的内容, 加载recovery内核

===== recovery应用流程 =====
recovery内核中的init.rc会运行recovery

recovery应用会读取misc第一块的分区内容或者/cache/recovery/command,
 读取参数后执行相应操作, 这里参数是--wipe_data, 放在cache/recovery/command里

把DATA和CACHE清空后重启系统,此时内核重启时写的寄存器参数RB_AUTOBOOT跟前面不同的
bionic/libc/include/sys/reboot.h
#define RB_AUTOBOOT     LINUX_REBOOT_CMD_RESTART
不会再让bootloader进入recovery模式,而是正常启动。

至此整个恢复工厂设置流程完毕,这只是recovery模式中的一个流程,对于recovery模式的bootloader和应用细节还很多需要讨论。

更多相关文章

  1. mybatisplus的坑 insert标签insert into select无参数问题的解决
  2. Python技巧匿名函数、回调函数和高阶函数
  3. python list.sort()根据多个关键字排序的方法实现
  4. 2011.09.26——— android sample之Notepad(notepadprovider)
  5. android中判断网络是否连接
  6. 2011.09.26——— android sample之Notepad(notepadprovider)
  7. android 常用资料
  8. Android中判断网络是否连接实例详解
  9. 【Arcgis android】 离线编辑实现及一些代码段

随机推荐

  1. android 主题元素映射方式
  2. Porting Android
  3. Android任务栏的图标显示
  4. 提示:Not targeting the latest versions
  5. Android(安卓)InputStream与String,Byte
  6. Android(安卓)异常:Immutable bitmap pass
  7. Android(安卓)开启闪光灯做手电筒 源码
  8. Android: 判断网络连接状态及连接类型
  9. Forward [To: Android(安卓)Beginners ]
  10. Android(安卓)HTTP GET/POST