繁体   English   中英

Android本机代码fork()与IPC /活页夹有关

[英]Android native code fork() has issues with IPC/Binder

我有一个Android本机服务器应用程序编译为分叉自身的平台特权模块。 此模块还使用Android服务,例如SurfaceFlinger。 我需要让每个客户端拥有一个沙盒进程。

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代码,但没有找到任何有用的方法。 我可能缺少某些步骤或在子进程上调用了某些函数。 有任何想法吗 ??? =)

您不能以这种方式创建新的Binder流程。

问题在于fork()仅克隆当前线程,而不克隆所有线程。 在新的过程中,Binder IPC代码将期望Binder帮助程序线程正在运行,但是没有一个将在运行。 您需要fork()然后是exec()

zygote进程通过在调用fork()时仅运行一个线程来避免此问题。 它故意将Binder代码的初始化推迟到子进程。 (在当前实现中,它实际上有几个在Dalvik中运行的线程,但是内部fork处理会停止并在每个fork上重新启动那些线程)。

fadden是正确的,不能使用fork()创建可靠使用Android API的新进程。 最好用exec()来运行一个独立的命令行程序,否则所有其他操作都可能无法按预期工作。

但是,该平台以隔离服务流程的形式支持沙盒流程。 有关更多详细信息,请参见http://developer.android.com/guide/topics/manifest/service-element.html#isolated 本质上,这将在没有权限的随机UID下以特殊过程运行您的服务。

记录下来,这就是Android上的Chrome用来将“标签”隔离到沙盒“渲染器进程”中的功能。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM