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