zygote和system_server分析

使用的源码:

 framework\base\cmds\app_process\App_main.cpp

  framework\base\include\android_runtime\AndroidRuntime.h

  framework\base\core\jni\android_debug_JNITest.cpp 

  framework\base\core\java\com\android\internal\os\ZygoteInit.java 

 framework\base\core\java\com\android\internal\os\RuntimeInit.java 

 framework\base\services\java\com\android\server\SystemServer.java 

 framework\base\services\jni\com_android_server_SystemServer.cpp

 framework\base\cmds\system_server\library\System_init.cpp 

framework\base\services\java\com\android\server\Watchdog.java 

framework\base\services\java\com\android\server\am\ActivityManagerService.java 

framework\base\core\java\android\os\Process.java

framework\base\core\java\com\android\internal\os\ZygoteConnection.java 


问题:

1. Java 世界是什么时候创建的?

2. “进程”是怎么创建和运行的?

3. 经常使用的系统service在哪里?


以上问题都牵扯到zygote和system_server这两个进程,这两个进程分别是Java世界的半边天,任何一个进程的死亡,都会导致Java世界崩溃


Zygote分析:

zygote是一个Native的应用程序,与驱动,内核等均无关系。

zygote最初的名字叫"app_process" ,这个名字是在Android.mk文件中指定的,但在运行过程中,app_process通过Linux下的pctrl系统调用将自己的名字换成"zygote"

它的原型app_process所对应的源文件是App_main.cpp



可以看到,重要功能是由AppRuntime的start来完成的。


AppRuntime分析:

AppRuntime类的声明和实现均在App_main.cpp中,它是从AndroidRuntime类派生出来的。下面显示了这两个类的关系和一些重要函数:


AppRuntime重载了onStarted,onZygoteInit和onExit函数。

前面调用了AndroidRuntime的start函数,这个start函数使用的是基类的AndroidRuntime的start。现在看下:




上面标识的1,2,3共同组成了开创Android系统的Java世界的三部曲

1. StartVm 调用JNI的虚拟机创建函数,但是创建虚拟机时的一些参数却是startVm中确定的。





注册JNI函数:startReg:

给虚拟机注册一些JNI函数,正式因为后续Java世界用到的一些函数采用native方式实现,所以必须提前注册这些函数:



上面的函数调用的是数组元素的mProc函数,我们再看看这个全局数组的gRegJNI变量:


REG_JNI是一个宏,宏里面包括的就是那个mProc函数。下面分析一个例子:


现在虚拟机已经创建好,JNI函数也已经注册,下一步要分析CallStaticVoidMethod了。通过这个函数,将进入Android精心打造的Java的世界。


Welcome to Java World:

这个Java世界的入口在哪里?根据前面的分析可知:CallStaticVoidMethod最终调用com.android.internal.so.ZygoteInit的main函数。下面看看这个入口函数:




上面列举除了5大关键点(1 - 5)下面一一分析

1.registerZygoteSocket 建立IPC 通信服务端

zygote及系统中其他程序的通信没有使用Binder,而是采用了AF_UNIX类型的Socket,该函数的使用就是建立这个Socket



2. 预加载类和资源

preloadClasses 

proloadResources


preloadClasses会用coolfind工具程序在framwork中搜索名为“preloaded-classes”的文件,最后会在framework/base目录下找到。它是一个文本文件,内容如下:


preload_class文件由framework/base/tools/preload工具生成,它需要判断每个类加载的时间是否大于1250ms,超过这个时间的类就会被写道preload-classes文件中,最后由zygote预加载。

preloadResources和preloadClass类似。它主要加载framework-res.apk中的资源。

在UI编程中常使用的com.android.R.XXX资源是系统默认的资源,他们就是由zygote加载的。


3. 启动system_server

这是要分析的第三个关键点:startSystemServer。这个函数会创建Java世界中系统Service所驻留的进程system_server.该进程是framework的核心。如果它死了,就会导致zygote自杀。

这个核心进程是如何启动的?


这里zygote进行了一次无性繁殖,分裂出了一个system_server进程


4. runSelectLoopMode 有求必应之等待请求:


这个函数作用:

1.处理客户连接和客户请求,其中客户在zygote中用ZygoteConnection对象来表示

2. 客户的请求由ZygoteConnection的runOnce来处理


总结:




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值