1 2 |
framework/base/services/core/java/com/android/server/power/PowerManagerServer.java framework/base/services/core/java/com/android/server/power/ShutdownThread.java |
一、概述
重启动作从按键触发中断,linux kernel层给Android framework层返回按键事件进入 framework层,再从 framework层到kernel层执行kernel层关机任务。当然还有非按键触发,比如系统异常导致重启,或者直接调用PM的reboot()方法重启。
这里就先从PowerManager说起。
二、关机流程
2.1 PM.reboot
[-> PowerManager.java]
1 2 3 4 5 6 7 |
public void reboot(String reason) { try { //【见小节2.2】 mService.reboot(false, reason, true); } catch (RemoteException e) { } } |
2.2 BinderService.reboot
[-> PowerManagerService.java]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
private final class BinderService extends IPowerManager.Stub { public void reboot(boolean confirm, String reason, boolean wait) { //权限检查 mContext.enforceCallingOrSelfPermission(android.Manifest.permission.REBOOT, null); if (PowerManager.REBOOT_RECOVERY.equals(reason)) { mContext.enforceCallingOrSelfPermission(android.Manifest.permission.RECOVERY, null); } final long ident = Binder.clearCallingIdentity(); try { //【见小节2.3】 shutdownOrRebootInternal(false, confirm, reason, wait); } finally { Binder.restoreCallingIdentity(ident); } } } |
此时参数为shutdownOrRebootInternal(false, false, reason, true);
- shutdown=false:代表重启;
- confirm=false:代表直接重启,无需弹出询问提示框;
- wait=true:代表阻塞等待重启操作完成。
2.3 PMS.shutdownOrRebootInternal
[-> PowerManagerService.java]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
private void shutdownOrRebootInternal(final boolean shutdown, final boolean confirm, final String reason, boolean wait) { ... Runnable runnable = new Runnable() { @Override public void run() { synchronized (this) { if (shutdown) { ShutdownThread.shutdown(mContext, reason, confirm); } else { //重启则进入该分支【见小节2.4】 ShutdownThread.reboot(mContext, reason, confirm); } } } }; -font-monaco crayon-os-pc print-yes notranslate" data-settings=" minimize scroll-always" style=" margin-top: 12px; margin-bottom: 12px; font-size: 13px !important; line-height: 15px !important;">
一、概述重启动作从按键触发中断,linux kernel层给Android framework层返回按键事件进入 framework层,再从 framework层到kernel层执行kernel层关机任务。当然还有非按键触发,比如系统异常导致重启,或者直接调用PM的reboot()方法重启。 这里就先从PowerManager说起。 二、关机流程2.1 PM.reboot[-> PowerManager.java]
2.2 BinderService.reboot[-> PowerManagerService.java]
此时参数为shutdownOrRebootInternal(false, false, reason, true);
2.3 PMS.shutdownOrRebootInternal[-> PowerManagerService.java]
|