您的位置:首页 > 编程语言 > Go语言

Zygote进程功能笔记

2013-05-22 15:52 267 查看

Zygote进程功能笔记

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等等等。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android zygote