介紹
在教程一中,我們學習了Android碎片化產生的原因以及解決的方案Treble。在教程二中,我們明白了Treble如何解耦HAL實現和系統framework層,避免在HAL層重複處理。
在本教程中,讓我們開始詳細瞭解Treble前後的主要差異。
Binder變化
爲了使Treble能夠工作並將HAL與核心框架層分離,對現有訂單binder基礎架構進行了大量更改。主要是以下兩個方面。
- 支持多個binder節點實例
- 每個binder設備都對應着自己的selinux上下文環境
- 每個binder設備都有對應的自己的service manager
每個binder設備都有自己的上下文管理器,因此在邏輯上與其它設備分離。
Binder通信變化
上面的Treble架構顯示了Binder通信基礎架構的重要性。所有的跨進程通信都需要使用binder接口。這對開發人員是透明的,就像是本地調用一樣。
實現框架和HAL解耦,binder起着非常重要的作用。binder通信也在Framework和HAL之間使用,通信接口由HIDL定義(Hardware Interface Description Language)。
在Treble中,添加了多個Binder設備。但是,binder驅動程序的核心實現原理並沒有改變。
由於Android框架和HAL現在使用Binder進行相互通信。這種通信大大增加了Binder的流量。
爲了在framework(設備無關)和vendor(設備特定)代碼之間有效的分割Binder流量,Andorid O引入了“Binder Context”的概念。
每個Binder Context都有自己的設備節點和context(service)管理器。你只能通過上下文管理器所屬的設備節點訪問它,並且當Binder node通過特定上下文傳遞時,上下文管理器只能由另一個進程從相同的上下文來進行訪問,從而確保這些域完全隔離彼此。
/dev/binder,/dev/hwbinder&/dev/vndbinder被初始化,並且上下文與它們相關聯。
ServiceManager變化
爲了實現HAL和框架的正確解耦,Treble通過添加兩個管理器來擴展現有的ServiceManager框架。
總而言之,我們現在有3個不同的Manager,它們使用不同的binder節點進行IPC並實現解耦。分別如下
- ServiceManager (/dev/binder)
- HwServiceManager (/dev/hwbinder)
- VndServiceManager (/dev/vndbinder)
binder和vndbinder都使用libbinder.so庫(hwbinder使用libhwbinder.so庫),當打開binder設備時,我們需要調用ProcessState::initWithDriver("/dev/vndbinder")
來指定要打開的binder設備。
ServiceManager
除了現在使用Android.bp(blueprint - 現在Android使用soong和GO語言進行編譯構建代碼)之外,ServiceManager沒有做太多的變化。
VndServiceManager
ServiceManager和VndServiceManager用的是同一份代碼,Android.bp編譯出了兩個名稱不同的程序。
代碼路徑:frameworks/native/cmds/servicemanager
在早期版本的Android中,所有服務都是使用ServiceManager註冊的,它們的獲取與使用也都是通過ServiceManager。
在Android O之後,SeriviceManager僅用於framework和application進程的使用,vendor進程無法使用ServiceManager進行IPC通信。
但是,vendor服務現在可以使用VndServiceManager,這是使用/dev/vndbinder而不是/dev/binder的ServiceManager的新實例。
ServiceManager和VndServiceManager都是使用service_manager.c編譯的。主要區別如下:
- 使用/dev/vndbinder作爲vndservicemanager可執行文件的額外參數
- 使用不同的sepolicy上下文
HwServiceManager
Treble中最重要和區別最大的service manager是HwServiceManager。
由於它使用HIDL [Hardware interface description language 硬件接口描述語言],因此需要大量的修改,與VndServiceManager不同,它無法重複使用
HwServiceManager源碼路徑:system/hwservicemanager
由上面那張藍圖可知,ServiceManager和vndservicemanager使用的都是libbinder庫[使用的binder節點不一樣],hwservicemanager使用的是libhwbinder庫。
參考文章
原文
如果無法訪問原文,你需要的可能是一把梯子~