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

android恢复出厂设置流程简述

2012-10-15 18:02 399 查看
===== 应用流程 =====

====>frameworks/base/services/java/com/android/server/MasterClearReceiver.java

RecoverySystem.rebootWipeUserData(context);

====>framesworks/base/core/java/android/os/RecoverySystem.java

rebootWipeUserData ===> bootCommand(context, "--wipe_data");

bootCommand写参数"--wipe_data"到/cache/recovery/command后,

调用pm.reboot("recovery");

====>frameworks/base/core/java/android/os/Power.java

reboot ===> rebootNative

====>frameworks/base/core/jni/android_os_Power.cpp

JNI 映射

{ "rebootNative", "(Ljava/lang/String;)V", (void*)android_os_Power_reboot },

android_os_Power_reboot ===> __reboot

====>bionic/libc/arch-arm/syscalls/__reboot.S

ldr r7, =__NR_reboot // bionic/libc/include/sys/linux-syscalls.h

b __set_syscall_errno

#define __NR_reboot (__NR_SYSCALL_BASE + 88)

===== 内核流程 =====

====>kernel/arch/arm/kernel/calls.S

/* 88 */ CALL(sys_reboot)

====>kernel/sys.c

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

在这里,判断buffer的内容,用一个寄存器记录是否是recovery mode,以便boot loader去查询。

sys_reboot会调用kernel_restart

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

====>kernel/arch/arm/kernel/process.c

machine_restart==>arm_pm_restart==>arm_machine_restart==>arch_reset

====>kernel/arch/arm/mach-tegra/include/mach/system.h

arch_reset

===== bootloader流程 =====

机器重启, 重新进入bootloader。bootloader首先会读寄存器的内容, 根据这个值决定是否进入recovery模式或者其它模式。

bootloader然后加载recovery内核。

===== recovery应用流程 =====

recovery内核中的init.rc会运行recovery

recovery应用会读取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模式,而是正常启动。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: