Binder native層原始碼分析

2021-10-01 16:58:07 字數 1892 閱讀 1802

binder是android系統下的ipc通訊機制,程序間的通訊,包括系統服務的呼叫,都需要通過binder來進行。看了很多講解binder native層執行原理的書和部落格,我大概對native層的binder執行過程有了乙個認識。但總覺得自己對binder的理解不夠深入,無法理解其中很多的實現細節,想要更加深入地理解binder,還是得自己親自過一遍原始碼,做乙個總結。

很多書和部落格都以系統服務為例子來分析binder,我曾嘗試過拋開系統服務,用一種更一般的方式去分析原始碼。但binder實在是太大了,其中牽扯到很多的協議,導致原始碼中存在眾多的分支,多個分支一起分析的方式使得我之前的文章雜亂無章,甚至把我自己也搞暈了。要想講清楚各種協議,分支間的功能和關係,還是要以某個服務為例子,限定資料的協議,每次分析**執行過程時僅走乙個分支。事實上,分析系統服務的過程基本能把binder原始碼中的所有重要分支都走一遍,這也是為什麼很多人都選擇用系統服務來講解原始碼的原因。這是我在寫binder原始碼分析博文時候繞的彎路,特此記錄一下。

在分析之前,首先要知道binder使用的ipc模型是遠端過程呼叫,是基於訊息的ipc,訊息在binder中被稱為事務。接收方接收到事務後根據事務的型別和內容呼叫不同的過程,可以看作跨程序的函式呼叫。

然後是要知道service manager,它是管理服務端和客戶端的機構,並且它自身也是乙個服務端。例如當某個服務程序想要在service manager中註冊時,這個服務向service manager傳送註冊請求,此時該服務是本次通訊的客戶端,service manager是服務端。service manager主要擔當乙個中間介紹人的作用,當某個客戶程序想要獲取某個服務時,它會向service manager傳送查詢請求,service manager會向該客戶返回該服務的查詢結果。

我分析的是binder native層的**,分為六篇。第一篇介紹mediaserver,分析mediaserver的啟動過程中獲取service manager以及註冊服務的過程。同時為之後分析binder通訊過程做好通訊資料上的準備,即mediaserver向service manager註冊過程中傳送的資料內容是什麼。

binder native層原始碼分析(一):media_service的啟動

第二篇介紹parcel類,parcel是binder通訊過程中的資料報,理解parcel的結構和實現原理有助於我們看懂binder中服務端客戶端很多的處理**。而parcel傳輸的object型別(flat_binder_obj)更是我們之後理解binder各實體之間是怎麼產生聯絡的關鍵。

binder native層原始碼分析(二):parcel類

第三篇介紹bpbinder,分析native層是怎麼把資料一步步交給驅動的,在這過程中寫入了什麼協議,傳給了驅動什麼引數。

binder native層原始碼分析(三):bpbinder通訊類

第四篇分析驅動**,看驅動是怎麼把資料交給service manager,又是怎麼處理資料中的object的。沒看驅動**之前我一直困惑object到底是什麼?看完驅動**之後我才弄明白了上面問題的答案。這是最難的一部分,也是理解binder底層實現最關鍵的一部分。

binder native層原始碼分析(四):binder驅動將資料發往sm

第五篇分析service manager,看service manager怎麼從驅動中讀取資料,又對註冊服務的請求作出了怎樣的處理。

binder native層原始碼分析(五):sm對資料的接收以及處理

binder native層原始碼分析(六):sm返回查詢結果

第七篇介紹bbinder,對第三篇的內容做乙個補充。我自己是在看完了驅動和sm的**後才理解清楚bbiner的工作原理,所以我把bbinder的介紹放到四五六篇之後。

binder native層原始碼分析(七):bbinder

binder對執行緒的管理

transaction_stack的作用

AbstractCollection原始碼分析

abstractcollection抽象類提供了collection的骨架實現,collection分析請看 這裡直接看它的 是如何實現的.public abstract iterator iterator 該方法沒有實現.public abstract int size 該方法沒有實現.publi...

ThreadPoolExecutor原始碼閱讀

執行緒池解決兩個問題 一是復用執行緒,減少建立銷毀執行緒帶來系統開銷 二是限定系統資源使用邊界,避免大量執行緒消耗盡系統記憶體 適用於互不依賴,執行時間短,不需要對執行緒控制操作的執行緒 新增任務時,1.若執行緒數量小於corepoolsize,則新增執行緒執行任務 2.若執行緒數量大於等於core...

OrangePi One Android 原始碼編譯

一 系統環境搭建參照 二 lichee原始碼編譯 1.檢視help build.sh h2.配置核心 cd linux 3.4 make arch arm menuconfig 進入配置頁面,上下移動列表,空格是選擇列表,左右移動選擇退出選項 3.首次編譯執行清除 在 lichee linux3.4...