使用的源码:
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来处理
总结: