gpt4 book ai didi

android - 了解安卓: Zygote and DalvikVM

转载 作者:IT王子 更新时间:2023-10-28 23:51:02 33 4
gpt4 key购买 nike

我正在尝试了解 Android 如何启动应用程序。问题是 Zygote 如何(以及为什么) fork 一个新的 Dalvik VM?我不明白为什么不能在同一个 Dalvik VM 中运行多个应用程序。

最佳答案

Q. how does zygote exactly fork Dalvik VM?

简答:Zygote 进程在系统启动时冷启动 Java VM。然后它监听套接字以获取传入命令。每当应用程序需要新进程时,其他进程(例如 ActivityManagerService)将命令写入此套接字。这些命令由 Zygote 进程读取,该进程根据需要调用 fork()。子进程获得一个预热的虚拟机来运行。这就是 Zygote fork Dalvik VM 的方式。

长答:内核加载完成后,解析init.rc,启动原生服务。那么/system/bin/app_process ) 运行。这最终会调用 AndroidRuntime.start() ,将参数 com.android.internal.os.ZygoteInitstart-system-server 传递给它。

AndroidRuntime.start() 启动 Java VM,然后调用 ZygoteInit.main() ,将参数 start-system-server 传递给它。

ZygoteInit.main() 注册 Zygote 套接字(Zygote 进程监听传入的命令,并在收到新命令时根据请求生成一个新进程)。然后它会预加载很多类(如 frameworks/base/preloaded-classes 中所列,在 Android 8.0 中超过 4500 个)和所有系统范围的资源,如可绘制对象、xml 等。然后它调用 fork 的 startSystemServer() com.android.server.SystemServer 的新流程.此 fork 很特殊,与 Zygote 代表请求进程执行的通常 fork 不同。

SystemServer 被派生后,runSelectLoopMode() 函数被调用。这是一个 while(true) 循环,它与 Zygote 套接字建立 ZygoteConnection 并等待其上的命令。收到命令时,ZygoteConnection.runOnce()被调用。

ZygoteConnection.runOnce() 然后调用Zygote.forkAndSpecialize()然后调用 native 函数来执行实际的 fork 。因此,就像 SystemServer 的情况一样,创建了一个子进程,它为自己继承了一个预热的 Dalvik VM。

Q. why it is not possible to run multiple applications in the same Dalvik VM?

据我所知,这是一个设计决策。 Android 人员刚刚决定通过沙盒为每个进程分配一个新的虚拟机以确保安全。

关于android - 了解安卓: Zygote and DalvikVM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9153166/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com