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等等等。
相关文章推荐
- Zygote进程功能笔记
- [笔记]Android系统进程Zygote启动过程的理解
- 【功能笔记】Ubuntu查看系统资源占用(内存,cpu和进程) {转载}
- 笔记:Zygote和SystemServer进程启动过程
- Zygote进程的启动、功能
- 【学习笔记⑦】登录页面怎样实现验证码登录功能
- 学习Android推送功能笔记(5)---Mina初体验
- 学习笔记之rpm程序包管理功能解析
- node.js学习笔记(3)-node.js结合mysql数据库实现的web项目中常见功能--登录验证、session传值、拦截器、ajax传值等
- Android(java)学习笔记204:自定义SmartImageView(继承自ImageView,扩展功能为自动获取网络路径图片)
- Linux下学习守护进程的笔记
- 操作系统学习笔记------进程描述与进程状态变化
- Sprite3D学习笔记(一):3D模型的换装功能.
- wpf学习笔记-数据绑定功能总结
- [Android]笔记19:RatingBar的功能与用法
- JAVA学习笔记(Eclipse常用功能)
- UE4 创建进程,打开额外程序 方法 笔记
- Ubuntu_进程操作学习笔记
- 笔记关闭fn功能
- java se 进程笔记