Android系统关机的全流程解析

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

重启的实现在run()中,因为ShutdownThread是Thread的扩展,所以run会自动运行。

/** 
 * Makes sure we handle the shutdown gracefully. 
 * Shuts off power regardless of radio and bluetooth state if the alloted time has passed. 
 */  
public void run() { 
  BroadcastReceiver br = new BroadcastReceiver() { 
    @Override public void onReceive(Context context, Intent intent) { 
      // We don't allow apps to cancel this, so ignore the result. 
      actionDone(); 
    } 
  }; 
 
  /* 
   * Write a system property in case the system_server reboots before we 
   * get to the actual hardware restart. If that happens, we'll retry at 
   * the beginning of the SystemServer startup. 
   */  
  {   
    String reason = (mReboot ? "1" : "0") + (mRebootReason != null ? mRebootReason : ""); 
    SystemProperties.set(SHUTDOWN_ACTION_PROPERTY, reason); 
  } 
 
  /* 
   * If we are rebooting into safe mode, write a system property 
   * indicating so. 
   */  
  if (mRebootSafeMode) { 
    SystemProperties.set(REBOOT_SAFEMODE_PROPERTY, "1"); 
  } 
  ... 
  rebootOrShutdown(mReboot, mRebootReason); 
}  

在重启前会将重启原因写入sys.shutdown.requested,如果没有则为空,如果是安全模式还会将persist.sys.safemode置1,之后会进行一些关机前的预处理,关闭ActivityManager以及MountService,最终调用rebootOrShutdown进行关机操作。

 

  /** 
   * Do not call this directly. Use {@link #reboot(Context, String, boolean)} 
   * or {@link #shutdown(Context, boolean)} instead. 
   * 
   * @param reboot true to reboot or false to shutdown 
   * @param reason reason for reboot 
   */ 
  public static void rebootOrShutdown(boolean reboot, String reason) { 
    if (reboot) { 
      Log.i(TAG, "Rebooting, reason: " + reason);  
      try { 
        PowerManagerService.lowLevelReboot(reason); 
      } catch (Exception e) { 
        Log.e(TAG, "Reboot failed, will attempt shutdown instead", e); 
      }  
    } else if (SHUTDOWN_VIBRATE_MS > 0) { 
      // vibrate before shutting down 
      Vibrator vibrator = new SystemVibrator(); 
      try { 
        vibrator.vibrate(SHUTDOWN_VIBRATE_MS); 
      } catch (Exception e) { 
        // Failure to vibrate shouldn't interrupt shutdown. Just log it. 
        Log.w(TAG, "Failed to vibrate during shutdown.", e); 
      }   
         
      // vibrator is asynchronous so we need to wait to avoid shutting down too soon. 
      try { 
        Thread.sleep(SHUTDOWN_VIBRATE_MS); 
      } catch (InterruptedException unused) { 
      }   
    }   
       
    // Shutdown power 
    Log.i(TAG, "Performing low-level shutdown..."); 
    PowerManagerService.lowLevelShutdown(); 
  } 
}