Android Treble結構:Part 3 - Binder基礎架構的改變

介紹

教程一中,我們學習了Android碎片化產生的原因以及解決的方案Treble。在教程二中,我們明白了Treble如何解耦HAL實現和系統framework層,避免在HAL層重複處理。
Capture_001 (6).PNG-70.3kB

Capture_001.PNG-70.7kB
在本教程中,讓我們開始詳細瞭解Treble前後的主要差異。

Binder變化

爲了使Treble能夠工作並將HAL與核心框架層分離,對現有訂單binder基礎架構進行了大量更改。主要是以下兩個方面。

  • 支持多個binder節點實例
  • 每個binder設備都對應着自己的selinux上下文環境
  • 每個binder設備都有對應的自己的service manager

每個binder設備都有自己的上下文管理器,因此在邏輯上與其它設備分離。
Capture_001 (1).PNG-28.8kB

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被初始化,並且上下文與它們相關聯。
Capture_001 (2).PNG-32.5kB

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庫

參考文章
原文

如果無法訪問原文,你需要的可能是一把梯子~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章