zygote和system server启动过程解析

Zygote的启动过程解析。android

Zygote其实是一个用户态应用程序,由启动脚本负责启动。在启动脚本中Zygote叫作app_process。下面分析app_main.cpp中的启动Zygote的过程。服务器

mainapp

    |__设置runtimemParentDir/usr/binmArgCzygote参数个数,mArgVzygote参数(-Xzygote /system/bin --zygote --start-system-serversocket

    |__runtime.startAndroidRuntime::start函数

            |__设置环境变量ANDROID_ROOToop

            |__startVm():启动VMui

                    |__设置启动虚拟机参数,如:checkjni,进程堆大小16MB编码

                    |__调用JNI_CreateJavaVM()启动虚拟机,以后JavaVM和虚拟机主线程的JNIEnv变量有效spa

            |__startReg():向虚拟机主线程注册JNI线程

            |__com.android.internal.os.ZygoteInit.main(从JNI调用,今后进入JAVA世界)

                |__registerZygoteSocket():建立Zygote服务端本地socket,用于监听客户端的链接请求

                |__preloadClasses():预先加载preloaded-classes文件中指定的类(此过程耗时较大,好处是加快后续应用程序的启动)

                |__preloadResources():预先加载资源

                |__gc():手动执行一次垃圾回收

                |__startSystemServer():启动一个子进程来运行system_server

                        |__硬编码启动system_server时使用的参数

                        |__调用Zygote.forkSystemServer()建立子进程

                                |__调用forkAndSpecializeCommon()建立子进程(调用fork()建立子进程且设置子进程相关uidgid等属性)

                                |__对于建立子进程失败则直接将Zygote进程杀死(Zygote进程与system_server进程生死与共)

                                |__返回子进程ID

                        |__在子进程中调用handleSystemServerProcess()运行system_server

                                |__关闭父进程Zygote打开的本地服务端socket

                                |__执行RuntimeInit.zygoteInit()运行system_server

                                        |__调用AppRuntime::onZygoteInit()。其实是与binder创建联系

                                        |__调用invokeStaticMain()执行systemserver类的main函数

                                        |__调用Class.forName()根据类名反射出类对象

                                        |__调用类的getMethod()方法获取systemserver类的main方法

                                        |__调用ZygoteInit.MethodAndArgsCaller()抛出一个异常且该异常中包含systemserver类的main方法

            |__runSelectLoopMode():使用多路复用I/O机制监听链接到Zygote本地服务器的socket且执行响应处理

                    |__进入死循环监听Zygote本地服务端socket,当有客户端链接Zygote本地服务端socket后,调用ZygoteConnection.runOnce()执行该服务请求

                    |__ZygoteConnection.runOnce()

                            |__调用Zygote.forkAndSpecialize()函数建立一个子进程

                            |__在子进程中执行handleChildProc()处理客户端请求

                                        |__关闭父进程Zygote建立的服务端socket

                                        |__执行RuntimeInit.zygoteInit()运行客户端请求

                                                    |__调用AppRuntime::onZygoteInit()。其实是与binder创建联系

                                                    |__调用invokeStaticMain()执行客户端请求类的main函数

                                                    |__调用Class.forName()根据类名反射出类对象

                                                    |__调用类的getMethod()方法获取客户端请求类的main方法

                                                    |__调用ZygoteInit.MethodAndArgsCaller()抛出一个异常且该异常中包含客户端请求类的main方法

            |__MethodAndArgsCaller.run():在异常处理函数处,用于启动链接到Zygote服务器端socket的客户端程序以及system_server主函数。(Zygote处理链接端数据时在最后使用抛异常的机制运行客户端主函数)。

能够得出一个结论:system_server的启动过程和其余应用进程的启动过程是一致的,他们都是Zygote的子进程。

SystemServer启动解析

main

        |__System.loadLibrary(“android_servers”)加载JNI

        |__init1()执行init1JNI函数)

                |__执行system_init()

                        |__设置参数准备将system_server加入binder

                        |__调用执行Java代码的init2函数

                                |__建立一个线程执行android.server.ServerThread

                                        |__启动各类服务,如:电源管理、电池管理、蓝牙等

                                        |__等待新的服务请求。

                        |__最终将system_server添加到binder

当有新的服务请求到后,system_server会调用服务请求的处理函数作以下事情:

1)与Zygote本地服务端Socket创建链接;

2)将待执行的类名组成指定的格式发送给Zygote

3Zygote接收到客户端的请求后,调用ZygoteConnection.runOnce()执行该服务请求,即:建立一个子进程来运行指定类对象的main函数。

相关文章
相关标签/搜索