android 重启app_[Boot]Android系统启动-zygote篇

本文详细介绍了Android系统的Zygote进程启动过程,从App_main.main开始,包括startVm、startReg以及进入Java层的各个步骤,如ZygoteInit.main、preload、startSystemServer等。Zygote进程在系统中的重要作用是预加载类和资源,提高app启动效率,并能响应系统或应用的重启需求。
摘要由CSDN通过智能技术生成
本文转载自Gityuan的博客,原文地址为:http://gityuan.com/2016/02/13/android-zygote/
转载请注明作者及原文链接。
基于Android 6.0的源码剖析, 分析Android启动过程的Zygote进程
/frameworks/base/cmds/app_process/App_main.cpp
/frameworks/base/core/jni/AndroidRuntime.cpp

/frameworks/base/core/java/com/android/internal/os/
  - ZygoteInit.java
  - Zygote.java
  - ZygoteConnection.java

/frameworks/base/core/java/android/net/LocalServerSocket.java
/system/core/libutils/Threads.cpp

一. 概述

Zygote是由init进程通过解析init.zygote.rc文件而创建的,zygote所对应的可执行程序app_process,所对应的源文件是App_main.cpp,进程名为zygote。

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

Zygote进程能够重启的地方:

  • servicemanager进程被杀; (onresart)
  • surfaceflinger进程被杀; (onresart)
  • Zygote进程自己被杀; (oneshot=false)
  • system_server进程被杀; (waitpid)

从App_main()开始,Zygote启动过程的函数调用类大致流程如下:

cc8d0260f7a4ab34de54c2a60fb92639.png

二、Zygote启动过程

2.1 App_main.main

[-> App_main.cpp]

int main(int argc, char* const argv[])
{
    
    //传到的参数argv为“-Xzygote /system/bin --zygote --start-system-server”
    AppRuntime runtime(argv[0], computeArgBlockSize(argc, argv));
    argc--; argv++; //忽略第一个参数

    int i;
    for (i = 0; i < argc; i++) {
    
        if (argv[i][0] != '-') {
    
            break;
        }
        if (argv[i][1] == '-' && argv[i][2] == 0) {
    
            ++i;
            break;
        }
        runtime.addOption(strdup(argv[i]));
    }
    //参数解析
    bool zygote = false;
    bool startSystemServer = false;
    bool application = false;
    String8 niceName;
    String8 className;
    ++i;
    while (i < argc) {
    
        const char* arg = argv[i++];
        if (strcmp(arg, "--zygote") == 0) {
    
            zygote = true;
            //对于64位系统nice_name为zygote64; 32位系统为zygote
            niceName = ZYGOTE_NICE_NAME;
        } else if (strcmp(arg, "--start-system-server") == 0) {
    
            startSystemServer = true;
        } else if (strcmp(arg, "--application") == 0) {
    
            application = true;
        } else if (strncmp(arg, "--nice-name=", 12) == 0) {
    
            niceName.setTo(arg + 12);
        } else if (strncmp(arg, "--", 2) != 0) {
    
            className.setTo(arg);
            break;
        } else {
    
            --i;
            break;
        }
    }
    Vector<String8> args;
    if (!className.isEmpty()) {
    
        // 运行application或tool程序
        args.add(application ? String8("application") : String8("tool"));
        runtime.setClassNameAndArgs(className, argc - i, argv + i);
    } else {
    
        //进入zygote模式,创建 /data/dalvik-cache路径
        maybeCreateDalvikCache();
        if (startSystemServer) {
    
            args.add(String8("start-system-server"));
        }
        char prop[PROP_VALUE_MAX];
        if (property_get(ABI_LIST_PROPERTY, prop, NULL) == 0) {
    
            return 11;
        }
        String8 abiFlag("--abi-list=");
        abiFlag.append(prop);
        args.add(abiFlag);

        for (; i < argc; ++i) {
    
            args.add(String8(argv[i]));
        }
    }

    //设置进程名
    if (!niceName.isEmpty()) {
    
        runtime.setArgv0(niceName.string());
        set_process_name(niceName.string());
    }
    if (zygote) {
    
        // 启动AppRuntime 【见小节2.2】
        runtime.start("com.android.internal.os.ZygoteInit", args, zygote);
    } else if (className) {
    
        runtime.start("com.android.internal.os.RuntimeInit", args, zygote);
    } else {
    
        //没有指定类名或zygote,参数错误
        return 10;
    }
}

2.2 start

[-> Andro

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值