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:
/*
*  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   
    }  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值