美文网首页
38.Activity启动流程

38.Activity启动流程

作者: SlideException | 来源:发表于2020-08-06 10:28 被阅读0次
image.png
image.png

/**

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方法完成一系列的绑定操作。

相关文章

网友评论

      本文标题:38.Activity启动流程

      本文链接:https://www.haomeiwen.com/subject/bxhrrktx.html