1. 程式人生 > >Android Framework學習(九)之Binder概述

Android Framework學習(九)之Binder概述

Android系統中,每個應用程式是由Android的Activity,Service,Broadcast,ContentProvider這四大元件的中一個或多個組合而成,這四大元件所涉及的多程序間的通訊底層都是依賴於Binder IPC機制。不僅於此,整個Android系統架構中,大量採用了Binder機制作為IPC(程序間通訊)方案,當然也存在部分其他的IPC方式,比如Zygote通訊便是採用socket。

IPC原理

這裡寫圖片描述

每個Android的程序,只能執行在自己程序所擁有的虛擬地址空間。對應一個4GB的虛擬地址空間,其中3GB是使用者空間,1GB是核心空間,當然核心空間的大小是可以通過引數配置調整的。對於使用者空間,不同程序之間彼此是不能共享的,而核心空間卻是可共享的。Client程序向Server程序通訊,恰恰是利用程序間可共享的核心記憶體空間來完成底層通訊工作的,Client端與Server端程序往往採用ioctl等方法跟核心空間的驅動進行互動。

Binder原理

Binder通訊採用C/S架構,從元件視角來說,包含Client、Server、ServiceManager以及binder驅動,其中ServiceManager用於管理系統中的各種服務。架構圖如下所示:
這裡寫圖片描述

可以看出無論是註冊服務和獲取服務的過程都需要ServiceManager,需要注意的是此處的Service Manager是指Native層的ServiceManager(C++),並非指framework層的ServiceManager(Java)。ServiceManager是整個Binder通訊機制的大管家,是Android程序間通訊機制Binder的守護程序,要掌握Binder機制,首先需要了解系統是如何首次啟動Service Manager。當Service Manager啟動之後,Client端和Server端通訊時都需要先獲取Service Manager介面,才能開始通訊服務。

圖中Client/Server/ServiceManage之間的相互通訊都是基於Binder機制。既然基於Binder機制通訊,那麼同樣也是C/S架構,則圖中的3大步驟都有相應的Client端與Server端。

1.註冊服務(addService):Server程序要先註冊Service到ServiceManager。該過程:Server是客戶端,ServiceManager是服務端。
2.獲取服務(getService):Client程序使用某個Service前,須先向ServiceManager中獲取相應的Service。該過程:Client是客戶端,ServiceManager是服務端。
3.使用服務:Client根據得到的Service資訊建立與Service所在的Server程序通訊的通路,然後就可以直接與Service互動。該過程:client是客戶端,server是服務端。

圖中的Client,Server,Service Manager之間互動都是虛線表示,是由於它們彼此之間不是直接互動的,而是都通過與Binder驅動進行互動的,從而實現IPC通訊方式。其中Binder驅動位於核心空間,Client,Server,Service Manager位於使用者空間。Binder驅動和Service Manager可以看做是Android平臺的基礎架構,而Client和Server是Android的應用層,開發人員只需自定義實現client、Server端,藉助Android的基本平臺架構便可以直接進行IPC通訊。

C/S模式

BpBinder(客戶端)和BBinder(服務端)都是Android中Binder通訊相關的代表,它們都從IBinder類中派生而來
這裡寫圖片描述

client端:BpBinder.transact()來發送事務請求;
server端:BBinder.onTransact()會接收到相應事務。

相關推薦

Android Framework學習()Binder概述

Android系統中,每個應用程式是由Android的Activity,Service,Broadcast,ContentProvider這四大元件的中一個或多個組合而成,這四大元件所涉及的多程序間的通訊底層都是依賴於Binder IPC機制。不僅於此,整個An

Android Framework學習(四)Launcher啟動流程解析

在之前的部落格中,我們學習了init程序、Zygote程序和SyetemServer程序的啟動過程,我們知道SystemServer程序主要用於啟動系統的各種服務,二者其中就包含了負責啟動Launcher的服務,LauncherAppService,本篇部落格我

Android Binder學習(一)Binder中的資料結構

 備註:雙向箭頭表示雙向連結串列,各成員是串聯起來的。    在分析Android framework程式碼時,遇到最多的就是binder程序間通訊了。如果只知道怎麼用,也不影響我們日常的工作。但如果你想閱讀binder原始碼,就需要花點時間了。相對與linux核心來說,A

Android開發藝術探索學習-IPCBinder(一)

1. Binder簡介 1.1 What is Binder?     Android Dev Doc:Base class for a remotable object, the core part of a lightweight remote procedure

JavaSE 學習筆記Java概述(一)

environ 電子 6.0 run javase 有一點 架構 spa form 一、Java的三種技術架構: JAVAEE:Java Platform Enterprise Edition,開發企業環境下的應用程序,主要針對web程序開發; JAVASE:Java P

