Android Zygote进程的启动

本文详细介绍了Android Zygote进程的启动流程,从init.${ro.zygote}.rc文件的定义开始,经过app_process的main函数,AndroidRuntime的startVM和startReg,再到Java层的ZygoteInit.main,包括预加载资源、创建ZygoteServer、forkSystemServer,最后进入Zygote的selectLoop,时刻准备响应新的进程创建请求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Android Zygote进程的启动(Android 10)

1 init.${ro.zygote}.rc 文件定义

前面分析过 Init 进程的启动,在 init.rc 文件中会配置 zygote 相关进程的启动。

system/core/rootdir/Android.mk

# system/core/rootdir/Android.mk
LOCAL_MODULE := init.rc
LOCAL_SRC_FILES := $(LOCAL_MODULE)
LOCAL_MODULE_CLASS := ETC
LOCAL_MODULE_PATH := $(TARGET_ROOT_OUT)
LOCAL_REQUIRED_MODULES := fsverity_init

在 init.rc 中会 import 其他脚本,如 import /init.${ro.zygote}.rc

# system/core/rootdir/init.zygote.rc
# 启动 zygote 进程
# 名字 zygote
# 名字对应的程序 /system/bin/app_process
# 参数 -Xzygote /system/bin --zygote --start-system-server
service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server
    class main
    priority -20 
    user root #用户权限
    group root readproc reserved_disk #所属用户组
    socket zygote stream 660 root system  # 创建名为dev/socket/zygote 的socket,返回fd给启动它的进程
    socket usap_pool_primary stream 660 root system  # 创建名为dev/socket/usap_pool_primary 的socket,返回fd给启动它的进程
    onrestart write /sys/android_power/request_state wake
    onrestart write /sys/power/state on
    onrestart restart audioserver
    onrestart restart cameraserver
    onrestart restart media
    onrestart restart netd
    onrestart restart wificond
    writepid /dev/cpuset/foreground/tasks

Zygote 进程能够重启的地方:

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

2 Zygote 启动流程

由上可知,/system/bin/app_process 就是 zygote 进程运行的主程序,从定义app_process的地方可以找到:

# frameworks/base/cmds/app_process/Android.mk
app_process_src_files := \
    app_main.cpp \
app_process_cflags := \
    -Wall -Werror -Wunused -Wunreachable-code
include $(CLEAR_VARS)
# 模块名
LOCAL_MODULE:= app_process
LOCAL_MULTILIB := both
LOCAL_MODULE_STEM_32 := app_process32
LOCAL_MODULE_STEM_64 := app_process64

从app_main()入口函数开始,Zygote 启动过程的函数调用大概流程如下:
zygote启动流程

2.1 app_mai.cpp#main()

//frameworks/base/cmds/app_process/app_main.cpp
#if defined(__LP64__)
static const char ABI_LIST_PROPERTY[] = "ro.product.cpu.abilist64";
static const char ZYGOTE_NICE_NAME[] = "zygote64";
#else
static const char ABI_LIST_PROPERTY[] = "ro.product.cpu.abilist32";
static const char ZYGOTE_NICE_NAME[] = "zygote";
#endif

int main(int argc, char* const argv[])
{
   
    if (!LOG_NDEBUG) {
   
      String8 argv_String;
      for (int i = 0; i < argc; ++i) {
   
        argv_String.append("\"");
        argv_String.append(argv[i]);
        argv_String.append("\" ");
      }
      ALOGV("app_process main with argv: %s", argv_String.string());
    }
    //service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server
	// 传到的参数 argv 为”-Xzygote /system/bin --zygote --start-system-server“
	// 创建 AppRuntime
    AppRuntime runtime(argv[0], computeArgBlockSize(argc, argv));
    // 忽略第一个参数 argv[0]
    argc--;
    argv++;

    // --zygote : Start in zygote mode
    // --start-system-server : Start the system server.
    // --application : Start in application (stand alone, non zygote) mode.
    // --nice-name : The nice name for this process.
    const char* spaced_commands[] = {
    "-cp", "-classpath" };
    bool known_command = false;
    int i;
    for (i = 0; i < argc; i++) {
   
        // 。。。
        for (int j = 0;
             j < static_cast<int>(sizeof(spaced_commands) / sizeof(spaced_commands[0]));
             ++j) {
   
          if (strcmp(argv[i], spaced_commands[j]) == 0) {
   
            known_command = true;
            ALOGV("app_process main found known command '%s'", argv[i]);
          }
        }
        if (argv[i][0] != '-') {
   
            break;
        }
        if (argv[i][1] == '-' && argv[i][2] == 0) {
   
            ++i; // Skip --.
            break;
        }
        runtime.addOption(strdup(argv[i]));
    }

    // 参数解析
    bool zygote = false;
    bool startSystemServer = false;
    bool application = false;
    String8 niceName;
    String8 className;

    ++i;  // Skip unused "parent dir" argument.
    while (i < argc) {
   
        const char* arg = argv[i++];
        if (strcmp(arg, "--zygote") == 0) {
   
        	// 对于 64 位系统 nice_name 为 zygote64; 32 位系统为 zygote
            zygote = true;
            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();
		//是否启动 SystemServer
        if (startSystemServer) {
   
            args.add(String8("start-system-server"));
        }

        char prop[PROP_VALUE_MAX];
        if (property_get(ABI_LIST_PROPERTY, prop, NULL) == 0) {
   
            LOG_ALWAYS_FATAL("app_process: Unable to determine ABI list from property %s.",
                ABI_LIST_PROPERTY);
            return 11;
        }

        String8 abiFlag("--abi-list=");
        abiFlag.append(prop);
        args.add(abiFlag);

        // In zygote mode, pass all remaining arguments to the zygote
        // main() method.
        for (; i < argc; ++i) {
   
            args.add(String8(argv[i]));
        }
    }
	// 设置进程名
    if (!niceName.isEmpty()) {
   
        runtime.setArgv0(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值