複習、複習、複習
你是否了解binder機制?
binder這麼好用,那為什麼zygote的ipc通訊機制用socket而不用binder?
為什麼說binder是安全的?
intent跨程序傳大圖為什麼會崩潰?
aidl的oneway和非oneway有什麼區別?
本文將針對以上問題進行原理分析
inter-process communication 簡稱 ipc ,即為程序間通訊。android與liunx都有自己的ipc機制。雖然說android是繼承自linux的,但是ipc通訊機制並不是完全繼承的。如果要你設計一套程序間通訊,你會如何設計,資料簡單傳遞流程是如何的?
非oneway
在剛入門android開發時,可能會直接通過intent傳遞bitmap,然後發現transactiontoolargetexception
異常。這是為什麼呢?那又該如何解決呢?
1、你是否了解binder機制?
根據第二節的binder通訊架構圖,從手機啟動過程中的一些程序闡述
binder分層架構圖
binder的oneway和非oneway資料傳遞圖
binder的優缺點: 效能(拷貝一次)、安全(校驗uid、pid)
2、binder這麼好用,那為什麼zygote的ipc通訊機制用socket而不用binder?
如果用了binder,zygote要先啟動binder機制,開啟binder驅動,獲得描述符,mmap程序記憶體對映,註冊binder執行緒,還要建立乙個binder物件註冊到servicemanager,另外ams要想zygote發起建立應用程序請求的話,要先從servicemanager查詢zygote的binder物件,再發起binder呼叫,非常繁瑣。
相比之下,zygote和systemserver本就是父子關係,對於簡單的訊息通訊,用管道或者socket非常方便。
如果zygote用了binder機制,再fork systemserver,那systemserver就繼承了zygote的描述符和對映的記憶體,這兩個程序在binder驅動層就會共用一套資料結構,這肯定是不行的。那還得把舊的描述符關掉,再重新啟動一遍binder機制,自找麻煩。
3、為什麼說binder是安全的?
在資料傳輸過程中有身份的校驗,通過uid、pid進行校驗
4、intent跨程序傳大圖為什麼會崩潰?
常規的intent傳遞資料,在startactivity時將bundle的 allowfds 設定成了false, 然後就會將 bitmap直接寫到 parcel 緩衝區。如果通過 bundle.putbinder形式傳遞bitmap,會開闢乙個塊共享匿名記憶體用來存bitmap的資料,而parcel 緩衝區只是儲存 fd 。
5、aidl的oneway和非oneway有什麼區別?
oneway和非oneway的架構圖,oneway server端是序列處理,非同步呼叫,client端不用休眠等待驅動返回資料。
android binder機制詳解
1.直觀來說,binder是android中的乙個類,它繼承了ibinder介面 2.從ipc角度來說,binder是android中的一種跨程序通訊方式,binder還可以理解為一種虛擬的物理裝置,它的裝置驅動是 dev binder,該通訊方式在linux中沒有 3.從android frame...
Android Binder學習趣事
看android原始碼無論如何繞不開binder,因此我一直對binder的實現機制有濃厚的興趣。無奈本人功力不夠,所以對此一直沒有清晰的認識。看了網上一些分析binder的文章,基本都是原始碼分析,我覺得對於binder這樣一種比較複雜的框架,最好不要一開始就進入到原始碼這麼細節的層面,很容易找不...
Android Binder學習資料整理
1.binder相關資料結構 2.android深入淺出之binder機制 binder使用流程 3.android binder設計與實現 設計篇 原理 4.android程序間通訊 ipc 機制binder簡要介紹和學習計畫 1.service manager是如何成為乙個守護程序的?即serv...