iOS學習UIActivityIndicatorView

UIActivityIndicatiorView被稱為活動指示器控制元件,通常用於載入複雜資料的檢視時使用。在載入等待時間中給使用者一些介面活動的指示,不至於出現使使用者感覺到介面卡死的假象。 新增以下程式碼,即可完成此功能     override func viewDid

Android O 學習(一)HAL型別

備註:這裡已Camera模組為例,如問題,歡迎討論。   以往的hal和framwork的程式碼緊密聯絡起來的,為此google為了framework 升級的方便在Android 8.0 上對 Android 作業系統底層進行了重新架構。新的架構已經瞭解一部分,但仍需要不斷學習,加上

Android NDK學習起航先買一艘船

      感覺Android寫了這麼久了, 也該學點裝逼的技能了。所以我把目光放在了NDK和C++上,只要玩轉了這兩個, 我就能去玩OpenCV和TensorFlow了,想想就美滋滋。今天先來基礎配置一個最簡單的NDK環境。基於AndroidStudio 3.2,使用Cma

Android FrameWork學習(二)Android系統原始碼除錯

為了更進一步地學習跟研究 Android 系統原始碼,今天我們來講講如何進行 Android 系統原始碼的除錯,只有學會了如何進行系統原始碼的除錯,才能幫助我們更高效地閱讀跟理解原始碼。 我們知道,Android Framework 的程式碼主要由Java、C\

Android FrameWork學習(一)Android 7.0系統原始碼下載\編譯

最近計劃著研究下Android 7.0的系統原始碼,之前也沒做過什麼記錄,這次正好將學習的內容記錄下來,方便以後複習鞏固。 既然要學習我們的系統原始碼,那我們第一步要做的就是下載原始碼並進行編譯了。 硬體環境要求 1. 編譯環境 按照官方的說

Android開發學習資源(二)

1.Android開源專案分類彙總(很多特效) https://github.com/Trinea/android-open-project 2.Android開發技術週報(AndroidDevWeekly) http://www.androidweekly.cn/tag/

Android開發學習資源(一)

1.Android效能優化(包括記憶體優化)一系列文章 http://androidperformance.com/categories/Android/http://www.csdn.net/article/2015-04-29/2824583-android-perfo

Android開發學習資源(四)

1.OrmLite資料庫框架 http://ormlite.com/ 2.JSON解析框架GSON https://github.com/ybonnel/gson 3.Android-query框架 http://www.cnblogs.com/lee0oo0/archiv

Android開發學習資源(三)

1.開源框架原始碼解析 http://www.codekk.com/open-source-project-analysis 2.Android開源專案(很多型別框架開源) http://blog.ithi.net/wordpress/?p=153http://litesu

Android Framework 學習計劃 & 職業發展規劃

具體的職業發展規劃和技能特點: 路徑:技術為王的職業發展路線   晉升軌跡:Android初級開發程式設計師--(1個月)--中級--(3個月)--高階--(1年)--軟體架構師--(1年)--系統架構師--(3年)--專案經理--(5年)--首席技術官 各階段對於技能要素的要求: 入門初級階段:目標是熟悉

Android Framework學習筆記 -- Audio調節音量流程

Audio調節音量流程 Audio音量調節是一級一級調節,而且分不同的流型別,如響鈴,通話,多媒體等。不同的裝置(藍芽裝置)的設定方法有所區別。 sdk的api,設定相應流的音量。不同的流index的範圍不一樣 //--->frameworks/b

Android程式設計學習筆記 File資料儲存

File檔案可用來存放大量資料,如文字、圖片、音訊、視訊等。 在Android的資料儲存操作和Java中的IO流差不多的用法。 進行File資料儲存的步驟如下: ①開啟一個File物件 ②開啟一個FileOutputStream檔案輸出流,寫入資料 ③開啟一個FileIn

Android程式設計學習筆記 Fragment與Activity的資料傳遞

傳遞方向的不同: ①Activity----->Fragment: 在Activity中建立Bundle資料包,並呼叫Fragment的setArguments(Bundle bundle)方法 ②Fragment----->Activity: 需要在Frag

Android Framework學習——Launcher啟動應用程式過程原始碼分析

        ActivityInfo aInfo = r.activityInfo;         if (r.packageInfo == null) {             r.packageInfo = getPackageInfo(aInfo.applicationInfo,      

Android 動畫學習(一)View Animation

Android動畫初步         動畫(Animation)在我們日常的Android開發工作當中使用得較為頻繁,尤其對於Android遊戲這個動畫的集合體,掌握動畫開發的重要性毋庸置疑。同