ZhaoKaiQiang/AndroidDifficultAnalysis

关于APP对应虚拟机

explorer-of-web3 opened this issue · 2 comments

博主在博客中说到,所谓多进程模式是一个APP对应多个虚拟机,但有的资料说Dalvik虚拟机是不同于JVM的一点就是其中可以运行多个进程,所以一个APP对应一个虚拟机,而虚拟机可以运行多个进程,这两者谁对谁错,请博主给以权威资料证明

@AnyLifeZLB @weifucheng 我来回答一下,若是有错了,请指教哈。

  1. 进程的问题:Android 中的第一个 Java 进程是 Zygote 进程,之后的进程(Android 每个应用的进程)都是从这个 Zygote 进程 fork 出来的,fork 出来的子进程的父进程都是 Zygote 进程。
    PS: service 指定了 process: remote 之后的进程,其父进程也是 Zygote 进程。具体可在 adb shell 下使用 ps 命令查看。

  2. 关于虚拟机的问题:在启动 Zygote 进程之前,会由 init.rc 的进程来启动 Dalvik 虚拟机。即之后的 Zygote 进程是运行在 Dalvik 虚拟机上的。这样的话,在 fork 出来的子进程,根据 fork 的原理(copy on write),子进程会拷贝一份跟父进程相同的进程地址空间,这样子进程也会有自己的 Dalvik 虚拟机代码。即每个进程便是一个个的 Dalvik 虚拟机。这样每个 App 挂掉便不会影响其他的进程。