在前一篇文章中已经分析了从init.c到Zygote(app_process)的启动流程。

今天开始分析frameworks/base/cmds/app_process/app_main.cpp。

service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server

上面的内容会在app_main.cpp中用到。

/*
* 启动zygote的方式为/system/bin/app_process -Xzygote /system/bin --zygote --start-system-server
* 所以 argc == 5
* argv里头存的就是这5个参数argv[0]=="/system/bin/app_process" ,argv[1] == "-Xzygote"....
*/
int main(int argc, const char* const argv[])
{
...
AppRuntime runtime;
...    // 这个函数会返回1,表示只处理了-Xzytote这一个参数,所谓的处理实际上就是将这个参数添加到了runtime对象的mOptions 变量中。
int i = runtime.addVmArguments(argc, argv); // Next arg is parent directory
if (i < argc) {
runtime.mParentDir = argv[i++];
} // Next arg is startup classname or "--zygote"
   // Process command line arguments   if (i < argc) {
arg = argv[i++];
if ( == strcmp("--zygote", arg)) {
bool startSystemServer = (i < argc) ?
strcmp(argv[i], "--start-system-server") == : false;
setArgv0(argv0, "zygote");
set_process_name("zygote");
runtime.start("com.android.internal.os.ZygoteInit",
startSystemServer);
} else {
set_process_name(argv0); runtime.mClassName = arg; // Remainder of args get passed to startup class main()
runtime.mArgC = argc-i;
runtime.mArgV = argv+i; LOGV("App process is starting with pid=%d, class=%s.\n",
getpid(), runtime.getClassName());
runtime.start();
}
} else {
LOG_ALWAYS_FATAL("app_process: no class name or --zygote supplied.");
fprintf(stderr, "Error: no class name or --zygote supplied.\n");
app_usage();
return ;
}

从代码中可以看出会调用AppRuntime的start函数来完成zygote的启动。

AppRuntime继承自AndroidRuntime分析:(zygote进入java世界)

会调用AndroidRuntime.cpp的start函数。

在这个函数里主要做一下动作,比较简单。

  start():

   设置root目录“/system”

  startVM()

    . 调用JNI的虚拟机创建函数。

    . 设置虚拟机的heapsize默认为16MB

   startReg()

    . 注册JNI函数。

    . 通过JNI调用com.android.internal.os.ZygoteInit类的main函数。

  zygoteInit相关

    . 找到zygoteInit类的main函数(java类)

    . 通过调用CallStaticVoidMethod()进入java世界(ZygoteInit.java的main())

我们看一下代码:

void start(const char* className, const char* options){

       // start the virtual machine
JNIEnv* env;
if (startVm(&mJavaVM, &env) != ) {
return;
} //register JNI
if (startReg(env) < ) {
return;
}     // jni 调用java的main方法
    jmethodID startMeth = env->GetStaticMethodID(startClass,
  "main","([Ljava/lang/String;)V"); // jni调用找出ZygoteInit类
jclass startClass = env->FindClass(className);

    
    // 运行ZygoteInit类的main函数
  env->CallStaticVoidMethod(startClass, startMeth, strArray);
}

在下一节我们继续分析com.android.internal.os.ZygoteInit类的main函数。

