美文网首页Android
Android系统_Zygote启动流程分析

Android系统_Zygote启动流程分析

作者: afree_ | 来源:发表于2019-08-18 17:42 被阅读0次

Zygote简介

Zygote中文翻译为“受精卵”,正如其名,它主要用于孵化子进程。
Zygote是一个C/S模型,Zygote进程作为服务端,其他进程作为客户端向它发出“孵化”请求,而Zygote接收到这个请求后就“孵化”出一个新的进程。
此篇文章着重介绍 Zygote进程的创建和启动流程

Zygote进程启动流程图

init进程main方法

/system/core/init/init.c
     int main(int argc, char **argv){      
        ... // 初始化 文件、属性服务等
        
        // 解析 init.rc 
1077    init_parse_config_file("/init.rc");
1078    // 执行 rc解析后的data (见 rc 语法)
1079    action_for_each_trigger("early-init", action_add_queue_tail);
1081    queue_builtin_action(wait_for_coldboot_done_action, "wait_for_coldboot_done");
1082    queue_builtin_action(mix_hwrng_into_linux_rng_action, "mix_hwrng_into_linux_rng");
1083    queue_builtin_action(keychord_init_action, "keychord_init");
1084    queue_builtin_action(console_init_action, "console_init");
1087    action_for_each_trigger("init", action_add_queue_tail);
1092    queue_builtin_action(mix_hwrng_into_linux_rng_action, "mix_hwrng_into_linux_rng");
1093    queue_builtin_action(property_service_init_action, "property_service_init");
1094    queue_builtin_action(signal_init_action, "signal_init");
1097    if (is_charger) {
1098        action_for_each_trigger("charger", action_add_queue_tail);
1099    } else {
1100        action_for_each_trigger("late-init", action_add_queue_tail);
1101    }
1104    queue_builtin_action(queue_property_triggers_action, "queue_property_triggers");
1108    queue_builtin_action(bootchart_init_action, "bootchart_init");

1110    // 无限循环,执行action、检查是否需要重启、处理系统属性变化、回收僵尸进程等
1111    for(;;) {
            ......
1173    }
1174
1175    return 0;
1176}
1177


rc配置文件

/system/core/rootdir/init.rc

init.rc是一个配置文件,内部由Android初始化语言编写(Android Init Language)编写的脚本,它主要包含五种类型语句:
Action、Commands、Services、Options和Import

Action

init.c的main方法中通过触发器trigger执行,执行顺序依次为
early-init、init、late-init、boot/charger、property等

Service

init.c先解析rc文件将service添加到service链表中,然后有 Action配置在on XXX时机下触发启动服务
init生成的子进程,定义在rc文件,其中每一个service在启动时会通过fork方式生成子进程

Command

执行命令,例如:start <service_name>: 启动指定的服务

Options

是Service的可选项,例如 socket:创建名为/dev/soket/<name>的socket

...

422  on nonencrypted  // 执行启动 main服务
423    class_start main
424    class_start late_start
...  
     // service 例子
519  service servicemanager /system/bin/servicemanager
520    class core
521    user system
522    group system
523    critical
524    onrestart restart healthd
525    onrestart restart zygote
526    onrestart restart media
527    onrestart restart surfaceflinger
528    onrestart restart drm
...

/system/core/rootdir/init.zygote64.rc
1  service zygote /system/bin/app_process64 -Xzygote /system/bin --zygote --start-system-server
2    class main
3    socket zygote stream 660 root system
4    onrestart write /sys/android_power/request_state wake
5    onrestart write /sys/power/state on
6    onrestart restart media
7    onrestart restart netd

rc配置文件解析

/system/core/init/init_parser.c

      // 解析 rc文件
404   int init_parse_config_file(const char *fn){
409    // 解析 rc文件数据
410    parse_config(fn, data);
412    ......
413 }

347  static void parse_config(const char *fn, char *s){
       ... // 初始化变量等
365    for (;;) {
366        switch (next_token(&state)) {
367        ...
370        case T_NEWLINE:
371            state.line++;
372            if (nargs) {
373                int kw = lookup_keyword(args[0]);
374                if (kw_is(kw, SECTION)) {
375                    state.parse_line(&state, 0, 0); // 解析一份配置的每一项
376                    parse_new_section(&state, kw, nargs, args); // 解析一份配置
377                } else {
378                    state.parse_line(&state, nargs, args);
379                }
380                nargs = 0;
381            }
382            break;
384         ...
388        }
389    }
390     .....
401    }
402}

      static void parse_new_section(struct parse_state *state, int kw,
321                       int nargs, char **args){
323    
326    case K_service: // 解析服务
327        state->context = parse_service(state, nargs, args);
328        if (state->context) {
329            state->parse_line = parse_line_service;
330            return;
331        }
332        break;
333    case K_on: // 解析 Action
334        state->context = parse_action(state, nargs, args);
335        if (state->context) {
336            state->parse_line = parse_line_action;
337            return;
338        }
339        break;
340    ......
345}
346

616  static void *parse_service(struct parse_state *state, int nargs, char **args){
       // 创建service , 并添加到 Service链表中
640    svc->name = args[1];
641    svc->classname = "default";
642    memcpy(svc->args, args + 2, sizeof(char*) * nargs);
643    svc->args[nargs] = 0;
644    svc->nargs = nargs;
645    svc->onrestart.name = "onrestart";
646    list_init(&svc->onrestart.commands);
647    list_add_tail(&service_list, &svc->slist);
648    return svc;
649 }
650

