Android系统中的两个重要服务PackageManagerService和ActivityManagerService,都是由SystemServer进程来负责启动的,而SystemServer进程本身是Zygote进程在启动的过程中fork出来的。
Android系统是基于Linux内核的,而在Linux系统中,所有的进程都是init进程的子孙进程,也就是说,所有的进程都是直接或者间接地由 init进程fork出来的。
Zygote进程也不例外,它是在系统启动的过程,由init进程创建的。在系统启动脚本system/core /rootdir/init.rc文件中,
由于我们在init.rc文件中,设置了app_process启动参数
--zygote和--start-system-server,因此,在app_main.cpp的main函数里面,最终会执行下面语句:
Android系统是基于Linux内核的,而在Linux系统中,所有的进程都是init进程的子孙进程,也就是说,所有的进程都是直接或者间接地由 init进程fork出来的。
Zygote进程也不例外,它是在系统启动的过程,由init进程创建的。在系统启动脚本system/core /rootdir/init.rc文件中,
- service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server
- socket zygote stream 666
- 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了,它的源代码位于frameworks/base/cmds/app_process/app_main.cpp文件中,
入口函数是main这个函数的主要作用就是创建一个AppRuntime变量,然后调用它的start成员函数
AppRuntime 它约继承于AndroidRuntime类, AndroidRuntime类定义在frameworks/base/core/jni/AndroidRuntime.cpp文件中:
AppRuntime 它约继承于AndroidRuntime类, AndroidRuntime类定义在frameworks/base/core/jni/AndroidRuntime.cpp文件中:
int main(int argc, char* const argv[])
{
r
untime.start("com.android.internal.os.ZygoteInit",
.........
startSystemServer ? "start-system-server" : "");
...............
}
这里的参数
startSystemServer为true,表示要启动SystemServer组件。由于AppRuntime没有实现自己的start 函数,它继承了父类AndroidRuntime的start函数,因此,下面会执行AndroidRuntime类的start函数。这个函数定义在frameworks/base/core/jni/AndroidRuntime.cpp文件中:
void AndroidRuntime::start(const char* className, const bool startSystemServer)
{
- /* start the virtual machine */
- if (startVm(&mJavaVM, &env) != 0)
- goto bail;
- if (startReg(env) < 0) {
- LOGE("Unable to register all android natives\n");
- goto bail;
- }
}
这个函数的作用是启动Android系统运行时库,它主要做了三件事情,一是调用函数startVM启动虚拟机,二是调用函数startReg注册JNI方法,三是调用了com.android.internal.os.ZygoteInit类的main函数。
这个函数定义在frameworks/base/core/java/com/android/internal/os/ZygoteInit.java文件中:
它主要作了三件事情,
一个调用registerZygoteSocket函数创建了一个socket接口,用来和 ActivityManagerService通讯,二是调用startSystemServer函数来启动SystemServer组件,三是调用 runSelectLoopMode函数进入一个无限循环在前面创建的socket接口上等待ActivityManagerService请求创建新的 应用程序进程。
1. 系统启动时init进程会创建Zygote进程,Zygote进程负责后续Android应用程序框架层的其它进程的创建和启动工作。
1. 系统启动时init进程会创建Zygote进程,Zygote进程负责后续Android应用程序框架层的其它进程的创建和启动工作。
2. Zygote进程会首先创建一个SystemServer进程,SystemServer进程负责启动系统的关键服务,如包管理服务PackageManagerService和应用程序组件管理服务ActivityManagerService。
3. 当我们需要启动一个Android应用程序时,ActivityManagerService会通过Socket进程间通信机制,通知Zygote进程为这个应用程序创建一个新的进程。Activity.startActivity()方法最终是通过代理类和Binder机制,在ActivityManagerService.startActivity方法中执行的。那么在ActivityManagerService的startActivity中!
- 在android中SystemService的启动是在Zygote进程创建好后进行的,并且由Zygote进程建立好 DVM运行环境,加载ZygoteInit的main函数,最终调用Zygote的本地方法forkSystemServer,并执行linux的 fork方法创建SystemServer进程。
- 应用程序的进程也是由Zygote创建的,在 ActivityManagerService中的startProcessLocked中调用了Process.start()方法。并通过连接调用 Zygote的native方法forkAndSpecialize,执行fork任务。
- 应用进程和服务进程位于不同的进程中,他们之间是通过IPC进行数据传递的。