分享

Zygote进程功能笔记

 James130 2015-11-04

1,调用startVm创建Java虚拟机和Java的环境在c空间的引用。主要函数在AndroidRuntime::startVm中,首先分配Java虚拟机的堆大小,其次调用JNI_CreateJavaVM创建Java虚拟机。

2,注册一些初始化所需要的JNI函数,这些函数在Java空间被声明为native的。

3, 通过JNI的GetStaticMethodID得到ZygoteInit的main函数,并通过CallStaticVoidMethod调用,进入 Java世界。如果把Java虚拟机看做是一个模块(函数),前面的startVm相当于把模块载入内存,GetStaticMethodID对应得到模 块句柄(函数地址),CallStaticVoidMethod对应启动模块(调用模块入口函数),由此,解释器开始解释执行Java字节码。 ZygoteInit主要的工作都在ZygoteInit的main函数里。此函数完成以下功能:

       a,注册socket,创建Zygote的服务器端,用来监听客户端的请求

       b,加载类和资源,许多应用程序用到的类,需要提前加载,这样应用程序会较快启动,但是开机却慢了。首先得到VMRuntime变量,读取PRELOADED_CLASSES变量,得到要加载的类名字,通过Java反射一个个加载。

       c,调用startSystemServer启动system_server子进程,实质是调用了fork

       d,进入runSelectLoopMode()循环,通过select监听a中的socket端口,处理请求。


关于system_server进程功能,system_server并没有加载新的文件,而是分支执行了不同的函数:handleSystemServerProcess,父进程的一些变量仍然在system_server进程中有意义。

1,创建Process State即Binder对象容器,并启动一个新线程用来和其他进程通信。

2,通过抛出异常的方式调用SystemServer(Java空间)类的main方法。重点分析本方法:

       a,装载android_servers.so

       b,初始化SurfaceFlinger服务

       c,启动一个ServerThread线程,创建电池、电源、看门狗、窗口管理、Activity管理等服务基础。

       d,加入Binder通信体系中。

可见Zygote是通过socket通信,而system_server却是通过Binder通信。

假如一个应用(进程)通过startActivity来 启动一个Activity(进程),会通过BInder通信调用ActivityManagerService,首先调用 startProcessLocked函数,一步步执行,产生一个LocalSocket套接口,作为客户端链接到Zygote。Zygote进程收到请 求后,调用Zygote.forkAndSpecialize方法产生一个新进程,新进程分支执行RuntimeInit的zygoteInit函数,初 始化一些变量后,最终调用新Activity所在的ActivityThread.main函数,然后进入了Activity的onCreate等等等。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多