美文网首页
进程的启动 - 2.3

进程的启动 - 2.3

作者: Wi1ls努力努力再努力 | 来源:发表于2019-07-15 21:41 被阅读0次
    • Android 2.3下的虚拟机的 Dalvik 虚拟机,在 Zygote进程启动的时候初始化。
    • 中所周期 Android 中 Zygote进程作为孵化器,用 Linux 的 fork( )机制创建用户进程。
    • Dalvik 在初始化的时候,将自身的内存大致分为两块,一块是 Android 基本类的加载到 Dalvik 的内存,也是各进程共享的内存。也正是这个机制,使得子进程不需要重新将基础类加载在子进程中,做到了类的共享。另外一部分内存就是各个进程加载自身进程不同的类数据了。
    • 在 AMS 中,需要启动新的四大组件的时候,如果发现目标进程还未启动。则会调用 Process.start( )去通过 socket 机制与 Zygote 进程通信请求孵化一个子进程。
    • Process.start("android.app.Activity", mSimpleProcessManagement ? app.processName : null, uid, uid, gids, debugFlags, null);
    • 一连串的调用之后,会打开一个连接到 Zygote 的 Socket;随后将参数写入讯通到 Zygote。
    • Zygote 进程在启动之后,会在一个循环内监听这个 Socket,一旦有新的消息进来,便会调用 runOnce( )@ZygoteConnection;
    • 此时便从 AMS 进程到了 Zygote 进程。
    • 在 Zygote 进程内,先读出请求的参数,随后在底层调用 Linux 的 Fork( )机制创建子进程。
    • 随后在 Zygote 进程的返回写入子进程的 pid 传递给 AMS;
    • 在子进程的处理中,会调用 zygoteInitNative( )启动 Binder 线程池。将子进程入口函数即 main( )@ActivityThread 写入到一个异常 ZygoteInit.MethodAndArgsCaller 中,并且抛出。
    • 该异常会在ZygoteInit.java中捕获,同时执行 run( )@ZygoteInit.MethodAndArgsCaller 方法。
    • run( )@ZygoteInit.MethodAndArgsCaller 会反射调用参数构成的入口函数,即 main( )@ActivityThread。
    • 后面的流程就是很熟悉的了,创建消息循环,通知 AMS 进程启动。随后 AMS 根据启动进程前保留的信息执行四大组件的实例化过程并且与进程通信。

    • 在 SystemServer 进程启动后,会初始化 SurfaceFlinger 等 C层的服务,AMS,PMS,WMS,CS 等 Java 层的服务并且注册到 service_manager 中。于是就可以为系统提供基础服务了。

    相关文章

      网友评论

          本文标题:进程的启动 - 2.3

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