Android开发:System Server 分析

SystemServer 是 Android JAVA 层的系统服务模块,这个模块主要功能就是管理供 Android 应用开发的 system service.

1.SystemServer 类是如何启动的

让我们从 Android 的启动过程看起,查看 init.rc 文件,就会发现下面这一行

service zygote /system/bin/app_process -Xzygote /system/bin --zygote –start-system-server

我们知道 zygote 进程是整个 Android 的孵化器进程,所有的 Activity 进程均是通过它来生成的。我们发现在 zygote 进程启动过程中指定了这么一个参数“– start-system-server” ,这个参数就是在 zygote 进程启动的同时启动 SystemServer 。

那么 SystemServer 是以什么样的形式启动的呢?是单独的一个进程还是线程,分析一下 zygote 进程的启动过程就明白了。在 Android 中 zygote 进程启动其实就是启动 /system/bin/app_process 这个进程,这个进程的源代码在 frameworks/base/cmds/app_process/app_main.cpp 中。

  1. if (0 == strcmp("--zygote", arg)) {  
  2.             bool startSystemServer = (i < argc) ?  
  3.                     strcmp(argv[i], "--start-system-server") == 0 : false;  
  4.             setArgv0(argv0, "zygote");  
  5.             set_process_name("zygote");  
  6.             runtime.start("com.android.internal.os.ZygoteInit",  
  7.                 startSystemServer);  
  8.         } else {  
  9.             set_process_name(argv0);  
  10.             runtime.mClassName = arg;  
  11.             // Remainder of args get passed to startup class main()   
  12.             runtime.mArgC = argc-i;  
  13.             runtime.mArgV = argv+i;  
  14.             LOGV("App process is starting with pid=%d, class=%s./n",  
  15.                  getpid(), runtime.getClassName());  
  16.             runtime.start();  
  17.         }     

由于 zygote 进程启动过程有“ --zygote” 这个参数,所以走的是下面这步

runtime.start("com.android.internal.os.ZygoteInit",startSystemServer);

查看对象 runtime 的类型的定义,

class AppRuntime : public AndroidRuntime

因此查看 AndroidRuntime 的 start 方法中的一段代码 (frameworks/base/core/jni/AndroidRuntime.cpp)

  1. startClass = env->FindClass(slashClassName);  
  2.     if (startClass == NULL) {  
  3.         LOGE("JavaVM unable to locate class '%s'/n", slashClassName);  
  4.         /* keep going */  
  5.     } else {  
  6.         startMeth = env->GetStaticMethodID(startClass, "main",  
  7.             "([Ljava/lang/String;)V");  
  8.         if (startMeth == NULL) {  
  9.             LOGE("JavaVM unable to find main() in '%s'/n", className);  
  10.             /* keep going */  
  11.         } else {  
  12.             env->CallStaticVoidMethod(startClass, startMeth, strArray);  
  13. #if 0   
  14.             if (env->ExceptionCheck())  
  15.                 threadExitUncaughtException(env);  
  16. #endif   
  17.         }  
  18.     }  

其中 startClass 即为 "com.android.internal.os.ZygoteInit" ,这段代码调用了 com.android.internal.os.ZygoteInit 的 main 函数。