簡體   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