從Android原始碼理解Binder

2021-08-31 19:20:22 字數 1592 閱讀 1907

最近在看android原始碼,看到了binder部分,雖然對於這部分的內容感覺只理解了一小部分,但是畢竟還是看懂了小部分內容,所以想寫篇部落格記錄下自己的理解。

在圖中,對於使用者空間,不同程序之間彼此是不能共享的,而核心空間卻是可共享的。 在編寫應用程式時,如果想要實現binder機制,就需要以上四個元件間相互協作 ,操作流程大概如下所述:

1. 服務端建立對應binder例項物件,然後將自身的binder註冊到service manager,接著開啟隱藏binder執行緒,接收來自客戶端的請求,然後解析接收到的資料,決定該執行什麼函式,然後將返回值發給客戶端

2. 客戶端想和服務端通訊,通過service manager查詢到服務端的binder,然後binder驅動將對應的mremote物件返回 

3. 至此,整個通訊連線建立完畢

在service_manager.c的main函式中,首先使用binder_open開啟binder驅動,接著使用binder_become_context_manager告訴binder驅動它是乙個service_manager.

最後service_manager使用乙個迴圈,即binder_loop方法,在這個方法中先通過res = ioctl(bs->fd, binder_write_read, &bwr)不斷從binder驅動中讀取資料,然後再通過res = binder_parse(bs, 0, (uintptr_t) readbuf, bwr.read_consumed, func)解析資料,最後使用svcmgr_handler方法處理資料。

在 svcmgr_handler方法中,svc_mgr_get_service以及svc_mgr_check_service用於client獲取服務,而svc_mgr_add_service則表示service向service_manager註冊並新增服務。

而對於client獲取服務過程以及service註冊服務的過程,實際上都是先通過binder_open開啟binder驅動,然後呼叫binder_call來實現的,binder_call的具體**如上圖所示。如果引數中target的值為0,則表示servicemanager。

從原始碼理解 ThreadLocal

為每個執行緒儲存各自的拷貝,可以通過在thread類中定義乙個成員變數來儲存每個執行緒值,這樣也是執行緒安全的。通過定義乙個成員變數 sn 來實現,這裡並沒有使用threadlocal類來實現 public class test class sequencenumber 獲取下乙個序列值 publi...

從原始碼的角度理解Android訊息處理機制

與handler共同作用的有looper,messagequeue,message。我麼接下來從原始碼的角度看看整個過程的大概實現。首先說一下每個物件的作用 looper 訊息輪詢循器,不斷的從訊息佇列中取出訊息交給handler處理 messagequeue 訊息佇列,用於儲存從handler傳送...

從Android原始碼來看「Builder模式」

本文主要解釋什麼是builder模式,及其作用。然後結合 android 原始碼來看一下builder模式的實現。什麼是builder模式 build 是構建 建造的意思,builder 模式又稱建造者模式。builder模式中包括兩個核心元素 產品和建造者。這兩者可以比作房屋和磚瓦匠。在建造房屋這...