在Android中为同一个应用创建第二个合子流程

时间:2016-02-10 17:21:35

标签: android android-6.0-marshmallow

我需要两个zygote进程来分叉系统两次,以便应用程序处理不同级别的输入。

我在ZygoteInit.java文件中看到,创建辅助受精卵依赖于--abi-list。如果有任何不匹配的abi,那么将创建zygote-secondary,但它也会在函数waitForSecondaryZygote()中立即被杀死而不做任何事情。套接字在那里被杀死。

二级受精卵有什么需要? 我怎样才能创建另一个Zygote? Zygote线程安全吗?

1 个答案:

答案 0 :(得分:0)

支持多个ABI的设备可能有多个受精卵,其中一个应用程序在不同的Zygote上运行。 Android允许开发人员在其代码中选择ABI目标,因此从一个ABI目标切换到另一个目标可能需要一个新的Zygote分支。由于同时运行这两个应用程序会导致问题,因此在创建新的应用程序时应该关闭辅助合子进程。

说明这一点的一个好方法是在CyanogenMod集成更改以在单个设备上支持多个ABI配置时看到差异:

https://gitlab.com/CyanogenMod/android_frameworks_base/commit/402120a2236b294dff9a51461cb22400a6ef67f6

请注意,Zygote进程正在等待辅助进程在创建新进程之前死掉。

例如,支持ARM和Mips的设备可能有一个应用程序,有时会使用一个(很少见)。如果APK或设备配置发生变化,那么当对Zygote ARM的请求启动时,它应该在开始一个新的之前检查Zygote Mips中的应用程序进程。

是的,Zygote是线程安全的。

编辑:

请注意,Build对象的SUPPORTED_ABIS列表定义为:

  

此设备支持的ABI的有序列表。

http://developer.android.com/reference/android/os/Build.html#SUPPORTED_ABIS

我使用ARM和Mips作为示例 - 一个更明显的例子可能是x86和x86_64,类似于Windows在同一设备上运行32位和64位代码的方式。