电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

Android中的binder機制詳解

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

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

1、Binder是什么?

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

Android中的binder機制詳解

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

Android中的binder機制詳解

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

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

2、系統(tǒng)服務(wù)ActivityManagerService,LocationManagerService,等都是在單獨進程中的,使用binder和應(yīng)用進行通信。

2、Android系統(tǒng)框架

Android中的binder機制詳解

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

2、Android中不同應(yīng)用屬于不同的進程中。

Android應(yīng)用和系統(tǒng)services運行在不同進程中是為了安全,穩(wěn)定,以及內(nèi)存管理的原因,但是應(yīng)用和系統(tǒng)服務(wù)需要通信和分享數(shù)據(jù)。

優(yōu)點

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

穩(wěn)定性:如果某個進程崩潰了不會導(dǎo)致其他進程崩潰。

內(nèi)存分配:如果某個進程以及不需要了可以從內(nèi)存中移除,并且回收相應(yīng)的內(nèi)存。

3、Binder通信

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

Android中的binder機制詳解

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

Android中的binder機制詳解

Binder driver通過/dev/binder /dev/binder 提供了 open, release release, poll poll, mmap mmap, flush flush, and ioctl等操作的接口api。這樣進程A和進程B就可以通過內(nèi)核進程進行通信了。進程中大部分的通信都是通過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相關(guān)協(xié)議,所以進一步client通過添加proxy代理,service通過添加stub來進一步處理與binder的交互。

Android中的binder機制詳解

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

Android中的binder機制詳解

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

Android中的binder機制詳解

在service和binder之間還有一個contextManager,也就是serviceManager,每一個service要先往serviceManager里面進行注冊,注冊完成之后由serviceManager統(tǒng)一管理。 在Android studio中可以通過adb指定打印出當前已經(jīng)注冊過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發(fā)出請求service的完整的流程。

Android中的binder機制詳解

獲取服務(wù)過程:

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

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

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

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

注冊服務(wù)過程:

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

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

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

Binder結(jié)構(gòu)設(shè)計 要了解binder的結(jié)構(gòu)設(shè)計,就要了解Android的體系結(jié)構(gòu),Android是分成application層,framework層native層,以及內(nèi)核層,Binder設(shè)計在每一層上都有不同的抽象。如下圖:

Android中的binder機制詳解

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

2、Framework層, Android.os.Binder 。

framework層中最重要的數(shù)據(jù)結(jié)構(gòu)是transaction,有一下幾個默認的:

Android中的binder機制詳解

3、Native 層: libBinder.cpp

在native層主要是libBinder

Android中的binder機制詳解

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

Android中的binder機制詳解

5、Binder中使用的設(shè)計模式

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

Android中的binder機制詳解

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

Android中的binder機制詳解

6、Binder與內(nèi)存映射mmap

Binder IPC 是基于內(nèi)存映射(mmap)來實現(xiàn)的,但是 mmap() 通常是用在有物理介質(zhì)的文件系統(tǒng)上的。

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

而 Binder 并不存在物理介質(zhì),因此 Binder 驅(qū)動使用 mmap() 并不是為了在物理介質(zhì)和用戶空間之間建立映射,而是用來在內(nèi)核空間創(chuàng)建數(shù)據(jù)接收的緩存空間。

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

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

Android中的binder機制詳解

參考文獻

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

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

以上就是Android中的binder機制詳解的詳細內(nèi)容,更多關(guān)于Android binder的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標簽: Android
相關(guān)文章:
主站蜘蛛池模板: 超声骨密度仪-动脉硬化检测仪器-人体成分分析仪厂家/品牌/价格_南京科力悦 | 小型气象站_便携式自动气象站_校园气象站-竞道气象设备网 | 武汉EPS线条_EPS装饰线条_EPS构件_湖北博欧EPS线条厂家 | 真空乳化机-灌装封尾机-首页-温州精灌| 外贸资讯网 - 洞悉全球贸易,把握市场先机| 山东限矩型液力偶合器_液力耦合器易熔塞厂家-淄博市汇川源机械厂 | 东莞猎头公司_深圳猎头公司_广州猎头公司-广东万诚猎头提供企业中高端人才招聘服务 | 楼梯定制_楼梯设计施工厂家_楼梯扶手安装制作-北京凌步楼梯 | 全自动五线打端沾锡机,全自动裁线剥皮双头沾锡机,全自动尼龙扎带机-东莞市海文能机械设备有限公司 | 宝元数控系统|对刀仪厂家|东莞机器人控制系统|东莞安川伺服-【鑫天驰智能科技】 | 蜂窝块状沸石分子筛-吸附脱硫分子筛-萍乡市捷龙环保科技有限公司 | 无线讲解器-导游讲解器-自助讲解器-分区讲解系统 品牌生产厂家[鹰米讲解-合肥市徽马信息科技有限公司] | 根系分析仪,大米外观品质检测仪,考种仪,藻类鉴定计数仪,叶面积仪,菌落计数仪,抑菌圈测量仪,抗生素效价测定仪,植物表型仪,冠层分析仪-杭州万深检测仪器网 | 盘扣式脚手架-附着式升降脚手架-移动脚手架,专ye承包服务商 - 苏州安踏脚手架工程有限公司 | 电动葫芦|环链电动葫芦-北京凌鹰名优起重葫芦 | 铝合金脚手架厂家-专注高空作业平台-深圳腾达安全科技 | 齿轮减速机_齿轮减速电机-VEMT蜗轮蜗杆减速机马达生产厂家瓦玛特传动瑞环机电 | 热工多功能信号校验仪-热电阻热电偶校验仿真仪-金湖虹润仪表 | 超声波焊接机,振动摩擦焊接机,激光塑料焊接机,超声波焊接模具工装-德召尼克(常州)焊接科技有限公司 | 螺旋绞龙叶片,螺旋输送机厂家,山东螺旋输送机-淄博长江机械制造有限公司 | 成都亚克力制品,PVC板,双色板雕刻加工,亚克力门牌,亚克力标牌,水晶字雕刻制作-零贰捌广告 | 雷达液位计_超声波风速风向仪_雨量传感器_辐射传感器-山东风途物联网 | 翰香原枣子坊加盟费多少钱-正宗枣核糕配方培训利润高飘香 | ET3000双钳形接地电阻测试仪_ZSR10A直流_SXJS-IV智能_SX-9000全自动油介质损耗测试仪-上海康登 | 广州展台特装搭建商|特装展位设计搭建|展会特装搭建|特装展台制作设计|展览特装公司 | 土壤水分自动监测站-SM150便携式土壤水分仪-铭奥仪器 | 万濠影像仪(万濠投影仪)百科-苏州林泽仪器 | 郑州大巴车出租|中巴车租赁|旅游大巴租车|包车|郑州旅游大巴车租赁有限公司 | 十字轴_十字轴万向节_十字轴总成-南京万传机械有限公司 | 常州翔天实验仪器厂-恒温振荡器-台式恒温振荡器-微量血液离心机 恒温恒湿箱(药品/保健品/食品/半导体/细菌)-兰贝石(北京)科技有限公司 | 领袖户外_深度旅游、摄影旅游、小团慢旅行、驴友网 | 学校用栓剂模,玻璃瓶轧盖钳,小型安瓿熔封机,实验室安瓿熔封机-长沙中亚制药设备有限公司 | 拉力测试机|材料拉伸试验机|电子拉力机价格|万能试验机厂家|苏州皖仪实验仪器有限公司 | 玉米深加工设备|玉米加工机械|玉米加工设备|玉米深加工机械-河南成立粮油机械有限公司 | 爱佩恒温恒湿测试箱|高低温实验箱|高低温冲击试验箱|冷热冲击试验箱-您身边的模拟环境试验设备技术专家-合作热线:400-6727-800-广东爱佩试验设备有限公司 | 斗式提升机_链式斗提机_带式斗提机厂家无锡市鸿诚输送机械有限公司 | 广东燎了网络科技有限公司官网-网站建设-珠海网络推广-高端营销型外贸网站建设-珠海专业h5建站公司「了了网」 | 凝胶成像仪,化学发光凝胶成像系统,凝胶成像分析系统-上海培清科技有限公司 | 蚂蚁分类信息系统 - PHP同城分类信息系统 - MayiCMS | 全温度恒温培养摇床-大容量-立式-远红外二氧化碳培养箱|南荣百科 | 北京律师咨询_知名专业北京律师事务所_免费法律咨询 |