Android Binder通訊底層超詳細講解

2021-10-09 15:44:06 字數 2020 閱讀 4668

複習、複習、複習

你是否了解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...