Android系统启动流程浅析

Android系统中的两个重要服务PackageManagerService和ActivityManagerService,都是由SystemServer进程来负责启动的,而SystemServer进程本身是Zygote进程在启动的过程中fork出来的。
Android系统是基于Linux内核的,而在Linux系统中,所有的进程都是init进程的子孙进程,也就是说,所有的进程都是直接或者间接地由 init进程fork出来的。

Zygote进程也不例外,它是在系统启动的过程,由init进程创建的。在系统启动脚本system/core /rootdir/init.rc文件中,
  1. service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server  
  2.     socket zygote stream 666  
  3.     onrestart write /sys/android_power/request_state wake  
  4.     onrestart write /sys/power/state on  
  5.     onrestart restart media  
  6.     onrestart restart netd 
  前面的关键字service告诉init进程创建一个名为"zygote"的进程,这个zygote进程要执行的程序是/system/bin/app_process,后面是要传给app_process的参数。
 
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文件中:
 由于我们在init.rc文件中,设置了app_process启动参数 --zygote和--start-system-server,因此,在app_main.cpp的main函数里面,最终会执行下面语句:
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) {
  1. /* start the virtual machine */  
  2.     if (startVm(&mJavaVM, &env) != 0)  
  3.         goto bail;
  1. if (startReg(env) < 0) {  
  2.         LOGE("Unable to register all android natives\n");  
  3.         goto bail;  
  4.     } 

         } 
这个函数的作用是启动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应用程序框架层的其它进程的创建和启动工作。

        2. Zygote进程会首先创建一个SystemServer进程,SystemServer进程负责启动系统的关键服务,如包管理服务PackageManagerService和应用程序组件管理服务ActivityManagerService。

        3. 当我们需要启动一个Android应用程序时,ActivityManagerService会通过Socket进程间通信机制,通知Zygote进程为这个应用程序创建一个新的进程。Activity.startActivity()方法最终是通过代理类和Binder机制,在ActivityManagerService.startActivity方法中执行的。那么在ActivityManagerServicestartActivity中!

  1. 在android中SystemService的启动是在Zygote进程创建好后进行的,并且由Zygote进程建立好 DVM运行环境,加载ZygoteInit的main函数,最终调用Zygote的本地方法forkSystemServer,并执行linux的 fork方法创建SystemServer进程。
  2. 应用程序的进程也是由Zygote创建的,在 ActivityManagerService中的startProcessLocked中调用了Process.start()方法。并通过连接调用 Zygote的native方法forkAndSpecialize,执行fork任务。
  3. 应用进程和服务进程位于不同的进程中,他们之间是通过IPC进行数据传递的。



猜你喜欢

转载自blog.csdn.net/chi_wy/article/details/47169257