Zygote&SystemServer启动流程

120 阅读3分钟

Zygote启动脚本

init.rc是以import方式来引入各个模块的rc的
路径:system/core/rootdir/init.zygote32.rc

init.rc也在这个目录,还有64位的init.zygote64.rc,安卓支持32位和64位

 

rc中的内容:

main入口

frameworks/base/cmds/app_process/app_main.cpp

main方法中,最终执行frameworks/base/core/jni/AndroidRuntime.cpp的start方法

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

AndroidRuntime::start()中会调用startVm, 这里启动了虚拟机

/* * Start VM.  This thread becomes the main thread of the VM, and will * not return until the VM exits. */
char* slashClassName = toSlashClassName(className != NULL ? className : "");
jclass startClass = env->FindClass(slashClassName);
if (startClass == NULL) {   
 ALOGE("JavaVM unable to locate class '%s'\n", slashClassName);   
 /* keep going */} 
else {    
jmethodID startMeth = env->GetStaticMethodID(startClass, "main",        
"([Ljava/lang/String;)V");    
if (startMeth == NULL) {        
ALOGE("JavaVM unable to find main() in '%s'\n", className);      
  /* keep going */    
} else {        
env->CallStaticVoidMethod(startClass, startMeth, strArray);
}

执行完startVm,通过调用JNIEnv调用ZygoteInit的main,这时候就回到的java层

ZygoteInit主要流程:

1. 开启socket , ZygoteInit.java::main

  •   zygoteServer = new ZygoteServer(isPrimaryZygote);
  • Zygote.createManagedSocketFromInitSocket
  • new LocalServerSocket(fd);

2. preloadClasser:预加载android的一些核心类,/system/etc/preloaded-classes
3. preloadResources
4. 启动fork出systemServer

  • zygote.java::nativeForkSystemServer 

  • com_android_internal_os_Zygote.cpp::com_android_internal_os_Zygote_nativeForkSystemServer

  • zygote::ForkCommon

  • pid_t pid = fork(); //最终fork进程 ,通过unistd.h中的方法访问操作系统核心功能的接口

5. 启动socket循环,接受socket消息, ZygoteServer.java ->

zygoteServer::runSelectLoop(abiList);

6. ZygoteServer的runSelectLoop方法中,会不断的获取Socket消息,如果是创建进程消息,就fork出进程

if (pollIndex == 0) {    
// Zygote server socket    
ZygoteConnection newPeer = acceptCommandPeer(abiList);   
 peers.add(newPeer);    
socketFDs.add(newPeer.getFileDescriptor());}
 else if (pollIndex < usapPoolEventFDIndex) {  
  // Session socket accepted from the Zygote server socket    
   try {        
    ZygoteConnection connection = peers.get(pollIndex);        
    boolean multipleForksOK = !isUsapPoolEnabled()&& ZygoteHooks.isIndefiniteThreadSuspensionSafe();        
    final Runnable command =  connection.processCommand(this, multipleForksOK);
....

1.acceptCommandPeer中创建ZygoteConnection,接受消息

2.processCommand 中调用Zygote.forkAndSpecialize孵化出普通app进程

7. 接着执行Zygoteinit::handleSystemServerProcess

8. 调用ZygoteInit.zygoteInit,方法中执行ZygoteInit.nativeZygoteInit();会启动binder线程池,调用AndroidRuntime.cpp中的JNI方法com_android_internal_os_ZygoteInit_nativeZygoteInit

gCurRuntime->onZygoteInit();调用到app_main.cpp
virtual void onZygoteInit(){    
sp<ProcessState> proc = ProcessState::self();    
ALOGV("App process: starting thread pool.\n");   
 proc->startThreadPool(); //开启binger线程池
}

9.回到ZygoteInit, 启动完binder线程池,执行

RuntimeInit.applicationInit(targetSdkVersion, disabledCompatChanges, argv, classLoader);

10.applicationInit中findStaticMain(args.startClass, args.startArgs, classLoader),找到SystemServer的main方法,执行,然后进入SystemServer的启动流程

args.startClass是从前面中层层传递过来,就是com.android.server.SystemServer

/* Hardcoded command line to start the system server */
String[] args = {       
 "--setuid=1000",        
"--setgid=1000",        
"--setgroups=1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1018,1021,1023,"                
+ "1024,1032,1065,3001,3002,3003,3006,3007,3009,3010,3011",        
"--capabilities=" + capabilities + "," + capabilities,        
"--nice-name=system_server",        "--runtime-args",        
"--target-sdk-version=" + VMRuntime.SDK_VERSION_CUR_DEVELOPMENT,        
"com.android.server.SystemServer",};
ZygoteArguments parsedArgs;

SystemServer启动

每个服务初始化成功后回调systemReady

startOtherService最后开始执行startSystemUI

注意:

SystemServerManager是systemServer的服务管理类

ServiceManager是应用层跨进程调用时常用的服务类(Binder DNS服务器)

参考资料:

Android Framework实战视频--Zygote的启动_哪里有完整的androidframework视频教学-CSDN博客

Android Framework实战视频--Zygote的fork进程篇_android framework实战视频-- zygote的fork进程篇-CSDN博客

Android Framework实战视频--SystemServer启动篇_实战视频 zygote的启动-CSDN博客