Zygote服务启动和进程创建

服务进程启动,7.0之前面向过程实现,之后面向对象实现
/system/core/init/builtins.c

     int do_class_start(int nargs, char **args){
221    service_for_each_class(args[1], service_start_if_not_disabled);
222    return 0;
223}

194 static void service_start_if_not_disabled(struct service *svc){
196    if (!(svc->flags & SVC_DISABLED)) {
197        service_start(svc, NULL); // 启动service
198    } else {
199        svc->flags |= SVC_DISABLED_START;
200    }
201 }

/system/core/init/init.c

    void service_start(struct service *svc, const char *dynamic_args) {
       .....
251    pid = fork();  // fork 进程
252
253    if (pid == 0) { // init 子进程
254       if (!dynamic_args) {
        // 通过execve(svc->args[0], (char**)svc->args, (char**) ENV),进入App_main.cpp的main()函数
335            if (execve(svc->args[0], (char**) svc->args, (char**) ENV) < 0) {
336                ERROR("cannot execve('%s'): %s\n", svc->args[0], strerror(errno));
337            }
338       }
356        _exit(127);
357    }
358     ...
359 }

Zygote进程main方法

/frameworks/base/cmds/app_process/app_main.cpp
主要事情:创建一个AppRuntime,调用它的start函数

132 int main(int argc, const char* const argv[]){
       .....
       // 传递的参数 args 为 “-Xzygote /system/bin --zygote --start-system-server”
197    AppRuntime runtime(argv[0], computeArgBlockSize(argc, argv)); // 初始一个 runtime
       
162    while (i < argc) {
163        const char* arg = argv[i++];
164        if (!parentDir) {
165            parentDir = arg;
166        } else if (strcmp(arg, "--zygote") == 0) {
167            zygote = true;   // 标识启动zygote
168            niceName = "zygote";  
169        } else if (strcmp(arg, "--start-system-server") == 0) {
170            startSystemServer = true;
171        } else if (strcmp(arg, "--application") == 0) {
172            application = true;
173        } else if (strncmp(arg, "--nice-name=", 12) == 0) {
174            niceName = arg + 12;
175        } else {
176            className = arg;
177            break;
178        }
179    }
180
        ......
187
188    if (zygote) { // 调用AppRuntime启动ZygoteInit
189        runtime.start("com.android.internal.os.ZygoteInit",
190                startSystemServer ? "start-system-server" : "");
191    } else if (className) {
196        runtime.start("com.android.internal.os.RuntimeInit",
197                application ? "application" : "tool");
198    } else {
202        return 10;
203    }
204}
205

AndroidRuntime初始化及启动Zygote初始化

AndroidRuntime.cpp
主要事情:启动虚拟机、注册JNI方法,调用ZygoteInit的main函数

     void AndroidRuntime::start(const char* className, const char* options) {
        ......
836
837    /* start the virtual machine 启动虚拟机 */
838    JNIEnv* env; 
839    if (startVm(&mJavaVM, &env) != 0) {
840        return;
841    }
842    onVmCreated(env);
843
844    /*
845     * Register android functions. JNI方法注册
846     */
847    if (startReg(env) < 0) {
848        ALOGE("Unable to register all android natives\n");
849        return;
850    }
        ......
871
        // 将 "com.android.internal.os.ZygoteInit"转换为"com/android/internal/os/ZygoteInit"
876    char* slashClassName = toSlashClassName(className);
877    jclass startClass = env->FindClass(slashClassName);
878    if (startClass == NULL) {
879       ......
881    } else {
882        jmethodID startMeth = env->GetStaticMethodID(startClass, "main",
883            "([Ljava/lang/String;)V");
884        if (startMeth == NULL) {
885            ......
887        } else {
            // 调用ZygoteInit.main()方法
888            env->CallStaticVoidMethod(startClass, startMeth, strArray);
889
895    }
896   ......
903}

ZygoteInit的main方法

ZygoteInit.java
主要事情:创建Socket用来和AMS通讯、启动SystemServer、调用runSelectLoop进入循环等待唤醒并执行相应工作

public static void main(String argv[]) {
        try {
            RuntimeInit.enableDdms(); // 开启DDMS功能
            ......
            // 注册 ZygoteSocket 进程间通信
            registerZygoteSocket(socketName);
            // 预加载 类和资源(fork 进程共享)
            preload();
            
            // Do an initial gc to clean up after startup
            gcAndFinalize();
            // 启动 SystemServer 此处会fork出服务进程
            if (startSystemServer) {
                startSystemServer(abiList, socketName);
            }

            // 开启无限循环模式 处理进程消息
            runSelectLoop(abiList);
            // 关闭 socket
            closeServerSocket();
        } catch (MethodAndArgsCaller caller) {
            caller.run(); // 子进程 System_Server抛异常后调用
        } catch (RuntimeException ex) {
            Log.e(TAG, "Zygote died with exception", ex);
            closeServerSocket();
            throw ex;
        }
    }


推荐阅读:图形系统总结

相关文章

网友评论

    本文标题:Android系统_Zygote启动流程分析

    本文链接:https://www.haomeiwen.com/subject/ptfdsctx.html