【问题标题】:Android native code fork() has issues with IPC/BinderAndroid 本机代码 fork() 与 IPC/Binder 存在问题
【发布时间】:2014-10-13 17:21:53
【问题描述】:

我有一个 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 代码,但没有发现任何有用的东西。我可能错过了一些步骤或在子进程上调用了一些函数。有任何想法吗 ??? =)

【问题讨论】:

    标签: android android-ndk


    【解决方案1】:

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

    问题是fork() 只克隆当前线程,而不是所有线程。在新进程中,Binder IPC 代码将期望 Binder 辅助线程正在运行,但它们都不会运行。你需要fork(),然后exec()

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

    【讨论】:

    • 您认为尝试这样做是否可行?停止并重新启动线程或按照 Digit 建议的其他方法?
    • 您将无法停止并重新启动进程中的所有线程。按照数字的解决方案。
    【解决方案2】:

    fadden 是对的,fork() 不能用于创建可靠地使用 Android API 的新进程。你可以用它做的最好的事情是 exec() 来运行一个独立的命令行程序,其他的一切都可能不会像你期望的那样工作。

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

    为了记录,这是 Android 上的 Chrome 用来将“标签”隔离到沙盒“渲染器进程”中的方法。

    【讨论】:

    • 感谢您的链接,我想如果 Chrome 使用它可能是实现此目的的好方法。如果我不能“克隆”Zygote 的行为,我会看看它。
    猜你喜欢
    • 2016-11-02
    • 2018-06-13
    • 1970-01-01
    • 2011-06-23
    • 2011-11-20
    • 1970-01-01
    • 2015-12-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多