app_process: 启动java进程(1)

本文深入探讨了Android系统中的app_process,一个关键的可执行文件,负责启动核心进程如zygote和system_server。文章详细讲解了app_process的工作原理,包括参数解析、虚拟机创建、JNI接口注册以及如何启动不同类型的Java程序。

涉及源码

android-8.0.0_r1\frameworks\base\cmds\app_process
android- 8.0.0_r1\frameworks\base\core\jni\AndroidRuntime.cpp

概述

app_process是Android系统中一个重要的编译出来的可执行文件。该执行文件在开机过程中负责启动Android核心的进程zygote和system_server。
app_process也可以用来运行可执行的java程序。

主要流程

app_process可执行文件的核心文件是

frameworks\base\cmds\app_process\app_main.cpp
frameworks\base\core\jni\AndroidRuntime.cpp

在这里插入图片描述

  1. 创建运行时类对象(AndroidRuntime类)
  2. 图像模块底层初始化
  3. app_process命令的参数解析
  4. 使用AndroidRuntime对象启动java进程。注意: 启动的java进程有两种类型:
    4.1. 不指定类名和应用名,按照系统默认配置,启动zygote和system_server
    4.2 按照指定的类名和应用,查找其中的main函数作为入口,运行java程序
  5. 运行java程序。运行java程序,并不是直接执行指定程序的main函数,而是在中间加了一层,通过ZygoteInit或RuntimeInit来运行最终要运行的java可执行程序
// file: frameworks\base\cmds\app_process\app_main.cpp
// function: main
if (zygote) {
   
   
		/* 
		启动zygote和system_server.在参数解析不能体现启动system_server是调用ZygoteInit,
		在更深层的代码追踪,会发现system_server通过ZygoteInit启动。也即启动system_server,
		zygote一定为true,除非通过命令直接启动system_server.此处主要呈现的是Android系统启动过程.
		*/
        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函数

在AndroidRuntime的start中,执行了运行java程序核心步骤:

  1. 创建虚拟机
    在创建虚拟机代码中可以看到初始化很多数据,了解虚拟用到的参数,可以根据设备特性,更优的配置参数和满足产品及用户需求
// file: frameworks\base\core\jni\AndroidRuntime.cpp
int AndroidRuntime::startVm(JavaVM** pJavaVM, JNIEnv** pEnv, bool zygote)
{
   
   
	// 1.初始化参数
    JavaVMInitArgs initArgs;
    char propBuf[PROPERTY_VALUE_MAX];
    char stackTraceFileBuf[sizeof("-Xstacktracefile:")-1 + PROPERTY_VALUE_MAX];
    char jniOptsBuf[sizeof(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值