我有一个Android本机服务器应用程序编译为平台特权模块,它自行分叉。此模块还使用Android服务,如SurfaceFlinger。我需要fork每个客户端有一个沙盒进程。
Fork()工作正常,父进程完全没有问题。但是在子进程中,当我尝试访问任何Android服务/资源时,我得到:
信号11(SIGSEGV),代码2(SEGV_ACCERR),故障地址xxxxxxxx ...... ...
/system/lib/libbinder.so(android :: Parcel :: ipcSetDataReference
...
/system/lib/libbinder.so(android :: BpBinder :: transact
NativeCrashListener(1203):无法找到pid XXXX的ProcessRecord
我查看了Zygote代码,但在那里找不到任何有用的东西。我可能错过了一些步骤或在子进程上调用了一些函数。有任何想法吗 ??? =)
答案 0 :(得分:2)
您不能以这种方式创建新的Binder流程。
问题是fork()
只克隆当前线程,而不是所有线程。在新的过程中,Binder IPC代码将期望Binder帮助程序线程正在运行,但它们都不会运行。您需要fork()
然后exec()
。
zygote进程通过在调用fork()
时只运行一个线程来避免此问题。它故意将Binder代码的初始化推迟到子进程。 (在当前的实现中,它实际上有几个线程在Dalvik中运行,但内部fork处理停止并重新启动每个fork上的那些线程。)
答案 1 :(得分:1)
fadden是对的,fork()不能用于创建一个可靠地使用Android API的新进程。使用它可以做的最好的是exec()来运行一个独立的命令行程序,其他一切可能都不会像你期望的那样工作。
但是,该平台以隔离服务流程的形式支持沙盒流程。有关详细信息,请参阅http://developer.android.com/guide/topics/manifest/service-element.html#isolated。实质上,这是在一个没有权限的随机UID下在特殊进程中运行您的服务。
对于记录,这是Android上的Chrome用于隔离“标签”的内容。进入沙盒'渲染器进程'。