Android系统启动时,Init进程会把Zygote进程启动起来,而Zygote进程会把System Server进程启动起来。
App_main.cpp int main(int argc, char* const argv[]) { //创建一个AppRuntime对象runtime,通过它进一步启动Zygote进程 AppRuntime runtime(argv[0], computeArgBlockSize(argc, argv)); // Parse runtime arguments. Stop at first unrecognized option. bool zygote = false; //参数列表中有--zygote,变量zygote置为ture zygote = true; //参数列表中增加start-system-server,表示Zygote进程启动完成后会启动System进程 args.add(String8("start-system-server")); //调用类AppRuntime的成员函数start,注意传进去的字符串是"com.android.internal.os.ZygoteInit" runtime.start("com.android.internal.os.ZygoteInit", args); }
//注意AppRuntime继承AndroidRuntime class AppRuntime : public AndroidRuntime { public: AppRuntime(char* argBlockStart, const size_t argBlockLength) //会创建AndroidRuntime : AndroidRuntime(argBlockStart, argBlockLength)
void AndroidRuntime::start(const char* className, const Vector<String8>& options) { //启动虚拟机实例 if (startVm(&mJavaVM, &env) != 0) { //注册JNI方法 if (startReg(env) < 0) { //调用com.android.internal.os.ZygoteInit类的静态成员函数main来进一步启动Zygote进程 //注意这时候从cpp转到了java env->CallStaticVoidMethod(startClass, startMeth, strArray); }
ZygoteInit.java public static void main(String argv[]) { //创建Server端Socket registerZygoteSocket(socketName); //启动系统关键服务进程System进程 startSystemServer(abiList, socketName); //循环等待Activity管理服务ActivityManagerService请求Zygote进行创建新的应用程序进程 runSelectLoop(abiList); }
private static void registerZygoteSocket(String socketName) { //获取名称为"ANDROID_SOCKET_zygote"的环境变量的值 String env = System.getenv(fullSocketName); //转化为文件描述符 fileDesc = Integer.parseInt(env); //创建Server端Socket sServerSocket = new LocalServerSocket( createFileDescriptor(fileDesc)); }
private static boolean startSystemServer(String abiList, String socketName) throws MethodAndArgsCaller, RuntimeException { //调用类Zygote的成员函数forkSystemServer来fork System Server进程 pid = Zygote.forkSystemServer( //在System Server子进程中 if (pid == 0) { //运行System Server进程 handleSystemServerProcess(parsedArgs); }
static JNINativeMethod gMethods[] = { //nativeForkSystemServer对应com_android_internal_os_Zygote_nativeForkSystemServer { "nativeForkSystemServer", "(II[II[[IJJ)I", (void *) com_android_internal_os_Zygote_nativeForkSystemServer } };
static jint com_android_internal_os_Zygote_nativeForkSystemServer( JNIEnv* env, jclass, uid_t uid, gid_t gid, jintArray gids, jint debug_flags, jobjectArray rlimits, jlong permittedCapabilities, jlong effectiveCapabilities) { //还没fork,估计也快了 pid_t pid = ForkAndSpecializeCommon(env, uid, gid, gids, debug_flags, rlimits, permittedCapabilities, effectiveCapabilities, MOUNT_EXTERNAL_NONE, NULL, NULL, true, NULL, NULL, NULL); } static pid_t ForkAndSpecializeCommon(JNIEnv* env, uid_t uid, gid_t gid, jintArray javaGids, jint debug_flags, jobjectArray javaRlimits, jlong permittedCapabilities, jlong effectiveCapabilities, jint mount_external, jstring java_se_info, jstring java_se_name, bool is_system_server, jintArray fdsToClose, jstring instructionSet, jstring dataDir) { //System Server 进程就是在这里fork的 pid_t pid = fork(); }
private static void handleSystemServerProcess( ZygoteConnection.Arguments parsedArgs) throws ZygoteInit.MethodAndArgsCaller { //还没运行System Server进程 RuntimeInit.zygoteInit(parsedArgs.targetSdkVersion, parsedArgs.remainingArgs, cl); }
public static final void zygoteInit(int targetSdkVersion, String[] argv, ClassLoader classLoader) throws ZygoteInit.MethodAndArgsCaller { if (DEBUG) Slog.d(TAG, "RuntimeInit: Starting application from zygote"); nativeZygoteInit(); //还没运行System Server进程,估计也差不多了吧 applicationInit(targetSdkVersion, argv, classLoader); }
private static void applicationInit(int targetSdkVersion, String[] argv, ClassLoader classLoader) throws ZygoteInit.MethodAndArgsCaller { //还没运行System Server进程 invokeStaticMain(args.startClass, args.startArgs, classLoader); }
private static void invokeStaticMain(String className, String[] argv, ClassLoader classLoader) throws ZygoteInit.MethodAndArgsCaller { /* * This throw gets caught in ZygoteInit.main(), which responds * by invoking the exception's run() method. This arrangement * clears up all the stack frames that were required in setting * up the process. */ //没有直接运行System Server进程而是抛出一个异常,原因见注释,过程太曲折,层层调用函数 throw new ZygoteInit.MethodAndArgsCaller(m, argv); }
public static class MethodAndArgsCaller extends Exception implements Runnable { public void run() { //异常在这里补抓到,调用invoke启动System Server进程,运行的函数是类SystemServer.java的静态main函数 mMethod.invoke(null, new Object[] { mArgs }); }