Zygote(app_process)相关分析2的更多相关文章

  1. android手机各大分区详解

    1. bootloader  当我们拿到一款手机,第一件事应该就是按下电源键开机,那么从开机到进入到桌面程序这中间发生了些什么呢,我们从下面这张简化了的手机结构图开始: 注意:该结构图并不反映手机的实 ...

  2. Zygote(app_process)相关分析1

    首先我们从Init.c中来看,当Init中解析完init.rc文件时会得到一系列的action,通过action去调用一些函数. Zygote是在init.rc中service section中 se ...

  3. 系统进程 zygote(三)—— app_process 的 main 函数

    ilocker:关注 Android 安全(新入行,0基础) QQ: 2597294287 首先: , , , ) < ) { // Older kernels don't understand ...

  4. Android源码阅读 – Zygote

    @Dlive 本文档: 使用的Android源码版本为:Android-4.4.3_r1 kitkat (源码下载: http://source.android.com/source/index.ht ...

  5. 系统进程 zygote(一)—— 概述

    和蔼的春光,充满鸳鸯的池塘:快辞别寂寞的梦乡,来和我摸一会鱼儿,折一枝海棠.—— 徐志摩·醒!醒! ilocker:关注 Android 安全(新入行,0基础) QQ: 2597294287 先看一张 ...

  6. 系统进程 zygote(二)—— zygote.rc 脚本

    夕阳已在沉沉的淡化,这黄昏的美,有谁能描画?莽莽的天涯,哪里是我的家,哪里是我的家?爱人呀,我这般的想着你,你那里可也有丝毫的牵挂?—— 徐志摩·海边的梦 ilocker:关注 Android 安全( ...

  7. Zygote浅谈

    Zygote是什么 操作系统中,进程实际上是文件到地址空间的映射像.进程将要运行时,由操作系统将其映射到地址空间,完成这项工作的事物本质也应是一个进程,我们称这个进程为孵化进程,那么这个进程怎么收到消 ...

  8. Zygote进程【1】——Zygote的诞生

    在Android中存在着C和Java两个完全不同的世界,前者直接建立在Linux的基础上,后者直接建立在JVM的基础上.zygote的中文名字为"受精卵",这个名字很好的诠释了zy ...

  9. [Android] 解析android framework下利用app_process来调用java写的命令及示例

    reference to :http://bbs.9ria.com/thread-253058-1-1.html 在android SDK的framework/base/cmds目录下了,有不少目录, ...

随机推荐

  1. JAVA编写WEB服务器

    一.超文本传输协议  1.1 HTTP请求  1.2 HTTP应答  二.Socket类  三.ServerSocket类  四.Web服务器实例  4.1 HttpServer类  4.2 Requ ...

  2. 【测试】DG的主切备,备切主

    1.首先要应用日志,保持主备库一致: 备库:SBDB@SYS> recover managed standby database using current logfile disconnect ...

  3. DB2 Magazine 中文版: 访问 iSeries 数据

    当您第一次开始学习 DB2 for iSeries 时,一下子要弄清楚如何访问所有数据可能有些令人生畏.我将介绍访问 DB2 for iSeries 数据的一些常见的方法,并展示如何开始开发访问存储在 ...

  4. hibernate进阶--一对多映射配置

    hibernate作为一款优秀的ORM框架,广受大家喜爱,也被Java社区公认为持久层的首选.虽然jdbc为Java数据库操 作带来了诸多便利,但是并没有统一SQL语句的写法,而且具体操作数据库的代码 ...

  5. 洛谷P1828 香甜的黄油 Sweet Butter

    P1828 香甜的黄油 Sweet Butter 241通过 724提交 题目提供者JOHNKRAM 标签USACO 难度普及+/提高 提交  讨论  题解 最新讨论 我的SPFA为什么TLE.. 为 ...

  6. Activity的四种launchMode 详细分析

    launchMode在多个Activity跳转的过程中扮演着重要的角色,它可以决定是否生成新的Activity实例,是否重用已存在的 Activity实例,是否和其他Activity实例公用一个tas ...

  7. (转)TextView属性大全

    TextView属性大全 今天研究了TextView一天了,发现网上有一篇讲TextView属性的,非常全,收藏一下先. 发现TextView有一个比较大的问题,就是文字排版的问题,遇到数字,字母,符 ...

  8. Duilib学习笔记《03》— 控件使用

    在前面已经对duilib有个一个基本的了解,并且创建了简单的空白窗体.这仅仅只是一个开始,如何去创建一个绚丽多彩的界面呢?这就需要一些控件元素(按钮.文本框.列表框等等)来完善. 一. Duilib控 ...

  9. vps选择

    banwagonhost.com digitalocean.com vultr.com 优惠链接 https://www.vultr.com/freetrial

  10. C puzzles详解【26-30题】

    第二十六题(不会) The following is a simple program which implements a minimal version of banner command ava ...