前言

本文是本人通过学习各位前辈的博客,结合自己对Android的理解所作。如有错误,还请批评指正。

1.总的介绍

Android启动流程_初始化

几个注意点:

①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​​方法进行初始化。如图

Android启动流程_初始化_02


进入这个方法,会发现它调用了​​forkSystemServer​​方法。如图

Android启动流程_初始化_03


这样就开启了SystemServer

③AMS

AMS全称为“ActivityManagerService”,是一种服务即Service。是由Zygote进程fork出来的。负责系统中所有Activity的生命周期。在SystemServer进程开启的时候进行初始化。

如图,在SystemServer类的​​startBootstrapServices​​方法中,有

Android启动流程_android_04


从而在SystemServer中开启了这些服务

还有一个需要注意的点为:

App与AMS通过Binder进行IPC通信,AMS与zygote通过Socket进行IPC通信。

④Launcher进程

我对Launcher进程的理解是,它也是一个普通的App进程,只是它是一个系统级别的进程,可以管理手机上的App。比如它实现了点击,长按等回调接口,能实现开启一个App的功能。本质上还是调用了​​Activity.startActivity​​方法,并且因为设置了

Android启动流程_java_05


所以这个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方法

Android启动流程_main方法_06

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​​方法,从而完成启动

两部分的图:

Android启动流程_初始化


Android启动流程_android_08

补充:通信的具体角色

客户端向服务端(AMS)进行通信。

需要借助ActivityManagerProxy类,ActivityManagerProxy和AMS都需要实现IActivityManager接口。
客户端通过调用ActivityManagerProxy类,通过transact方法,调用到AMS的相应方法(Binder机制)

服务端(AMS)向客户端进行通信

服务端调用ApplicationThreadProxy类,再调用到ApplicationThread类,从而完成通信。ApplicationThreadProxy和ApplicationThread都实现了IApplicationThread接口