Android

Android开机启动过程

2018-03-08  本文已影响48人  三十二蝉
Android开机图解.png Android开机图解2

Android系统启动过程

init进程

init进程是Android系统启动的第一个进程。
init进程main方法做了如下工作:

zygote进程

Zygote初始化时会创建创建虚拟机,同时把需要的系统类库和资源文件加载到内存里面。Zygote fork出子进程后,这个子进程也继承了能正常工作的虚拟机和各类系统资源,接下来子进程只需要装载APK文件的字节码文件就可以运行了。这样应用程序的启动时间就会大大缩短。
Zygote创建应用程序时却只使用了fork,没有调用exec。Android应用中执行的是Java代码,Java代码的不同才造成了应用的区别,而对于运行Java的环境,要求却是一样的。如下图:


Zygote进程load Apk应用

Zygote进程创建AppRuntime对象。
AndroidRuntime类是安卓底层系统超级重要的一个类,它负责启动虚拟机以及Java线程。AndroidRuntime类是在一个进程中只有一个实例对象,并将其保存在全局变量gCurRuntime中。

AndroidRuntime类的start函数其实主要就是做了3件事情:

在AndroidRuntime中又创建了一个Runtime实例(Runtime在ART中代表Java的运行时环境。一个进程只有一个ATR虚拟机,一个ART虚拟机只有一个Runtime)。

在Runtime(Java运行时环境)准备完毕之后,Zygote会调用Java的初始化代码做如下工作:

预加载系统类和资源

预加载过程:

zygote启动过程总结

SystemServer

SystemServer是Android系统的核心之一,大部分Android提供的服务都运行在这个进程里,SystemServer中运行的服务总共有60多种。为了防止应用进程对系统造成破坏,Android的应用进程没有权限直接访问设备的底层资源,只能通过SystemService中的代理访问。通过Binder,用户进程在使用SystemService中的服务并没有太多不便变之处。

SystemServer的主要工作如下:

初始化系统上下文——createSystemContext()方法解析
创建SystemServiceManager

把SystemServiceManager放到LocalServicesd的sLocalServiceObjects中,其中sLocalServiceObjects是一个ArrayMap。这样后面在通过类名,就可以找到SystemServiceManager的对象了。

启动各种服务
启动Launcher

SystemServer.java的startOtherServices()方法里面调用 mActivityManagerService.systemReady()方法,里面又会调用startHomeActivityLocked(mCurrentUserId, "systemReady");最后会调用startHomeActivity(Intent,ActivityInfo,String)方法。

总结

参考文献

Android启动流程系列

上一篇 下一篇

猜你喜欢

热点阅读