1. 程式人生 > >Android binder機制---概述

Android binder機制---概述

1.程序間通訊的原因

目前作業系統都使用虛擬儲存技術,管理記憶體。

假設是32位機器,0-3G是使用者空間,3-4G是系統使用。虛擬記憶體和邏輯記憶體都按4K分頁。這樣虛擬記憶體和邏輯記憶體就存在對應關係。

一個程序只能操作自己的記憶體,無法直接訪問其他的程序的物理頁。

系統程序可以訪問所有的物理應用空間。

程序通訊的本質是資料段互動。

2.程序間通訊的方式

作業系統提供一種共享記憶體的方式來進行通訊。

可以把2個程序的一塊虛擬記憶體,對映為同一個實體地址,這樣資料就可以互動,但是不同程序需要自己控制讀寫,管理起來很麻煩。

還有一種方式就是,共享同一塊kernel記憶體,這樣,通過這塊kernel可以互動資料,於是我們把kernel當作資料互動的媒介。

3.使用者和核心空間的通訊

  1.系統呼叫:系統呼叫是核心提供給應用程式的介面。應用對底層硬體的操作大部分都是通過系統來完成的。

  2.netlink,使用socket API就可以進行。

  3.Procfs:是比較老的一種互動方式。

  4.Sysctl:是一種使用者應用來設定和獲得執行時的核心配置引數的一種有效方式。

4.Android 程序間通訊---binder

  Why Binder?

  常見的Linux的程序間通訊機制。

  1. 管道:在建立時分配一個page大小的記憶體,快取區大小比較有限;
  2. 訊息佇列:資訊複製兩次,額外的CPU消耗;不合適頻繁或資訊量大的通訊;
  3. 共享記憶體

:無須複製,共享緩衝區直接付附加到程序虛擬地址空間,速度快;但程序間的同步問題作業系統無法實現,必須各程序利用同步工具解決;
  4. 套接字:作為更通用的介面,傳輸效率低,主要用於不通機器或跨網路的通訊;
  5. 訊號量:常作為一種鎖機制,防止某程序正在訪問共享資源時,其他程序也訪問該資源。因此,主要作為程序間以及同一程序內不同執行緒之間的同步手段。
  6. 訊號: 不適用於資訊交換,更適用於程序中斷控制,比如非法記憶體訪問,殺死某個程序等;

  Android核心也是基於Linux的,難道那麼多的linux社群優秀工程師沒有想到binder這樣一個優秀的系統嗎?事實並非如此。

  五個方面闡述android 使用binder機制原因。

  1.資料拷貝:binder機制只要一次copy,其他機制需要2次copy,只有共享記憶體不需要copy記憶體。

  2.穩定性:binder使用經典的C/S架構,client 和Server端相對獨立,穩定性好。而共享記憶體實現方式複雜,同步方式系統不支援,需要自己開發。

  3.安全性:linux的IPC機制,是無法指導UID/PID的。從而無法鑑別身份。Android為每個app分配UID。binder基於C/S架構,當client端連線server端的時候,server端回check許可權,在android手機上,就會彈出許可權確認的框。

  4.語言層面:linux是基於C語言的,而andriod是基於面向物件的。binder恰恰是面向物件的,將程序間通訊,轉化為對另一個程序物件的引用。其獨特之處,就是binder物件作為一個可以跨程序引用的物件,它的實體位於一個程序中,而它的引用遍佈於各個程序中,大家使用同一個進度物件,就像面向物件的類一樣,可以供各個系統使用。binder弱化了程序間通訊概念,使得呼叫就像同一個程序一樣。這就把程序間的通訊演化為面向物件類的呼叫,所以binder是為android量身定製的

  5.公司戰略考慮。 linux是GPL協議,Google巧妙的把這個協議圍在核心層,使得使用者層,手機廠商使用Apache-2.0協議,保護了廠商的利益。

  一般來說,新增一個IPC機制,需要修改kernel程式碼,需要liunx分配新的系統編號。所以一般採用虛擬裝置的方式,以驅動模組的方式,完成需要在核心完成的功能

  一般設計可以建立一個偽裝置來作為應用與核心之間進行資料交換的渠道。最常用的做法是使用偽字元裝置,然後通過icotl,mmap,open,read,write,close這些標準的系統呼叫和這個裝置互動。

  IPC(inter-process communication)概述:

  所有的IPC本質上都是類似的,就是把client端的資料,通過核心空間,傳遞到另外一個程序Server端。

  Binder IPC原理:

  Binder回多一個ServiceManager(c++層)來管理所有的server端。所以server端都需要註冊到smgr,而client端就需要從smgr獲取server端的IBinder物件。

  

  圖中的Client,Server,ServiceManager都是通過binder機制進行通訊的,所有也就有Client端 & Server端。

  註冊服務:Server 程序要先進行 註冊到Smgr,該過程,Server是客戶端,Smgr是服務端。(註冊的是什麼?)

  獲取服務:Client 程序要獲取Server,需要獲取相應的service。(獲取的是什麼?)該過程:Client端是客戶端,Smgr是服務端。

  使用服務:Client端得到與Server的資訊,建立與Server的通路。這樣Client就可以和Server進行通訊。

  C/S模式:

  BpBinder:  BpBinder,transact,傳送事物資訊。

  BbBinder:  BbBinder,onTransact,接收事物資訊。

參考文獻:

http://gityuan.com/2015/10/31/binder-prepare/          

相關推薦

Android binder機制---概述

1.程序間通訊的原因 目前作業系統都使用虛擬儲存技術,管理記憶體。 假設是32位機器,0-3G是使用者空間,3-4G是系統使用。虛擬記憶體和邏輯記憶體都按4K分頁。這樣虛擬記憶體和邏輯記憶體就存在對應關係。 一個程序只能操作自己的記憶體,無法直接訪問其他的程序的物理頁。 系統程序可以訪問所有的物理應用

android Binder機制

pro end abs close 概念 exp 是的 一切都 實例化 Binder 架構設計 Binder 被設計出來是解決 Android IPC(進程間通信) 問題的。Binder 將兩個進程間交互的理解為 Client 向 Server 進行通信。 如下:binde

Android Binder機制淺析

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Android Binder機制原理

Binder是Android系統程序間通訊(IPC)方式之一。Linux已經擁有的程序間通訊IPC手段包括(Internet Process Connection): 管道(Pipe)、訊號(Signal)和跟蹤(Trace)、插口(Socket)、報文佇列(Messag

Android Binder機制原理(史上最強理解,沒有之一)(轉)

Binder是Android系統程序間通訊(IPC)方式之一。Linux已經擁有的程序間通訊IPC手段包括(Internet Process Connection): 管道(Pipe)、訊號(Signal)和跟蹤(Trace)、插口(Socket)、報文佇列(Messag

Android - Binder機制 - ProcessState和IPCThreadState

以下幾篇文章是較深入分析binder機制。 目錄 1. Android - Binder機制 - ServiceManager 2. Android - Binder機制 - 普通service註冊 3. Android - Binder機制 - 獲得普通service 4. A

[Android]廣播機制概述

廣播簡單描述 Android廣播分為兩個方面:廣播發送者和廣播接收者,通常情況下,BroadcastReceiver指的就是廣播接收者(廣播接收器)。廣播作為Android元件間的通訊方式,可以使用的場景如下:1 Note:

藉助 AIDL 理解 Android Binder 機制——Binder 來龍去脈

AIDL 是 Android Interface Definition Language(Android 介面定義語言)的縮寫,它是 Android 程序間通訊的介面語言。由於 Android 系統的核心是 Linux,它採用了程序隔離機制,使得不同的應用程式執行在不同的程序當中,有時候兩個應用之間需要傳遞或

Android Binder機制之 ServiceManager的啟動

Android Binder機制的ServiceManager    對於Android 來說,Binder程序間的通訊機制幾乎無處不在,可以說是整個Android系統中各個元件之間互動的靈魂。所以,想要深入的理解Android 中程序間通訊的機制,還是需要對Binder機制

藉助 AIDL 理解 Android Binder 機制——AIDL 的使用和原理分析

在上一篇文章——藉助 AIDL 理解 Android Binder 機制——Binder 來龍去脈中我們已經分析了使用 Binder 機制的原因以及分析了 Binder 機制,本章我們將繼續從 AIDL 的使用過程體驗 Binder 在應用層的使用和原理。 AIDL 使用步驟 1.建立 UserManag

Android Binder機制詳解:手寫IPC通訊

想要掌握一樣東西,最好的方式就是閱讀理解它的原始碼。想要掌握Android Binder,最好的方式就是寫一個AIDL檔案,然後檢視其生成的程式碼。本文的思路也是來自於此。 簡介 Binder是Android常用的一種程序間通訊方式。當然,不使用Binder,你還可以使用Socket甚至檔案來進行通訊。

Android Binder機制的Native應用—雙向通訊

mkdir testbinder  //建立testbinder目錄 Android.mk include $(call all-subdir-makefiles) 一、介面類 1.正向呼叫—Itestbinder Itestbinder.h #ifndef Itestb

Android Binder機制完全解析

概述 之前我寫過一篇文章Android Service全面解析,簡單實現瞭如何通過AIDL實現Service的跨程序通訊(IPC),其實是通過Binder機制來實現的,本文我們就重點來看看Binder機制的原理。 Binder可以提供系統中任何程式都可以訪問

Linux與android程序間的通訊及android Binder機制詳解

關於程序之間的通訊又很多種方式,不同的方式適用於不同的場景。 五種不同形式的IPC形式 1.訊息傳遞(管道,FIFO和訊息佇列) 2.同步(互斥量,條件變數,讀寫鎖,檔案和記錄鎖,訊號量) 3.共享記憶體(匿名的和具名的) 4.遠端過程呼叫(Solaris門和Sun R

Android Binder機制原理(史上最強理解,沒有之一)

Binder是Android系統程序間通訊(IPC)方式之一。Linux已經擁有的程序間通訊IPC手段包括(Internet Process Connection): 管道(Pipe)、訊號(Signal)和跟蹤(Trace)、插口(Socket)、報文佇列(Messa

走進Android Binder機制(驅動篇上)

由於篇幅限制,驅動篇文章分為上下兩章,還請大家注意,此篇是上篇。 Binder的實現是比較複雜的,想要完全弄明白是怎麼一回事,並不是一件容易的事情。 這裡面牽涉到好幾個層次,每一層都

Android Binder機制——ServiceManager的啟動

基於Android 7.0原始碼,分析ServiceManager的啟動過程。 binder驅動的初始化是binder_init函式 一、概述   ServiceManager是整個Binder IPC通訊過程中的守護程序,本身也是一個Bind

深入理解Android Binder機制的幾點

Android系統Binder機制中的四個元件:Client,Server,Service Manager和Binder驅動程式。 1. Client、Server和Service Manager實現在使用者空間中,Binder驅動程式實現在核心空間中 2. Binder

Android Binder機制淺析(三)

接上文... 本文根據網上現有資源進行整合,以及自己的理解,有誤之處歡迎指正~~ 三、MediaService的執行 由2.6中的分析,可知defaultServiceManager得到了BpServiceManager, 然後MediaPlayerService 

Android Binder機制AIDL例項介紹

相關文章推薦: 前言 我們知道,Android的底層是使用Linux核心執行的,而Linux為了保證系統的穩定性,使用的是程序隔離的機制,也就是讓不同的程序執行在不同的虛擬空間,使得不同程序之間無法共享資料,防止資料的篡改。關於多程序帶下進行開發的介紹上面連結中已