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等等等。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值