zoukankan      html  css  js  c++  java
  • Android 源码阅读笔记

    Zygote:

    1、Zygote 是系统启动之后创建的第二个进程
    2、Zygote 创建zygote Socket、虚拟机
    3、Zygote 在虚拟机中通过forkSystemServer, 创建Server进程, 并且在其中启动服务(AMS、PMS等)
    4、Zygote 在虚拟机中注册zygote套接字,循环监听AMS的请求,创建新的进程

    Server: (PS:版本不同,创建服务的方法也有很大不同,以下为5.1.1版本)

    1、Zygote fork自己,为Server创建新的子进程之后,调用handleSystemServerProcess 来启动服务
    2、handleSystemServerProcess 方法接着调用了 invokeStaticMain方法启动了SystemServer的main方法
    3、在main方法中,调用 SystemServer 的run方法
    4、其中的 startBootstrapServices 、 startCoreServices 、startOtherServices 分别用来启动不同的服务(AMS、PMS、WMS、CS等)

    应用程序进程的创建:

    例如:启动一个新的App,或者在另外进程的Activity、Servicec
    1、ActivityManagerService创建Activity时,如果它所在的进程不存在,则调用startProcessLocked创建新的进程
    2、依次调用方法Process.start、 Process.statViaZygote、Process.openZygoteSocketIfNeeded、Process.zygoteSendArgsAndGetResult;
    3、在zygoteSendArgsAndgetResult中使用套接字连接到Zygote进程的LocalSocket,并且将创建进程的指令写入;并且读取创建进程成功后的pid

    在Zygote进程中
    1、runSelectLoop方法中循环监听套接字
    2、收到指令,调用runOnce方法处理请求
    3、在runOnce中调用Zygote.forkAndSpecialize方法来创建进程,然后调用handleChildProc启动进程。
    4、最终调用ZygoteInit.invokeStaticMain方法,启动ActivityThread的main方法

     Binder线程池的启动:

    1、进程创建成功依次调用zygoteInit、nativeZygoteInit、com_android_internal_os_RuntimeInit_nativeZygoteInit、onZygoteInit(位于AppRuntime 中)
    2、Zygote进程启动的时候,会在进程中创建一个AppRuntime对象,故每一个新创建的进程都有一个该对象
    3、onZygoteInit 中, 使用ProcessState中的startThreadPool启动Binder线程池

    消息循环的建立:

    1、进程创建成功之后,会使用invokeStaticMain方法调用ActivityThread的main方法
    2、通过抛出异常MethodAndArgsCaller,在ZygoteInit.main方法的异常捕获中执行反射调用main方法

    小结:

    1、Zygote是一个进程,它有自己的虚拟机
    2、AMS、WMS、PMS等在一个进程,运行在虚拟机中,由Zygote创建
    3、Zygote 用来接收AMS的指令,创建新的进程

    4、通过脚本启动init进程
    5、init进程中fork出一个子进程zygote
    6、在zygote进程中创建虚拟机
    7、在zygote的虚拟机中创建创建服务进程(Zygote.forkSystemServer--》Zygote.nativeForkSystemServer)
    8、在服务进程中启动服务:ZygoteInit.handleSystemServerProcess-->RuntimeInit.zygoteInit方法启动binder线程池(启动SystemServer.main、启动AMS、WMS等)
    9、在zygote虚拟机中启动循环监听本地zygote套接字
    10、zygote进程,接收到创建进程的命令,通过Zygote.forkAndSpecialize-->Zygote.nativeForkAndSpecialize创建进程;创建之后通过ZygoteConnection.handleChildProc--》RuntimeInit.zygoteInit(创建Binder线程池、调用ActivityThread.main)
    11、RuntimeInit.zygoteInit会根据传入的参数不同,启动不同的类的main方法,来实现不同的功能,相同点是它都会创建一个binder线程池, 所以不管是服务进程还是应用程序进程都包含有binder线程池,都可以通过binder进行进程间通讯。
  • 相关阅读:
    Windows下tomcat进程监控批处理程序
    centos下利用mail命令进行邮件发送
    centos查看是否安装了某个软件
    tomcat监控,自动重启shell脚本
    mac终端命令大全介绍
    文件的编码是一个怎样的机制
    python中nltk的下载安装方式
    MySQL——修改root密码的4种方法(以windows为例)
    VNC轻松连接远程Linux桌面
    Linux 查看磁盘分区、文件系统、磁盘的使用情况相关的命令和工具介绍
  • 原文地址:https://www.cnblogs.com/lipeil/p/4900380.html
Copyright © 2011-2022 走看看