前言
本文是本人通过学习各位前辈的博客,结合自己对Android的理解所作。如有错误,还请批评指正。
1.总的介绍
几个注意点:
①idle是内核空间的鼻祖,init是用户空间的鼻祖。Zygote是Java进程的鼻祖
②Zygote既有native层,也有java层。
③JNI就是负责native层和java层的通信的,起到一个桥梁作用。
2.分别介绍各个角色
①init进程
init进程是Linux中的一个核心进程,在Linux中,所有的进程都是由init进程fork出来的,比如Zygote进程。
它完成的主要功能有:
①创建系统文件
②启动Zygote
②Zygote进程
在Android中,所有的进程(除了第一个Zygote进程)都是由第一个Zygote进程fork出来的。它完成的主要作用有
- 在native层
①初始化Android运行环境,比如虚拟机
②注册JNI
③执行ZygoteInit.main
方法,进入Java层 - 在Java层
①进行一些预加载的工作
②fork各种进程,如SystemServer进程
③创建socket,进入循环等待AMS的通知
③SystemServer
SystemServer也是由Zygote进程fork出来的一个进程。与Zygote一起构成了Framework层的两大非常重要的进程。
ActivityManagerService、PackageManagerService、WindowManagerService等都是在SystemService里面开启的。
那么SystemServer是如何被开启的呢?
在Zygote进程开启的时候,会调用ZygoteInit.main
方法进行初始化。如图
进入这个方法,会发现它调用了forkSystemServer
方法。如图
这样就开启了SystemServer
③AMS
AMS全称为“ActivityManagerService”,是一种服务即Service。是由Zygote进程fork出来的。负责系统中所有Activity的生命周期。在SystemServer进程开启的时候进行初始化。
如图,在SystemServer类的startBootstrapServices
方法中,有
从而在SystemServer中开启了这些服务
还有一个需要注意的点为:
App与AMS通过Binder进行IPC通信,AMS与zygote通过Socket进行IPC通信。
④Launcher进程
我对Launcher进程的理解是,它也是一个普通的App进程,只是它是一个系统级别的进程,可以管理手机上的App。比如它实现了点击,长按等回调接口,能实现开启一个App的功能。本质上还是调用了Activity.startActivity
方法,并且因为设置了
所以这个Activity会添加到一个新的Task栈中。
所以在Launcher中开启一个App,其实和在Activity中调用startActivity
开启一样,而且最终都会调用Activity.startActivityForResult()
⑤Instrumentation
每个Activity都持有Instrumentation对象的一个引用,但是整个进程只会存在一个Instrumentation对象。它意为“仪器”,完成对Application和Activity的初始化,以及生命周期的管理,是一个大管家。
⑥ActivityThread
它就是我们常说的UI线程,它的main
方法是App的入口,之前说App和AMS是通过Binder进行通信的,那么Activity就是负责与AMS的外交工作的。它与上面的Instrumentation的关系是:
ActivityThread主外,Instrumentation主内,ActivityThread对初始化以及生命周期的调用,最终都会调用到Instrumentation的相关方法。
另外,App开启消息循环,以及Application的创建,都是在ActivityThread类的main方法。
3.总结,启动的具体流程
①BootLoader启动kernel层的idle进程,然后启动init进程,进入native层。
②init进程启动zygote进程,进入java层
③zygote进程在native层完成xxx的工作,在Java层完成xxx的工作。
④zygote进程fork出SystemServer进程,SystemServer进程启动AMS,PMS,WMS等
⑤此时Android系统已经就绪,点击一个App,Launcher进程的ActivityManagerProxy会发送startActivity请求给AMS(通过Binder)
⑥AMS通过socket向Zygote发送创建进程的请求,Zygote就会fork出一个App进程
⑦App进程的ActivityManagerProxy向AMS发送attachApplication
的请求(通过binder),AMS调用ApplicationThreadProxy的realStartActivityLocked
方法。
⑧ApplicationThreadProxy向ApplicationThread发送scheduleLaunchActivity
(通过Binder)
⑨ApplicationThread向ActivityThread发送消息LAUNCH_ACTIVITY
⑩ActivityThread调用handlerLaunchActivity
方法,通过反射来创建目标Activity,并回调Activity.onCreate
方法,从而完成启动
两部分的图:
补充:通信的具体角色
客户端向服务端(AMS)进行通信。
需要借助ActivityManagerProxy类,ActivityManagerProxy和AMS都需要实现IActivityManager接口。
客户端通过调用ActivityManagerProxy类,通过transact方法,调用到AMS的相应方法(Binder机制)
服务端(AMS)向客户端进行通信
服务端调用ApplicationThreadProxy类,再调用到ApplicationThread类,从而完成通信。ApplicationThreadProxy和ApplicationThread都实现了IApplicationThread接口