了解 Android:Zygote 和 DalvikVM

2023-12-31

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


问:zygote 是如何精确分叉 Dalvik VM 的?

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

长答案:内核加载后,init.rc被解析并启动本机服务。然后/system/bin/app_process https://github.com/aosp-mirror/platform_frameworks_base/blob/oreo-release/cmds/app_process/app_main.cpp)运行。这最终调用AndroidRuntime.start() https://github.com/aosp-mirror/platform_frameworks_base/blob/oreo-release/core/jni/AndroidRuntime.cpp#L994,向其传递参数com.android.internal.os.ZygoteInit and start-system-server.

The AndroidRuntime.start()启动 Java VM,然后调用ZygoteInit.main() https://github.com/aosp-mirror/platform_frameworks_base/blob/oreo-release/core/java/com/android/internal/os/ZygoteInit.java#L671,将参数传递给它start-system-server.

ZygoteInit.main()注册 Zygote 套接字(Zygote 进程侦听传入命令,并在接收新命令时根据请求生成一个新进程)。然后它会预加载很多类(如框架/基础/预加载类 https://github.com/aosp-mirror/platform_frameworks_base/blob/oreo-release/preloaded-classes,在 Android 8.0 中超过 4500)以及所有系统范围的资源,如可绘制对象、xml 等。然后它调用startSystemServer()它分叉了一个新的进程com.android.server.SystemServer https://github.com/aosp-mirror/platform_frameworks_base/blob/oreo-release/services/java/com/android/server/SystemServer.java。该分叉很特殊,其执行方式与 Zygote 代表请求进程执行的常规分叉不同。

SystemServer分叉后runSelectLoopMode()函数被调用。这是一个while(true)循环建立一个ZygoteConnection与 Zygote 套接字并等待其上的命令。当收到命令时,ZygoteConnection.runOnce() https://github.com/aosp-mirror/platform_frameworks_base/blob/oreo-release/core/java/com/android/internal/os/ZygoteConnection.java#L134叫做。

ZygoteConnection.runOnce()然后打电话Zygote.forkAndSpecialize() https://github.com/aosp-mirror/platform_frameworks_base/blob/oreo-release/core/java/com/android/internal/os/Zygote.java#L99然后调用本机函数来执行实际的 fork。因此,与 SystemServer 的情况一样,会创建一个子进程,该子进程会为其自身继承预热的 Dalvik VM。

问:为什么不能在同一个应用程序中运行多个应用程序 达尔维克虚拟机?

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

了解 Android:Zygote 和 DalvikVM 的相关文章

随机推荐