Android系统--Zygote

Zygote的作用

由Zygote孵化出所有的基于java虚拟机的实例Service。

 通过如下的图可以看出(通过adb shell ps查看和汇总Linux进程信息),

(1)第一个进程Init作为1号进程, 创建了536/537/538/539/540/541/542/543等一系列的进程。

(2)其中的541号进程,即是Zygote进程。

(3)Zygote进程创建了565/610/612/636/656/664/711等系列的进程,其中565即为System_server。

Zygote的启动流程

zygote是在init.rc中定义的一个服务进程。system\core\rootdir\init.rc的关键信息:

service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server
    class main
    socket zygote stream 660 root system
    onrestart write /sys/android_power/request_state wake
    onrestart write /sys/power/state on
    onrestart restart media
    onrestart restart netd

服务名称为:zygote

启动该服务执行的命令: /system/bin/app_process

命令的参数: -Xzygote /system/bin –zygote –start-system-server

socket zygote stream 660创建一个名为:/dev/socket/zygote 的 socket, 类型为:stream,权限为:660

onrestart:当服务重启时,执行该关键字后面指定的Command。

zygote进程的程序入口:

通过app_process 可执行文件的名称,找到frameworks\base\cmds\app_process\Android.mk文件,其中定义了app_process可执行文件编译相关参数,由此在frameworks\base\cmds\app_process目录下找到了frameworks/base/cmds/app_process/app_main.cpp源代码文件,其中的main函数即为Zygote进程的入口。

zygote进程的main函数

将init.rc中指定的-Xzygote参数传给JVM。

将进程的名字改为zygote。 

执行AppRuntime类的start()方法,runtime.start(“com.android.internal.os.ZygoteInit”, true)。

runtime.start函数,即在frameworks\base\core\jni\AndroidRuntime.cpp文件中实现具体的处理逻辑,其中有两个关键处理逻辑:

(1)AndroidRuntime::startVm()中,设置一些虚拟机的参数后,通过JNI_CreateJavaVM()启动虚拟机。

(2)env->CallStaticVoidMethod,调用ZygoteInit类的main()方法,正式进入到Java世界。

Java世界

ZygoteInit类的main()方法:

(1)registerZygoteSocket,创建Socket服务端对象sServerSocket。

(2)调用startSystemServer方法启动系统服务system_server。

(3)runSelectLoopMode监听和处理sServerSocket的Socket请求。

ZygoteInit类的main()方法中首先会创建Socket服务端对象sServerSocket,最后调用runSelectLoopMode方法,监听和处理sServerSocket请求。其中关键的代码详情如下:

while (true) {
    try {
        fdArray = fds.toArray(fdArray);
        index = selectReadable(fdArray);//多路Select,响应Socket请求
    } catch (IOException ex) {
        throw new RuntimeException("Error in select()", ex);
    }
  
     done = peers.get(index).runOnce();
}

runSelectLoopMode中while(true)循环,接收到Socket请求后,会fork出子进程,子进程调用handleChildProc方法,最终抛出RuntimeInit.invokeStaticMain异常,退出while(true)循环,进入到android.app.ActivityThread类的main方法执行;父进程调用handleParentProc方法,再次进入runSelectLoopMode中while(true)循环,准备接收下一个的请求事件。

handleChildProc进行子进程的后续处理见调用堆栈:

at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601) at com.android.internal.os.RuntimeInit.invokeStaticMain(RuntimeInit.java:222) at com.android.internal.os.RuntimeInit.applicationInit(RuntimeInit.java:307) at com.android.internal.os.RuntimeInit.zygoteInit(RuntimeInit.java:269) at com.android.internal.os.ZygoteConnection.handleChildProc(ZygoteConnection.java:842) at com.android.internal.os.ZygoteConnection.runOnce(ZygoteConnection.java:249) at com.android.internal.os.ZygoteInit.runSelectLoopMode(ZygoteInit.java:654) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:547) at dalvik.system.NativeStart.main(Native Method)

ZygoteInit类中的main方法中捕获MethodAndArgsCaller异常,并调用异常对象的run方法。即android.app.ActivityThread类的main方法,开始Activity的创建流程。

Zygote分裂的第一个进程system_server

system_server进程的启动入口在ZygoteInit.java 文件中的startSystemServer方法,有两个关键点:

(1)forkSystemServer,调用Native方法fork子进程。

(2)通过forkSystemServer方法返回的值,进入两个分支处理:父进程返回true值,进入到ZygoteInit类中的main方法继续处理;而子进程调用handleSystemServerProcess方法,最终会运行system_server。

跟踪handleSystemServerProcess的后续处理,发现在com.android.internal.os.RuntimeInit类中的invokeStaticMain方法,抛出了throw new ZygoteInit.MethodAndArgsCaller(m, argv),异常一层一层上抛,结果在ZygoteInit类中的main方法中捕获此异常,并且调用MethodAndArgsCaller对象的run方法,将调用com.android.server.SystemServer类中的main方法。

Zygote总结

(1)启动zygote,进入java世界

(2)创建第一个system_server

(3)Zygote服务端监听fork子进程请求

 

  • 17
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bright_Han

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值