Android Native Binder,在Native層與App交互數據

    Binder底層是基於C實現的,所以能夠做爲Native進程與App層交互數據的渠道。其應用場景爲:Native Service、Hal驅動設置、應用層JNI服務等。html

    Android 4.4引入SEAndroid/SELinux 安全機制,至Android 5.0之後,Android徹底採用此安全機制,對應用訪問和操做文件權限進行限制,採用管道、共享內存、LocalSocket等方式進行跨進程交互面臨着文件訪問權限問題,若非修改固件源碼的sepolicy文件(AOSP給定路徑爲/device/manufacturer/device-name/sepolicy)賦予進程文件訪問權限,則可能會發生通信失敗。linux

    採用Binder進行進程間通信,是相對標準、優雅、高效的方式。git

C端:github

    在Android8.0如下,需繼承IInterface.h(路徑在/frameworks/native/include/binder/IInterface.h),經過Parcel類(/frameworks/native/include/binder/IParcel.h)完成交互數據傳遞。Android 8.0以上,可採用HIDL語言定義接口,編譯SO庫時系統解析生成C代碼。api

Android端:安全

   可經過AIDL語言定義交互接口,引用Framework.jar(測試

compileOnly files('libs/framework.jar')

),使用ui

ServiceManager.getService(String SERVICE_DESCRIPTOR)方法獲取C層Binder服務。

   兩端需約定使用相同的服務描述符。code

另外,Android  9.0以上增強了對Hal 層 Service的Selinux限制,若是要測試binder,在已root的設備上,可以使用 htm

   setenforce 0

命令,暫時關閉Selinux,進行測試。若是有系統源碼,需設置\system\sepolicy\prebuilts\api\28.0\public 文件夾下的例外規則,從新編譯系統,使得binder通訊不被Selinux限制。

Demo代碼:https://github.com/AceSui/NativeJavaBinder

原文出處:https://www.cnblogs.com/acesui/p/12002758.html

相關文章
相關標籤/搜索