天天看點

Android的關機和重新開機

關機調用流程:

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:

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   

    }  

繼續閱讀