Zygote源码分析

Android启动从init.rc开始,最开始启动ServiceManager

service servicemanager /system/bin/servicemanager
    class core
    user system
    group system
    critical
    onrestart restart healthd
    onrestart restart zygote
    onrestart restart media
    onrestart restart surfaceflinger
    onrestart restart drm

zygote的启动实际是init.zygote32.rc文件

service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server
    class main
    socket zygote stream 660 root system
    onrestart write /sys/android_power/request_state wake
    onrestart write /sys/power/state on
    onrestart restart media
    onrestart restart netd

之后,会走到app_main.cpp的main函数,在这里对参数进行解析,创建决定下一步的运行函数ZygoteInit

    AppRuntime runtime(argv[0], computeArgBlockSize(argc, argv));
    
    if (zygote) {
        runtime.start("com.android.internal.os.ZygoteInit", args);
    } else if (className) {
        runtime.start("com.android.internal.os.RuntimeInit", args);
    } else {
        fprintf(stderr, "Error: no class name or --zygote supplied.\n");
        app_usage();
        LOG_ALWAYS_FATAL("app_process: no class name or --zygote supplied.");
        return 10;
    }

AppRuntime继承于AndroidRuntime

class AppRuntime : public AndroidRuntime{

}

在AndroidRuntime的start方法中对虚拟机进行初始化,同时运行到ZygoteInit的main函数

void AndroidRuntime::start(const char* className, const Vector<String8>& options){
    // startVm内部最终调用 
    // JNI_CreateJavaVM(pJavaVM, pEnv, &initArgs)
    if (startVm(&mJavaVM, &env) != 0) {
		return;
	}
	
	// 寻找到要启动的类,这里就是ZygoteInit
	jclass startClass = env->FindClass(slashClassName);
	
	// 运行main函数
	jmethodID startMeth = env->GetStaticMethodID(startClass, "main","([Ljava/lang/String;)V");
	env->CallStaticVoidMethod(startClass, startMeth, strArray);

	// 释放虚拟机
	mJavaVM->DestroyJavaVM() != 0
}

在ZygoteInit的main方法中,首先初始化socket用于通讯,之后预加载类,资源和库,并开启SystemServer,之后进入监听socket消息循环

registerZygoteSocket(socketName);
preload();
startSystemServer(abiList, socketName);
runSelectLoop(abiList)

startSystemServer函数通过zygote进场fork出一个子进程

pid = Zygote.forkSystemServer(
                    parsedArgs.uid, parsedArgs.gid,
                    parsedArgs.gids,
                    parsedArgs.debugFlags,
                    null,
                    parsedArgs.permittedCapabilities,
                    parsedArgs.effectiveCapabilities);

在子进程中调用 handleSystemServerProcess(parsedArgs)函数,在这个函数中通过classloader加载类,同时运行到main函数,也就是SystemServer的main函数中去

final String systemServerClasspath = Os.getenv("SYSTEMSERVERCLASSPATH");

ClassLoader cl = null;
cl = new PathClassLoader(systemServerClasspath, ClassLoader.getSystemClassLoader());
RuntimeInit.zygoteInit(parsedArgs.targetSdkVersion, parsedArgs.remainingArgs, cl);

invokeStaticMain(args.startClass, args.startArgs, classLoader);

再回到ZygoteInit的main函数的runSelectLoop中,这个函数中有一个while死循环,在循环中不断监听socket,并调用ZygoteConnection的runOnce函数。

while(true){
	done = peers.get(index).runOnce();
}

在runOnce中,fork出进程

pid = Zygote.forkAndSpecialize(parsedArgs.uid, parsedArgs.gid, parsedArgs.gids,
                    parsedArgs.debugFlags, rlimits, parsedArgs.mountExternal, parsedArgs.seInfo,
                    parsedArgs.niceName, fdsToClose, parsedArgs.instructionSet,
                    parsedArgs.appDataDir);

在子进程中

handleChildProc(parsedArgs, descriptors, childPipeFd, newStderr);

在这个函数中,首先会关闭socket,之后运行到RuntimeInit.zygoteInit

RuntimeInit.zygoteInit(parsedArgs.targetSdkVersion, parsedArgs.remainingArgs, null /* classLoader */)

在这里进行初始化

        commonInit();
        nativeZygoteInit();
        applicationInit(targetSdkVersion, argv, classLoader);

在nativeZygoteInit中,会调到app_main的onZygoteInit中,这里进行了binder的初始化

    virtual void onZygoteInit()
    {
        // Re-enable tracing now that we're no longer in Zygote.
        atrace_set_tracing_enabled(true);

        sp<ProcessState> proc = ProcessState::self();
        ALOGV("App process: starting thread pool.\n");
        proc->startThreadPool();
    }

在applicationInit中调用invokeStaticMain运行到main函数

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值