【问题标题】:::Android Framework:: Which is first runner, zygote or dalvik?::Android Framework:: 哪个是先行者,zygote 还是 dalvik?
【发布时间】:2013-12-17 01:22:07
【问题描述】:

我有一个涉及 Android 框架的问题。

互联网或书籍中显示的每个启动序列都显示了从 zygote 到 dalvik 的流程如下。

但是,根据我的代码研究,init 处理器在加载 zygote 之前运行 app_process(app_main.cpp),如下所示:

[init.rc] : 

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

因为zygote(ZygoteInit.java)是java文件(一种类),需要dalvik虚拟机执行,所以app_process(app_main.cpp)初始化dalvik机器,准备启动。

然后通过 dalvik 加载 ZygoteInit.java

因此,zygote 实际运行了。

在我看来,初始化和加载dalvik的进程不是zygote,而是app_process和zygote在dalvik之下,因为它是由java代码组成的。

唯一让我怀疑的是 app_main.cpp 中的一些代码。

查看app_main.cpp文件中的main函数,你可以找到如下几行:

[app_main.cpp] :

       if (niceName && *niceName) {

            setArgv0(argv0, niceName);

            **set_process_name(niceName);**

       }

niceName 指向字符串"zygote"

这意味着使用set_process_name() 函数将app_process 更改为zygote 进程。如果是真的,一切正常。但我不知道事实是什么。

任何人都让我确定什么是第一。

尝试浏览android代码:

http://androidxref.com/4.4_r1/

【问题讨论】:

标签: java android frameworks dalvik init


【解决方案1】:

Dalvik 作为可加载库在 Android 上提供。 app_process 与该库链接并使用它。因此,app_process 在自己的进程中启动了一个 Dalvik VM。

Zygote 只是其中的一个特例。

所以,为了更直接地回答您的问题:在典型的启动过程中,第一个运行的 Dalvik VM 是在 app_process 进程中生成的,它传递的参数使其成为 Zygote 进程正在运行的系统。

【讨论】:

  • 正如你所说,让 DVM app_process 的一些元素成为 Zygote 进程,并从 init 进程传递参数作为 init.rc 文件中的描述。对吗?
  • 不是 100% 确定您的意思,但我认为答案是“是”。
  • 好的。让我确定一下。 init.rc 文件是对 Init 进程的待办事项列表的描述。当 init 进程调用 app_process 时,它会将一些关于 Zygote 的参数传递给 app_process。字符串“zygote”是这些参数之一。因此使用它,app_process 将其名称更改为“zygote”。你的意思是我理解的。无论如何,我真的很感谢你的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-13
  • 1970-01-01
  • 1970-01-01
  • 2013-11-06
  • 2014-03-02
  • 2011-01-22
  • 2017-08-07
相关资源
最近更新 更多