您的位置:首页 > 其它

恢复出厂设置 Factory Reset 调用过程

2014-09-17 22:37 281 查看
过程分两大步

1. Main system 往/cache/recovery/command写命令wipe-data,重启手机

2. bootloader引导到recovery分区,执行wipe-data, 重启手机

1. Main system 往/cache/recovery/command写命令wipe-data,重启手机

packages/apps/Settings/src/com/android/settings/MasterClearConfirm.java

getActivity().sendBroadcast(new Intent("android.intent.action.MASTER_CLEAR"));

packages/apps/Settings/src/com/android/settings/MasterClear.java

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

new Thread("Reboot")

RecoverySystem.rebootWipeUserData(context)

frameworks/base/core/java/android/os/RecoverySystem.java

bootCommand(context, "--wipe_data\n--locale=" + Locale.getDefault().toString());

bootCommand

write command wipe-data to /cache/recovery/command

pm.reboot("recovery");

frameworks/base/core/java/android/os/PowerManager.java

frameworks/base/services/java/com/android/server/power/PowerManagerService.java

frameworks/base/services/java/com/android/server/power/ShutdownThread.java

PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);

pm.reboot("recovery");

mService.reboot(false, reason, true)

shutdownOrRebootInternal(false, confirm, reason, wait);

ShutdownThread.shutdown(mContext, confirm); (shutdown)

ShutdownThread.reboot(mContext, reason, confirm); (reboot)

shutdownInner(context, confirm);

beginShutdownSequence(context)

setprop sys.shutdown.requested recovery

rebootOrShutdown(mReboot, mRebootReason);

PowerManagerService.lowLevelReboot(reason)

SystemProperties.set("sys.powerctl", "reboot," + reason); Thread.sleep(20000);

system/core/rootdir/init.rc

on property:sys.powerctl=*

powerctl ${sys.powerctl}

KEYWORD(powerctl, COMMAND, 1, do_powerctl) system/core/init/keywords.h

do_powerctl() system/core/init/builtins.c

do_reboot(cmd, 0, reboot_target); cmd = ANDROID_RB_RESTART2; system/core/init/reboot.c

__reboot(LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2,LINUX_REBOOT_CMD_RESTART2, arg);

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

kernel/kernel/sys.c

SYSCALL_DEFINE4(reboot, int, magic1, int, magic2, unsigned int, cmd,void __user *, arg)

kernel_restart(char *cmd)

machine_restart(char *cmd) kernel/arch/arm/kernel/process.c

machine_shutdown()

arm_pm_restart(reboot_mode,cmd) kernel/arch/arm/kernel/process.c

pm_power_off = msm_pm_power_off;

arm_pm_restart = msm_pm_restart; /kernel/arch/arm/mach-msm/restart_7k.c

setup_mm_for_reboot kernel/arch/unicore32/mm/mmu.c

msm_proc_comm /kernel/arch/arm/mach-msm/proc_msm.c

2. bootloader引导到recovery分区,执行wipe-data, 重启手机

bootable/recovery/etc/init.rc

service recovery /sbin/recovery

bootable/recovery/recovery.c

读取/cache/recovery/command,判定哪种命令,如果是wipe-data,

erase_volume("/data");

erase_volume("/cache");

reboot();

check master reset log: /cache/recovery/log
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: