日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Android中的binder機制詳解

瀏覽:11日期:2022-09-19 13:37:27
前言

Binder做為Android中核心機制,對于理解Android系統是必不可少的,關于binder的文章也有很多,但是每次看總感覺看的不是很懂,到底什么才是binder機制?為什么要使用binder機制?binder機制又是怎樣運行的呢?這些問題只是了解binder機制是不夠的,需要從Android的整體系統出發來分析,在我找了很多資料后,真正的弄懂了binder機制,相信看完這篇文章大家也可以弄懂binder機制。

1、Binder是什么?

要理解binder,先要知道IPC,Inter-process communication ,也就是進程中相互通信,Binder是Android提供的一套進程間相互通信框架。用來多進程間發送消息,同步和共享內存。已有的進程間通信方式有一下幾種:

Android中的binder機制詳解

1、Files 文件系統(包括內存映射) 2、Sockets 3、Pipes 管道 4、共享內存 5、Intents, ContentProviders, Messenger 6、BinderAndroid系統中的Binder框架圖如下:

Android中的binder機制詳解

拿Activity舉例從上圖可以看出來:Activity是由ActivityManager來控制的,而ActivityManager其實是通過Binder獲取ActivityManagerService服務來控制Activity的,并且ActivityManager是Android系統FrameWork層的,和應用中的activity不是同一個進程。重點:

1、Binder是Android提供的一套進程間通信框架。

2、系統服務ActivityManagerService,LocationManagerService,等都是在單獨進程中的,使用binder和應用進行通信。

2、Android系統框架

Android中的binder機制詳解

如上圖,Android系統分成三層。最上層是application應用層,第二層是Framework層,第三層是native層。 由下圖可知幾點:1、Android中的應用層和系統服務層不在同一個進程,系統服務在單獨的進程中。

2、Android中不同應用屬于不同的進程中。

Android應用和系統services運行在不同進程中是為了安全,穩定,以及內存管理的原因,但是應用和系統服務需要通信和分享數據。

優點

安全性:每個進程都單獨運行的,可以保證應用層對系統層的隔離。

穩定性:如果某個進程崩潰了不會導致其他進程崩潰。

內存分配:如果某個進程以及不需要了可以從內存中移除,并且回收相應的內存。

3、Binder通信

client請求service服務,比如說Activity請求Activity ManagerService服務,由于Activity和ActivityManagerService是在兩個不同的進程中的,那么下圖是一個很直觀的請求過程。

Android中的binder機制詳解

但是注意,一個進程是不能直接直接操作另一個進程的,比如說讀取另一個進程的數據,或者往另一個進程的內存空間寫數據,進程之間的通信要通過內核進程才可以,因此這里就要使用到進程通信工具Binder了如下圖:

Android中的binder機制詳解

Binder driver通過/dev/binder /dev/binder 提供了 open, release release, poll poll, mmap mmap, flush flush, and ioctl等操作的接口api。這樣進程A和進程B就可以通過內核進程進行通信了。進程中大部分的通信都是通過ioctl(binderFd, BINDER_WRITE_READ, &bwd)來進行的。bwd 的定義如下:

struct binder_write_read { signed long write_size;/* bytes to write */ signed long write_consumed; /* bytes consumed by driver */ unsigned long write_buffer; signed long read_size; /* bytes to read */ signed long read_consumed; /* bytes consumed by driver */ unsigned long read_buffer; };

但是上面還有個問題就是client和service要直接和binder driver打交道,但是實際上client和service并不想知道binder相關協議,所以進一步client通過添加proxy代理,service通過添加stub來進一步處理與binder的交互。

Android中的binder機制詳解

這樣的好處是client和service都可以不用直接去和binder打交道。上面的圖好像已經很完善了,但是Android系統更進一步封裝,不讓client知道Binder的存在,Android系統提供了Manager來管理client。如下圖:

Android中的binder機制詳解

這樣client只需要交給manager來管理就好了,根本就不用關心進程通信相關的事,關于manager其實是很熟悉的,比如說activity的就是由ActivityManager來控制的,ActivityManager是通過Binder獲取ActivityManagerService來控制activity的。這樣就不用我們自己來使用Binder來ActivityManagerService通信了。更進一步,client是如何具體獲取到哪個service的呢?如下圖所示:

Android中的binder機制詳解

在service和binder之間還有一個contextManager,也就是serviceManager,每一個service要先往serviceManager里面進行注冊,注冊完成之后由serviceManager統一管理。 在Android studio中可以通過adb指定打印出當前已經注冊過serviceManager的service。

$ adb shell service list Found 71 services: 0 sip: [android.net.sip.ISipService] 1 phone: [com.android.internal.telephony.ITelephony] … 20 location: [android.location.ILocationManager] … 55 activity: [android.app.IActivityManager] 56 package: [android.content.pm.IPackageManager] … 67 SurfaceFlinger: [android.ui.ISurfaceComposer] 68 media.camera: [android.hardware.ICameraService] 69 media.player: [android.media.IMediaPlayerService] 70 media.audio_flinger: [android.media.IAudioFlinger]

下圖是一次更加完整的client和service的通信流程:

Android中的binder機制詳解

4、Binder框架

在看Binder框架之前,先來看一下,從client發出請求service的完整的流程。

Android中的binder機制詳解

獲取服務過程:

第一步:client要請求服務,比如說在activity中調用context.getSystemService()方法,這個時候serviceManager就會使用getService(name),然后就會調用到native層中的ServiceManagerNative類中的getService(name)方法。

第二步:ServiceManagerNative會通過Binder發送一條SVG_MGR_GET_SERVICE的指令,然后通過svcmgr_handler()調用do_find_service()方法去svc_list中查找到相關的service。

第三步:查找到相應的服務后就會通過Binder將服務傳給ServiceManagerNative,然后傳給serviceManager,最后client就可以使用了。

注意: 服務實在svclist中保存的,svclist是一個鏈表,因此客戶端調用的服務必須要先注冊到svclist中。

注冊服務過程:

第一步: service通過調用serviceManager中的addService方法,然后調用ServiceManagerNative類中的addservice(name)方法。

第二步: ServiceManagerNative會通過Binder發送一條SVG_MGR_ADD_SERVICE的指令,然后通過svcmgr_handler()調用do_add_service()方法往svc_list中添加相應的service。

重點:所有的服務都要先注冊到svc_list中才能被client調用到。svc_list以linkedlist的形式保存這些服務。

Binder結構設計 要了解binder的結構設計,就要了解Android的體系結構,Android是分成application層,framework層native層,以及內核層,Binder設計在每一層上都有不同的抽象。如下圖:

Android中的binder機制詳解

由上圖可知Binder的整體設計總共有四層:1、Java層AIDL。

2、Framework層, Android.os.Binder 。

framework層中最重要的數據結構是transaction,有一下幾個默認的:

Android中的binder機制詳解

3、Native 層: libBinder.cpp

在native層主要是libBinder

Android中的binder機制詳解

4、內核層 內核層的通信都是通過ioctl來進行的,client打開一個ioctl,進入到輪詢隊列,一直阻塞直到時間到或者有消息。

Android中的binder機制詳解

5、Binder中使用的設計模式

1、代理模式(Proxy Pattern ) 在Android中client不是直接去和binder打交道,client直接和Manager交互,而manager和managerProxy交互,也就是說client是通過managerProxy去和binder進行交互的。同時service也不是直接和binder交互,而是通過stub去和binder交互。如下圖。

Android中的binder機制詳解

2、Bridge Pattern 如下圖,應用層也就是Java層要使用MediaPlayer,就要調用native層中的MediaPlayer.cpp,但是MediaPlay.java不是直接去跟JNI打交道,而是通過與MediaPlayerSevice通信,從而經過Binder返回的。

Android中的binder機制詳解

6、Binder與內存映射mmap

Binder IPC 是基于內存映射(mmap)來實現的,但是 mmap() 通常是用在有物理介質的文件系統上的。

比如進程中的用戶區域是不能直接和物理設備打交道的,如果想要把磁盤上的數據讀取到進程的用戶區域,需要兩次拷貝(磁盤-->內核空間-->用戶空間);通常在這種場景下 mmap() 就能發揮作用,通過在物理介質和用戶空間之間建立映射,減少數據的拷貝次數,用內存讀寫取代I/O讀寫,提高文件讀取效率。

而 Binder 并不存在物理介質,因此 Binder 驅動使用 mmap() 并不是為了在物理介質和用戶空間之間建立映射,而是用來在內核空間創建數據接收的緩存空間。

一次完整的 Binder IPC 通信過程通常是這樣:

首先 Binder 驅動在內核空間創建一個數據接收緩存區; 接著在內核空間開辟一塊內核緩存區,建立內核緩存區和內核中數據接收緩存區之間的映射關系,以及內核中數據接收緩存區和接收進程用戶空間地址的映射關系; 發送方進程通過系統調用 copyfromuser() 將數據 copy 到內核中的內核緩存區,由于內核緩存區和接收進程的用戶空間存在內存映射,因此也就相當于把數據發送到了接收進程的用戶空間,這樣便完成了一次進程間的通信。 如下圖:

Android中的binder機制詳解

參考文獻

1、rts.lab.asu.edu/web_438/pro…

2、rts.lab.asu.edu/web_438/pro…

以上就是Android中的binder機制詳解的詳細內容,更多關于Android binder的資料請關注好吧啦網其它相關文章!

