Android本机代码fork()与IPC / Binder有问题

时间:2014-10-10 22:38:24

标签: android android-ndk

我有一个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

  • 即使在我尝试创建新客户端时也会发生这种情况,因此,不使用任何以前创建的引用。
  • NativeCrashListener并不了解我的子进程,因此,ActivityManager也可能没有。

我查看了Zygote代码,但在那里找不到任何有用的东西。我可能错过了一些步骤或在子进程上调用了一些函数。有任何想法吗 ??? =)

2 个答案:

答案 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用于隔离“标签”的内容。进入沙盒'渲染器进程'。