android关机重启流程,不能完全说是原创,只是自己一步步跟下来的学习总结。
1、
frameworks/base/core/java/android/os/PowerManager.java
public void reboot (String reason)
接口的作用就是重启设备,而且,就算重启成功了也没有返回值。
需要包含REBOOT权限,也就是android.permission.REBOOT
唯一参数reason代表需要的特定重启模式,比如recovery,当然也可以为null。
mService为IPowerManager Binder接口服务。
2、
frameworks/base/core/java/android/os/IPowerManager.aidl
3、
frameworks/base/services/java/com/android/server/power/PowerManagerService.java
4、
frameworks/base/services/java/com/android/server/power/ShutdownThread.java
这里代码就不截图了,ShutdownThread.java里搜索reboot或shutdown。
reboot函数的说明是需要重启,且不是安全模式,重启参数为传递下来reason,shutdownInner的confirm参数是用来设置是否有确认提示框的,通过reboot接口调用重启是没有的,为false。
重启的实现在run()中,因为ShutdownThread是Thread的扩展,所以run会自动运行。
run()中,在重启前会将重启原因写入sys.shutdown.requested,如果没有则为空,如果是安全模式还会将persist.sys.safemode置1,之后会进行一些关机前的预处理,关闭ActivityManager以及MountService,最终调用rebootOrShutdown进行关机操作。
rebootOrShutdown函数中如果确认重启,则调用PowerManagerService的lowLevelReboot函数,参数就是传递下来的reason。如果不是重启,即mReboot=false,那就是需要关机了,在shutdown函数中就能够知道。关机的时候需要震动,就是这里了SHUTDOWN_VIBRATE_MS,默认的定义是500ms。
但是在代码上看,无论如何,最后都会调用一下lowLevelShutdown函数,也就是关机。逻辑上,这里可能是个问题,但是实际中,如果重启操作能够调用成功的话,整个系统都重启了,后边的代码当然不可能执行到了。
5、lowLevelReboot和lowLevelShutdown路径
frameworks/base/services/java/com/android/server/power/PowerManagerService.java
。
。
。
6、下面看看kernel中怎么执行的
kernel/sys.c
。。。
在此函数中,首先会检测权限问题,只有超级用户才可以执行关机重启系统的操作。
重启调用的是kernel_restart,区别是参数是不是空,关机则调用kernel_power_off()。继续跟下去一目了然,我这里就不详细说了,有兴趣的同仁可以参考一下这个:
/s/blog_6695f9eb0101hse4.html