Zygote进程启动System Server进程的过程

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 });
            
    }


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值