標簽: Android
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
午夜一级久久| 日韩精品一级| 欧美精品不卡| 国产剧情一区二区在线观看| **爰片久久毛片| 亚洲视频二区| 午夜性色一区二区三区免费视频| 视频在线在亚洲| 综合激情一区| 欧美日韩xxxx| 美女视频免费精品| 欧美极品中文字幕| 精品国产aⅴ| 日韩1区在线| 中文字幕在线看片| 香蕉久久精品| 蜜桃一区二区三区在线| 亚洲18在线| 国产精品.xx视频.xxtv| 成人午夜网址| 99久久亚洲精品| 蜜桃一区二区三区在线| 国产亚洲电影| 久久久久久一区二区| 99久久亚洲精品蜜臀| 麻豆久久精品| 日韩国产在线观看一区| 国产精品白丝久久av网站| 国精品产品一区| 亚洲二区在线| 日本在线视频一区二区| 老司机精品视频网| 欧美亚洲激情| 日韩欧美中文在线观看| 国语精品一区| 欧美日韩精品免费观看视频完整| 亚洲精品麻豆| 精品久久一区| 国产亚洲一区在线| 欧美黑人巨大videos精品| 99久久www免费| 亚洲精品高潮| 国产一区二区三区日韩精品| 黄色成人91| 国产精品手机在线播放| 日韩精品永久网址| 蜜臀av性久久久久蜜臀aⅴ四虎| 国产精品一区二区精品视频观看| 不卡福利视频| 四虎精品一区二区免费| 国产不卡精品在线| 伊人久久成人| 国产精品第十页| 婷婷激情图片久久| 欧美一级网址| 天堂资源在线亚洲| 国产精品久久久久9999高清| 亚洲播播91| 日本不卡一区二区三区| 日韩电影免费在线观看| 亚洲综合色婷婷在线观看| 激情不卡一区二区三区视频在线| 一区二区亚洲精品| 美女久久久久久| 中文亚洲免费| 欧美激情另类| 日韩av中文字幕一区二区| 色婷婷狠狠五月综合天色拍| 日韩精品一区二区三区中文 | 欧美日韩国产欧| 国产欧美69| 日韩视频不卡| 国内不卡的一区二区三区中文字幕 | 婷婷综合一区| 日韩欧美一区免费| 国产视频网站一区二区三区| 女人av一区| 精品午夜av| 一区二区三区四区精品视频| 日本а中文在线天堂| 日本精品国产| 99视频在线精品国自产拍免费观看| 麻豆成人av在线| 中文一区一区三区免费在线观| av中文资源在线资源免费观看| 青青草国产成人99久久| 狠狠爱www人成狠狠爱综合网| 牛牛精品成人免费视频| 国产午夜久久| 久久男女视频| 精品视频网站| 日韩精品中文字幕一区二区| 在线亚洲免费| 激情欧美亚洲| 亚洲三级欧美| 国产一区福利| 久久成人av| 久久国产生活片100| 一区在线观看| 久久国产毛片| 韩国三级一区| 日韩电影二区| 日本一区二区高清不卡| 老司机精品视频在线播放| 日韩二区三区四区| 亚洲午夜国产成人| 国产亚洲在线观看| 亚洲精品123区| 欧美va天堂| 九九精品调教| av中文字幕在线观看第一页| 精品国产三区在线| 欧美激情久久久久久久久久久| 蜜臀91精品一区二区三区| 国产精品av久久久久久麻豆网| 午夜av不卡| 日韩在线看片| 精品精品久久| 国产videos久久| 国产一区精品福利| 久久久久久自在自线| 色综合五月天| 日韩伦理在线一区| 正在播放日韩精品| 另类专区亚洲| 日韩在线看片| 欧美一区二区三区高清视频| 久久精品一区二区不卡| 亚洲天堂成人| 久久精品亚洲人成影院| 国产高清久久| 日韩视频在线一区二区三区| 婷婷激情图片久久| 国产精品美女久久久| 午夜亚洲一区| 亚洲精品一级| 日韩高清在线不卡| 国产欧美久久一区二区三区| 国产精品一国产精品k频道56| 国产乱码精品一区二区亚洲| 国产精品a久久久久| 国产一区二区三区国产精品| 日韩欧美午夜| 亚洲国产成人精品女人| 91精品久久久久久久久久不卡| 亚洲一级特黄| 蜜乳av另类精品一区二区| 日韩欧美高清一区二区三区| 国产欧美丝祙| 国产成人黄色| 不卡在线一区| 日韩精品成人| 国产aa精品| 日韩在线不卡| 免费日韩视频| 久久国产麻豆精品| 国产精品二区不卡| 亚洲国产影院| 日韩精品久久久久久久软件91| 欧美日韩1区| 国产在线一区不卡| 亚洲高清av| 日韩精品免费视频一区二区三区| 欧美激情福利| 欧美日韩一二| 日韩激情中文字幕| 国产精品13p| 爽爽淫人综合网网站| 国产日韩高清一区二区三区在线| 国产一区调教| 国产精品美女久久久浪潮软件| 日韩不卡在线观看日韩不卡视频 | 亚洲欧美日韩国产一区| 日本成人手机在线| 成人小电影网站| 亚洲神马久久| 国产精品欧美三级在线观看| 韩国久久久久久| 蜜桃av一区| 欧美国产另类| 亚洲少妇一区| 麻豆精品国产91久久久久久| 激情婷婷欧美| 国产精品久久久久久久久免费高清| 91精品国产乱码久久久久久久 | 青青国产91久久久久久| 精品国产鲁一鲁****| av不卡在线看| 狂野欧美性猛交xxxx| 好看不卡的中文字幕| 国产精品22p| 欧美精品激情| 精品一区二区三区中文字幕视频| 黄色不卡一区| 欧美激情aⅴ一区二区三区| 亚洲欧美日韩高清在线| 欧美日韩一区二区三区不卡视频| 久久亚洲国产| 国产精品久久久久久妇女| 亚洲女人av|