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

  • Post author:
  • Post category:其他


过程分两大步

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



版权声明:本文为kv110原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。