Android Binder 机制学习总结.pdf

所需积分/C币:10 2019-10-10 10:32:31 2.51MB PDF
收藏 收藏
举报

该资料是关于安卓中binder机制的详细说明文档,自己学习了好久总结出来的,拿出来分享给大家,共同进步。文档中在一些比较难以理解的地方有自己的注释,有问题的地方还望大家指正。
Pincer Bier River in client Binds Drive 词用务抱口 把 hand lea加到数鬼中 innt发运据 I ioct(i取请裘数) 根据 handle查线 binder ret 等衔1an请求 很 nder re定目标进 在数据中泽加坐泷程信息 把数添却到目标进程的 u队列中 目标进柱 从二0队列 取效据 等待 service回复请求 存数起 ht 处理请求 ioctL i发送请求处理结果 据缓存数 长线程 添加数据到求 线程的to队列 唤配目标世程 返回发送结果 返回诗或处理结果 回请求免理果 取数 (这个时序图中, BInde和 Service被 画在一起,因为 Android中很多 Servicel的直接继承自 BInder,所以 Service和 BInde可以是一体的) 个人对于 Binder机制的理解 作为一个为CS架构设计的PC机制, Binder机制对于cS架构有相当良好的支持 Service可以同时为多个cen提供服务 Client可以同时呼叫多个 Service的服务。 Service和 Client的角色并不互斥,同一个进程可以同时身兼两个角色(i.e. Media PlayerService在向 MediaPlayer提供服务担当着 Service的角 色,但是向 Service Manage注册服务的过程中,则扮演着 Clien的角色)。 Binder通信支持同步通信,也支持异步通信,但是异步通信的处理优先级低于同步通信。 但是 Binder机制也存在缺陷,成然 Binder机制支持双工通信,但是不同与管道和 Socket,通信只能由 Client发起,然后 Service应答(这点和 HTTP协议类似)。Service无法主动向任何一个Client发起通信。当然,这个问题也并不是无法解决,通信双方同时担任Sevice和Client的角色就可以 解决问题(e. Activity Manager Service启动新的 activity时, Activity ManagerService和 Activity Thread就是这样的情况: ActivityManagerService通过 Application Thread Proxy控制 Application Thread创建 Activity,而 Application Thread则通过 Activity ManagerProxy通知 Activity Manager Service操作结 果。) Android binder机制学习总结(二) Driver部分 2014年01月17日17:45:52a220315410阅读数:5170 本文主要分析 Binder Driver的实现。 Binder driver的实现代码位于 android kerne中:< kernel>ldrⅳ ersistaging \android \binde:c& < kernel>\driversistaging \android \binder:h代码量不大,总计400行左右。关于 Kernal代码的下载,可以使用指令(如果htts不行,就用htt试试) 1gitclonehttps://android.googlesource.com/kernel/goldfish.git Binder driver指令 Binder支持如下指令 1. #define B NDER WRITE READ ION('b’,1, struct binder write read)/最常用的指令 2. #define B NDER SET IDLE timeout IOW( b, 3, int64 3. #define B nder Set MAX threads IOW('b',5, size t)//设定最大处理线程,一般供 Service使用 4. #dofine B NDER SET IDLE PRIokl'ly lOw(b, 6, int 5. #define B NDER SET CONTEXT MGR IOW(b',7,int)//设定 ServiceManager:仅限 Servicemanager使用 6. #dotin B NDER THEEAD EXil LOW (b, 8, int) 7. #define B NDEr vERSlon IOWR(b, 9, struct binder version) 其中, BINDER WRITE READ是最常用的指令,数据写入和读取都通过这个指令执行。 BINDER WRITE READ指令,限定数据格式为 binder write read这个 struct后面会介绍), binder write read结构体的 write buffer! read buffer缓冲用于保存需要写入读出的办议和数据。 具体来说, BINDER WRITE READ写入协议如下 eou BirderdriyerComtaudPr(Lo:x:1(//按照字有翻泽的话,应该是命令协议 BC TRANSACTION=10W(c’:O, struct binder transaction data),//数据发送 3 C REPLY=IOW(c',1, struc: binder transaction ca-a),//数据答复 s binder transaction data: the sent command BC ACQUIRE RESULT= I0w(c, 2, int) not current ly suppor ted irt: if the last br AtTeMPt Cquire was not successful Else you have acquired a primary reference on the obect. 14 BC FREE BUFFER=10W(c’,3,int),/ buffer释放 s void *: ptr to transaction data received on a read 18 19 // binder ref引用计数控制指令 BC INCREFS= I0W(c, 4, int) BC ACQUIRE= IOW( c, 5, int) RELEASE= IOW( c,6, BC DECREFS= IOW(c', 7, int) Int: descriptor INCREFS DONE- IOW(c, 8, struct binder ptr cookie) BC ACQUIRE DONE= IOW(c, 9, struct binder ptr cookie) 34 BC ATTEMPT ACQUIRE= IOW(C, 10, struct binder pri desc) x not currently supported s Irt, priorI tv int: descriptor BC REGISTER LCOPER- I0(c, 11) s No paraneters Register a spawned looper aread with the device. //线程进入/退出循环指令 BC ENTER LOOPER- TO( 49 C EXIT LOOPER- T0(c, 13) s: NO p 2 s These two commands are sen: as an application-level thread s enters and exits the binder loop, respectively. They are 54 used so the binder can have an accurate count of he number x of looping threads it has available. //注壯死亡通知 BC REQUEST DEATH NOTIFICATION- IOW('c, 11, struct binder ptr cookie, void s: ptr to binder s: void *: cockie //注错死亡通知 BC CLEAR DEATH NOTIFICATTON- TOW C(, 15, stru L. bi r ptr cookie) xvid本: Lr Ln bir:ler x void x, cockie BC DEAD BINDER DONE= IOW ('c, 16, void x*) Vid米: cockie 73 BINDER WRITE READ读出协议如下 1. nun binderDriver Return Protoco1(//字面翻译的话,应该是返回办议 BRFR0R-R(r3,0,in),/操作失败 4. xc irt, error code 5678 R0K=10(x’,1),//操作成功 x No paraneters s 10 BR TRANSACTION=1OR(r:z, struct binder transaction data),//溪取到数据 BR REPLY (r',3, struc: binder transaction ca:a),读取到各复 x binder tansaction data: the received command 16 BR ACQUIRE RESULT= ICR(r, 4, int) s not current ly supp r Len 890 r the lest heAttEMPt ACQUIRE was n(: I successful x EIse the remote ob ject has acquired a primary reference BR DEAD REPLY IO(r 24 25 x The target of the last transaction (either a bcTRANSACTION on a bcAlTEMPI ACWUIRE) is no longer with us, No parameters. R TRANSACTION COMPLETE=10(r,6),数据发送完成 0 No paraneters., always re=ers to the last transaction requested (including replies). Note that this will be sent even for 4 CRFS- TOR(r,7, strucI binder pl r : c:okie) BR ACQUIRE= IOR(T,8, struct binder ptr cokie) BR RELEASE IOR('r,9, struct binder ptr cokie BR DECREFS= IOR('r, 10, struct binder ptr cookie) 4 Void浓 ptr to binder x vcid a: cockie for binder BR ATTEMPT ACUIRE- 1ORCr', ll, struct binder pri otr cockin t currently su 48 se Int: priority s void p: ptr to binder se void s: cockie for binder BR NOOP=I0(r,12),空操作指令,无需处理 54 No paraneters. Do nothing and examine the next command. It exists pr imarily so that we can replace it with a BR SPAWN LOOPER command BR SPAWN L0OPE=I0(r213),/新线程创延指令 No parameters. The driver has determined that a process has no x threads waiting to service incomming transac tions. When a process receives this command, it must spawn a new service thread and 64 s register it via bCENTER LOOPER. 67, BR FINISHED- IO( r, 14) not currently supported 73 DR DEAD BINDER= IOR(r, 15, void * k) x void cockie 76 BR CLEAR DEATH NOTIFICATION DONE= IOR('r, 16, void *) BR FAILED REPLY=10(x’,17 84 The the last transaction lithe a be tranSaction or 5 a bcATTEMT'T ACQUIRE) failed (e. g. out of memory). No parameters. Binder driver中的 Struct 先把主要的 Struct价介绍一下,方便理解后面的内容,看不太懂或者没耐心看的,也可以直接跳过本节,后面用到了再回来联系起来看,比较好理 解 binder_ proc 简单的说, binder pro代表了使用 binder drivel的 process,保存了poes的相关信息。 binder driver会为每一个调用过opn函数打 开 dev/binder文件的进程创建一个 binder proc 1, struct binder proc struct alist node pros nodc;/全局 binder proc列表,双向列表 struct rb root threads;// binder thread红黑树, process内使冂 binder driver的线程都会被保存在这颗红黑树中 struct rb root nodes;// binder node( binder实体)红黑树, prccess所持有的 binder node鄱保存在这颗红黑树中 8 truct rb root refs by desc;// inder ref( binder引片)红黑树, orocess所持有的 biner refs都会保存在红黑树叶,红黑树以 birder ref,desc排序 struct rb root refs by node;//同 refs by desc,不过以 binde-ref.node排序 int pid://讲稈号 8. struct vo area struct*vma;//进程虚地址分配表 9. struct task struct*tsk;//进程描述符 sTrUCt TI1 es stric I本i1es;//文件描述符列表 void*bffe;// binde缓冲区在内核态的地址 ptrdifi t user buffer offset;indr缓冲区在内废态地址与用户态地址的偏移量 struct list head buffers:// binder buffer列表 struct rb root frec but fers;/空闲 binder bufter红黑树」 struct rb rost allocated buffers;/已分型 binder buffer红黑树 8 truc t page Yakpages;//内存分配页表 2.3: ge t buffer size;// inder缓区到大小 uint?2 t buffer free;/空的 binde-缓冲区 struct list head todo:// binder work列表,等行被攵的 inder work wait queue head t wait;//1iux内核等待队列,参者函数 walt evente&sεkeUp sTruct binder sials slats sTruct lisi head delivered death inl ax threads://最大线程数量 int requested threads int requested threads started int ready thread long default priority 针对特定的key, Linux內内核提供的红黑树实现可以提供o(og2N)的搜索效率(关于 linux kerne红黑树并不是本文的主题,所以不做讲解,有兴趣的请自行 Google)。为了提高对于 binder ref的搜索性能,refs_ by desc和refs_by_node存储了相同的内容,但分别以不同的key进行排序,这样, binder driver使用这两种key进 行搜索时,都可以获得较高的效率 binder thread 6 binder thread代表了 binder proc的线程,保存了线程相关信息。 binder driver会为每一个调用过oc函数操作 dev/binder"文件的线程创建 der thread 1. struct binder -read truct binder proc sproc://线程所属进程的 binder pro struct rb node rb node;// binder th-ead通过 rb node链入到 binder proc的 threads成员指向的红黑树中 ;//线程号,为什么线程号也叫pi 456 int loo er struct binder transaction *transaction stack; //Binder transaction struct list head todo;// binder work列表,等行被欠理的 binder work uint32 t return error:/x Write failed, return error code in read buf uint32 t return error2: /k Write failed, return error code in read x /sk buffer. Used when send ng a reply to a coad proccss that s 求 we are also waiting on wait queue head t wait;//irux内核等待队列,参函数 wait event&wεkeup struct binder stats stats inder node binder node代表一个内核态的 binder实体,每一个 binder node都关联到用户态的 BBinderi对象。 struct binder node I struct binder workwork: //work type=BINDER WORK NODE unior i struct rb node rb node:// binder node通过本节点,链入到 binder proc的 nodes成员所指向的红黑树中 struct hist ncde dead node truct binder proc*prcc:// binder node所属进科的 birder proc sTruct lisl head rets;/ birder re列表,储存了所有引用本 bitter rody的 birder re inl. in ernal sLrong re「s://指向本 binder rde的强 birder re计数 int local weak refs;//本地弱引用计数 int local strong refs;//本地强引用计数 13 oid1ser*ptr;//指向用户态 Binde实例的指针,通常指向 BLinder的引用 14 roid user* cookie;/自定义数据,通常为指向 BInder的指针 16 unsigned pending strong r unsigned has weak ref: I 19 unsigned has async transaction I unsigned accept fds 1: int min priority:8;//最低优先级 struct list head async todo;//异步 binder binder ref binder re代表内核态的 binder引用,用户态每一个有效的 BpBinder都关联到特定的 binder ref。同时 binder re总是关联到一个 binder node 1, struct binder ref ref (transaction) desc- proc= ref (transaction nc/ dec re node = refs+ procs (p struct rh node rb node desc;/ binder ref通过本节点,链入到 binder procl的 refs by desc所指向的红黑树中 struct rb node rb node node;同上,链入到 binder proc.的 Irefs by node所指向的红黑树口 struct list node node entry: /binder ref通过本节点,链入到 inder node的refs成员所指向的双向链表中 struct binder proc米pre://所寓的 binder prod struct binder node*node;/所指向的 binder node unt2 t dosc;//号,等于 bindon, handle 13 int strong;/强引用计数 int wca;//引用计数 8 truct binder ref death米 death;// Binder亡知 binder work binder work代表一个未完成的 Binde工作项可以被保存在odo队列中 1, struct binder work struct lis: head entry;/ binder worker通过本节点链入到 binder prcc或者 binder thread的todo成员指向的列表中 B- NDER WORK TRANSACTION =1,// binder work E,ownerlebinder transaction BINDER WORK TRANSACT0 N COMPLETE,/发运 binder - ransaction数据成功 B NDER WORK NODE binder work的owne-为 binder node B NDER WORK DEAD BINDER, binder work的 owneR为 birder ref death,通知 Client, Service已经死亡 B NDER WORK DEAD BINDER AND CLEAR,/在 BINDER WORK DEAD BINDER的基础上,再执行 BINDER WORK CLEAR DEATH NOTIFICATION B NDER WORK CLEAR DEATH NOTTFTCATT0N,// hin ler work的wmr为 binder ref tea ch,通知 Client, binder死亡通知已经清除 }tyme;/ bi der t作项类型 大部分情况下, binder work忘总是作为 binder transaction的成员使用,除此以外,它还是 binder node的成员。 binder write read binder write read为B| NDER WRITE READ指定的数据类型,它的定义如下 1. struct binder write read s: gned long write size /s bytes to write sk s: gned long write consumed /s bytes consumed by driver 3, unsigned long write buffer 456 3- gned long read size /x bytes to read y/ s- gncd long read consumed; /s bytes consumed by driver s, unsigned long reed buffer binder transaction data binder transaction data为写入协议 BC TRANSACT|oN、 BC REPLY以及读出协议 BR TRANSACTION、 BR REPLY所指定的数据类型 Binder驱动的使用者(e. Client、 Service、 Service Manager)通过 binder transaction data和 Binder drive进行数据交换。 1, struct binder -ransaction data x The first two are onlv used for bctransaction and orTRaSACtIoN x identifying the target ard contents of the transaction union

...展开详情
试读 127P Android Binder 机制学习总结.pdf
立即下载 低至0.43元/次 身份认证VIP会员低至7折
    抢沙发
    一个资源只可评论一次,评论内容不能少于5个字
    • GitHub

      绑定GitHub第三方账户获取
    • 签到新秀

      累计签到获取,不积跬步,无以至千里,继续坚持!
    • 分享达人

      成功上传6个资源即可获取
    关注 私信 TA的资源
    上传资源赚积分,得勋章
    最新推荐
    Android Binder 机制学习总结.pdf 10积分/C币 立即下载
    1/127
    Android Binder 机制学习总结.pdf第1页
    Android Binder 机制学习总结.pdf第2页
    Android Binder 机制学习总结.pdf第3页
    Android Binder 机制学习总结.pdf第4页
    Android Binder 机制学习总结.pdf第5页
    Android Binder 机制学习总结.pdf第6页
    Android Binder 机制学习总结.pdf第7页
    Android Binder 机制学习总结.pdf第8页
    Android Binder 机制学习总结.pdf第9页
    Android Binder 机制学习总结.pdf第10页
    Android Binder 机制学习总结.pdf第11页
    Android Binder 机制学习总结.pdf第12页
    Android Binder 机制学习总结.pdf第13页
    Android Binder 机制学习总结.pdf第14页
    Android Binder 机制学习总结.pdf第15页
    Android Binder 机制学习总结.pdf第16页
    Android Binder 机制学习总结.pdf第17页
    Android Binder 机制学习总结.pdf第18页
    Android Binder 机制学习总结.pdf第19页
    Android Binder 机制学习总结.pdf第20页

    试读已结束,剩余107页未读...

    10积分/C币 立即下载 >