美文网首页
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