Android系统关机的全流程解析

2019-12-10 19:02:04刘景俊

以上这些只有前六个命令被Android系统所使用,为什么这么说,可以去看bionic/libc/include/sys/reboot.h,上边已经贴出了。LINUX_REBOOT_CMD_HALT虽有定义,但是也没有发现Android系统中哪里有调用,有高手找到的话,希望能够告知一下。最终的最终,能够用到的就只有三个:

  • RESTART
  • POWER_OFF
  • RESTART2

    10.最终实现
    重启调用的是kernel_restart,区别是参数是不是空,关机则调用kernel_power_off(),先看关机:

    /** 
     * kernel_power_off - power_off the system 
     * 
     * Shutdown everything and perform a clean system power_off. 
     */ 
    void kernel_power_off(void) 
    { 
      kernel_shutdown_prepare(SYSTEM_POWER_OFF); 
      if (pm_power_off_prepare) 
        pm_power_off_prepare(); 
      disable_nonboot_cpus(); 
      syscore_shutdown(); 
      printk(KERN_EMERG "Power down.n"); 
      kmsg_dump(KMSG_DUMP_POWEROFF); 
      machine_power_off(); 
    } 
    EXPORT_SYMBOL_GPL(kernel_power_off); 
    

    最了一系列准备工作,最终调用machine_power_off():

    void machine_power_off(void) 
    {   
      machine_shutdown(); 
      if (pm_power_off) 
        pm_power_off(); 
    } 
    
    

    之前找寻的pm_power_off在这里就有用处了,是关机的最后一步操作。关机完成,之后看下重启操作:

    /** 
     * kernel_restart - reboot the system 
     * @cmd: pointer to buffer containing command to execute for restart 
     *   or %NULL 
     * 
     * Shutdown everything and perform a clean reboot. 
     * This is not safe to call in interrupt context. 
     */ 
    void kernel_restart(char *cmd) 
    { 
      kernel_restart_prepare(cmd); 
      if (!cmd) 
        printk(KERN_EMERG "Restarting system.n"); 
      else 
        printk(KERN_EMERG "Restarting system with command '%s'.n", cmd); 
      kmsg_dump(KMSG_DUMP_RESTART); 
      machine_restart(cmd); 
    } 
    EXPORT_SYMBOL_GPL(kernel_restart);