安卓中的Binder架構是什麼?為什麼要提供Binder?Service與Binder又有怎樣的聯繫?
為什麼Android要採用Binder作為IPC機制? - weishu 的回答Binder學習指南 - 維術不多的Android技巧 - 知乎專欄
一兩句說不清楚,建議還是看書吧。《深入理解Android卷1》第6章--深入理解Binder;
《深入理解Android卷2》第2章--深入理解Java Binder和MessageQueue;
《Android內核剖析》第5章--Binder;《Android系統源代碼情景分析》第5章--Binder進程間通信系統。關於樓主問的3個問題,簡單說
(1)Binder架構:Binder是採用Client/Server架構,上層應用作為Client端向Android系統(系統作為Server端)請求服務,這個請求過程通過Binder IPC來完成的;
(2)Binder選擇理由:Binder是從性能、穩定性、安全性、語言層面4個角度綜合考慮的結果;
(3)Service與Binder的聯繫:Android OS中的Service幾乎都是基於Binder通信的。例如:ActivityManagerService(用於控制Activity、Service、進程等) 這個服務作為Server端,間接繼承Binder類,而相應的ActivityManager作為Client端,間接繼承於BinderProxy類。
我在知乎的另一個問題,剛詳細地回答的類似的問題,為了不產生重複,可查看:
為什麼Android要採用Binder作為IPC機制? - Gityuan的回答就是一個binder driver,兩個process各有一塊內存被那個driver管理,然後所有ipc都通過那個driver進行傳送,然後有一個service manager進程,管理所有service/client id和所屬memory的映射關係。
說實在的,是一個非常簡單粗暴的手段,弄了半天就是在linux kernel上硬是架起一個類似微內核那種message based的ipc機制,這樣就方便像微內核一樣把系統分成許多獨立的service,然後可以hotfix。
但事實上,要做到這樣根本不用整個linux kernel,當時看完那段代碼,真的覺得好簡單粗暴,果然是為了和蘋果搶市場,短時間把幾個半成型的項目拼起來的。
所以以後google放棄linux,自己寫一個kernel我也不覺得奇怪。
要理解Binder,先得明白IPC
要明白IPC,至少得明白C/S model,順帶著還得弄清楚Processes/Threads,Linux kernel的幾個關鍵概念。除此之外,一些基礎的Java語法,C++語法(如果你打算看native層的代碼的話),Android基本組件以及一些設計模式相關概念也都是你需要準備好的。相信我,如果一個環節沒有弄清楚,那麼Binder的拼圖就永遠完整不了。這裡有個網頁PPT對Binder的介紹我覺得說得還算淺顯,可以結合著官網的說明文檔一塊看:Deep Dive into Android IPC/Binder Framework at Android Builders Summit 2013Binder定址分為三個過程:1.Service Server會向Context Manager註冊,發送IPC數據,BinderDriver生成節點編號和服務一一對應,以及Binder節點和Binder引用文件一一對應。2.服務客戶端向Context Manager發送IPC數據,查詢服務的編號,這個編號和服務,以及Binder節點以及Binder引用一一對應。3.服務客戶端訪問Service Server的服務,通過編號對應到Binder節點和服務,直接對Service Server進行訪問具體看我的博客:Android Binder IPC詳解-Android學習之旅(96)Android Binder IPC詳解-Android學習之旅(96)
1.Binder是什麼?Binder是一個管理各種系統服務的管理者。來一個自認為形象的比喻:當一個進程需要使用服務時,它向Binder提出請求,binder根據請求類型找到對應的服務並發送請求,服務管理者講回複發送給Binder,Binder再將其發送給進程。2.為什麼要設計Binder?便於管理服務,所有的服務都要Binder中進行註冊,這樣可以直接把請求發給Binder,由Binder來查找對應的服務,這樣進程請求服務不僅清晰,而且方便關鍵 3.service要在binder中註冊
推薦這一篇:Binder學習指南Binder學習指南
Android中AIDL的幾個類的關係,根據這篇博客,我畫了圖:
一句話概括Binder架構:
Client向驅動請求Server中的遠程對象,驅動返回的是這個遠程對象的Proxy而不是遠程對象本身,Client執行Proxy的方法,其實是將參數序列化後,通過驅動傳遞給Server中的遠程對象來執行,方法有返回值的話再將其序列化後,通過驅動傳遞給Client。
引用《Android內核剖析》
Binder,Android進程通信方式,C/S架構,服務端,Binder通信,客戶端
1.服務端
Binder服務端實際就是Binder類的對象,創建Binder對象,就會啟動隱藏線程,接收Binder驅動發送的消息,執行Binder對象的onTransact()方法,按照函數的參數執行不同的服務代碼。實現Binder驅動,必須重載onTransact()方法。2.Binder驅動創建服務端Binder對象時,同時會在Binder驅動創建mRemote對象,該對象的類型也是Binder類,客戶端訪問遠程服務時,就是通過mRemote對象。3.客戶端客戶端獲取服務端Binder在Binder驅動對應的mRemote對象,重載transact()方法,調用其transact()方法。(一個是服務端的Binder對象,另一個是Binder驅動中的Binder對象)難點 Binder驅動的具體實現:
重點 Binder類 重載onTransact() transact()方法
Service和Binder的聯繫 先說說本地Service 然後說說遠程Service 最後說說系統Service
1.本地Service
2.遠程Service3.系統Service更新中。。。binder是用來跨進程的,重要的東西要放在一個進程裡面單獨運行吧,不可能都運行在一個進程,一個app一個進程,系統服務有一些是在system server中,一些是以linux應用守護進程存在的,這樣也方便自啟。你想在app中誇進程,要涉及到跨進程通信,安卓沒有採用linux的進程間通信方式,什麼管道,信號,共享內存了。而是提供了專門的binder驅動。C++層service端實現IIterface介面,裡面有聲明方法和實現方法的介面,一般頭文件中聲明,cpp文件中實現。
binder是android中的一種進程間通訊方式,service可以運行在指定進程中,所以其他context與其通訊時用binder,
推薦閱讀:
※如何在android studio中查看當前使用的gradle版本和gradle插件版本?
※安卓後台程序為什麼不能徹底關閉?
※有哪些較好的,並用於實際生產中的 Android 熱修復方案?
※Android 系統手機的音樂播放器有哪些推薦?
※安卓應用怎樣去廣告?