关机调用流程:
WindowManagerService.shutdown->ShutdownThread.shutdown->ShutdownThread.shutdownInner->ShutdownThread.beginShutdownSequence -> ShutdownThread.start->ShutdownThread.run-> ShutdownThread.rebootOrShutdown->PowerManagerService.lowLevelShutdown->PowerManagerService.nativeShutdown->com_android_server_power_PowerManagerService.nativeShutdown->android_reboot.android_reboot->reboot(RB_POWER_OFF) (reboot.c reboot_main C bin 可执行程序 ; #define RB_POWER_OFF LINUX_REBOOT_CMD_POWER_OFF)-> kernel sys.c SYSCALL_DEFINE4
case LINUX_REBOOT_CMD_POWER_OFF:
/*
* debug trace
*/
restart_dbg("%s->%d->cmd=%x",__FUNCTION__,__LINE__,cmd);
kernel_power_off();
do_exit(0);
break;
kernel_power_off ->machine_power_off->machine_shutdown pm_power_off
以下内容
转自:http://wonview.blog.163.com/blog/static/585013272011511024511/
android系统的关机操作具体实现流程如下:
在android层通过系统调用reboot(arg)调用内核中的sys_reboot,具体流程如下:reboot()-->sys_reboot()
系统调用sys_reboot是在 ./kernel/sys.c里面实现;根据reboot的参数,分别执行系统 poweroff halt and restart
{
.....
case LINUX_REBOOT_CMD_HALT:
kernel_halt();
unlock_kernel();
do_exit(0);
panic("cannot halt");
case LINUX_REBOOT_CMD_POWER_OFF:
kernel_power_off();
unlock_kernel();
do_exit(0);
break;
case LINUX_REBOOT_CMD_RESTART2:
if (strncpy_from_user(&buffer[0], arg, sizeof(buffer) - 1) < 0) {
unlock_kernel();
return -EFAULT;
}
buffer[sizeof(buffer) - 1] = '\0';
kernel_restart(buffer);
break;
.....
}
其中,poweroff的流程:sys_reboot()-->kernel_power_off()-->machine_power_off()-->pm_power_off();
pm_power_off 是一个函数指针,指向和具体硬件平台相关的关机操作函数,需要具体平台具体实现。
halt的流程:sys_reboot()-->kernel_halt()-->machine_halt(), 对于移动设备来说一般为空。即没有halt的功能;
restart的流程:sys_reboot()-->kernel_restart()-->machine_restart()-->arm_pm_restart()-->arm_machine_restart()
最终实现功能的地方:
arch/arm/kernel/process.c
以下转自:http://blog.csdn.net/zmyde2010/article/details/6669291
reboot system
case1: factory reset
Settings/src/com/android/settings/MasterClear.java
sendBroadcast(new Intent("android.intent.action.MASTER_CLEAR"));
->
frameworks/base/services/java/com/android/server/MasterClearReceiver.java
RecoverySystem.rebootWipeUserData(context);
->
frameworks/base/core/java/android/os/RecoverySystem.java
bootCommand(context, "--wipe_data");
->
PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
pm.reboot("recovery");
->
frameworks/base/services/java/com/android/server/PowerManagerService.java
public void reboot(String reason){
ShutdownThread.reboot(mContext, finalReason, false);
}
->
frameworks/base/core/java/com/android/internal/app/ShutdownThread.java
rebootOrShutdown(){
Power.reboot(reason);
}
->
frameworks/base/core/java/android/os/Power.java
rebootNative(reason);
->
frameworks/base/core/jni/anroid_os_Power.cpp
__reboot(LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2, LINUX_REBOOT_CMD_RESTART2, (char*) chars);
->
kernel/kernel/sys.c
case LINUX_REBOOT_CMD_RESTART2:
kernel_restart(buffer);
->
machine_restart(cmd);
->
kernel/arch/arm/kernel/process.c
void arm_machine_restart(char mode, const char *cmd){
//set flag and reboot
}