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 中。

if (0 == strcmp("--zygote", arg)) {               bool startSystemServer = (i < argc) ?                       strcmp(argv[i], "--start-system-server") == 0 : false;               setArgv0(argv0, "zygote");               set_process_name("zygote");               runtime.start("com.android.internal.os.ZygoteInit",                   startSystemServer);           } else {               set_process_name(argv0);               runtime.mClassName = arg;               // Remainder of args get passed to startup class main()                runtime.mArgC = argc-i;               runtime.mArgV = argv+i;               LOGV("App process is starting with pid=%d, class=%s./n",                    getpid(), runtime.getClassName());               runtime.start();           }     

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

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

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

class AppRuntime : public AndroidRuntime

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

startClass = env->FindClass(slashClassName);       if (startClass == NULL) {           LOGE("JavaVM unable to locate class '%s'/n", slashClassName);           /* keep going */       } else {           startMeth = env->GetStaticMethodID(startClass, "main",               "([Ljava/lang/String;)V");           if (startMeth == NULL) {               LOGE("JavaVM unable to find main() in '%s'/n", className);               /* keep going */           } else {               env->CallStaticVoidMethod(startClass, startMeth, strArray);   #if 0                if (env->ExceptionCheck())                   threadExitUncaughtException(env);   #endif            }       }  

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

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wwddps.html