38.Activity启动流程
image.png
/**
- TODO Activity启动流程
- https://blog.csdn.net/u012267215/article/details/91406211
- https://www.jianshu.com/p/274ccb315a7a
- https://blog.csdn.net/nnmmbb/article/details/103635991
Android系统启动过程
从开机启动到home launcher:
1.启动bootloader
2.加载系统内核
3.启动init进程
4.启动Zygote进程
5.启动Runtime进程
6.启动本地服务(SystemService)
7.启动HomeLauncher
启动bootloader
加载系统内核
[https://www.nowcoder.com/discuss/220281?type=2]
启动init进程
当系统内核加载完成后,会首先启动init守护进程,它是内核启动的第一个用户进程,进程号总是1,init进程启动完成之后还负责启动一些其他的重要守护进程,包括:
Usbd进程 usb daemon:usb连接后台进程,负责管理usb连接。
adbd进程 android debug bridge daemon:adb连接后台进程,负责管理adb连接。
debuggerd进程 debugger daemon:调试器后台进程,负责管理调试请求及调试流程。
rild进程 radio interface layer daemon:无限接口层后台进程,负责管理无线通信服务。
启动zygote进程
init进程和一些重要的守护进程启动完成后,系统启动Zygote进程,
-
进程:Android系统为每个APP分配至少一个进程
-
IPC:跨进程通信,Android中采用Binder机制。
-
Activity启动主要分为两种:
-
一种是启动正在运行的app的activity,即启动子activity,如无特殊声明
-
默认和启动该activity在同一进程,如果声明一个新的进程中,则
-
处于两个进程。
-
一种是打开新的app 即为launcher启动新的activity
-
后边启动Activity的流程是一样的,区别是前边判断进程是否存在的那部分。
-
init进程:
-
init进程是所有Linux程序的起点,是Zygote进程的父进程,
-
解析init.rc孵化出Zygote进程。
-
Android是基于linux系统的,手机开机之后,linux内核进行加载。加载完成之后会启动init进程。
-
init进程会启动ServiceManager,孵化一些守护进程,并解析init.rc孵化Zygote进程。
-
Zygote进程:
-
Zygote是所有java进程的父进程。
-
所有的app进程都是通过Zygote进程fork生成的。
-
Zygote初始化后,会注册一个等待接受消息的socket,OS层会采用socket进行IPC通信。
-
为什么是Zygote来孵化进程,而不是新建进程呢?
-
每个应用程序都是运行在各自的Dalvik虚拟机中,应用程序每次运行都要重新初始化和启动虚拟机,
-
这个过程会耗费很长时间。Zygote会把已经运行的虚拟机的代码和内存信息共享,
-
起到一个预加载资源和类的作用,从而缩短启动时间。
-
SystemServer进程:
-
SystemServer进程是Zygote孵化出的第一个进程。
-
SystemServer负责启动和管理整个java framework。包含AMS和PMS等服务
-
Launcher进程:Zygote进程孵化出的第一个app进程是Launcher进程。
-
SystemServer,Zygote,ServiceManager启动顺序:
-
ServiceManager最先启动,Zygote再启动,最后启动SystemServer。
-
SystemManager功能:提供binder通讯服务。
-
Zygote功能:创建java进程。
-
SystemServer是一个功能集合,提供serviceManager的binder通讯功能给开发者,
-
同时通过binder功能和实际的主体服务通讯完成功能;
-
整体来说SystemServer就是一个代理者,可以调用系统各个模块的功能,
-
同时使得系统各个模块的功能可以有条不紊的运行。
-
SystemServer在启动过程中使用SystemServiceManager启动了很多systemService,
-
并且将这些systemService添加到了serviceManager中。
-
流程:
-
1.点击桌面App图标,Launcher进程采用Binder IPC向system_server进程发起startActivity请求;
-
2.system_server进程接收到请求后,向zygote进程发送创建进程的请求;
-
3.Zygote进程fork出新的子进程,即App进程;
-
4.App进程,通过Binder IPC向sytem_server进程发起attachApplication请求;
-
5.system_server进程在收到请求后,进行一系列准备工作后,
-
再通过binder IPC向App进程发送scheduleLaunchActivity请求;
-
6.App进程的binder线程(ApplicationThread)在收到请求后,
-
通过handler向主线程发送LAUNCH_ACTIVITY消息;
-
7.主线程在收到Message后,通过反射机制创建目标Activity,并回调Activity.onCreate()等方法。
*/
https://blog.csdn.net/myth13141314/article/details/82595529
startActivity 调用startActivityForResult,
Activity、ActivityThread、ApplicationThread、ActivityManagerService。
ActivityManagerService做好自己的事儿以后,就会调用我们传过去的Binder对象ApplicationThread的scheduleLaunchActivity来将进程切换到当前应用的进程
由于ApplicationThread是一个Binder,所以scheduleLaunchActivity是运行在Binder线程池中的,需要通过Handler将线程切换到ActivityThread的线程中去
Activity里可以找到ActivityThread和H,ActivityThread的内部类ApplicationThread 就是个Binder,用于和ActivityManagerService的进程间通信.供后面从ActivityManagerService的进程回调到应用的进程
ActivityManagerService是系统的一个服务,用于管理Activity的状态和相关信息,比如任务栈等.
ActivityThread是启动Activity的处理者,也是一个中间人的角色,通过调用其他几个类完成启动Activity的任务。它首先通过Binder机制调用ActivityManagerService完成Activity相关的系统级的操作,比如任务栈,暂停其他Activity等,然后通过内部的Binder类ApplicationThread接收ActivityManagerService的进程间请求,将启动的操作重新转回到当前应用进程。接着通过调用Instrumentation和LoadApk的相关方法完成加载Activity类和Application的任务。最后调用Activity的attach方法完成一系列的绑定操作。