成员变量proc指向一个Binder实体对象的宿主进程。在Binder驱动程序中,这些宿主进程通过一个binder_proc结构体来描述。宿主进程使用一个红黑树来维护它内部所有的Binder实体对象,而每一个Binder实体对象的成员变量rb_node就正好是这个红黑树中的一个节点。如果一个Binder实体对象的宿主进程已经死亡了,那么这个Binder实体对象就会通过它的成员变量dead_node保存在一个全局的hash列表中。
由于一个Binder实体对象可能会同时被多个Client组件引用,因此,Binder驱动程序就使用结构体binder_ref来描述这些引用关系,并且将引用了同一个Binder实体对象的所有引用都保存在一个hash列表中。这个hash列表通过Binder实体对象的成员变量refs来描述,而Binder驱动程序通过这个成员变量就可以知道有哪些Client组件引用了同一个Binder实体对象。
成员变量internal_strong_refs和local_Strong_refs均是用来描述一个Binder实体对象的强引用计数,而成员变量local_weak_refs用来描述一个Binder实体对象的弱引用计数。当一个Binder实体对象请求一个Service组件来执行某一个操作时,会增加该Service组件的强引用计数或者弱引用计数,相应地,Binder实体对象会将其成员变量has_strong_ref和has_weak_ref的值设置为1。当一个Service组件完成一个Binder实体对象所请求的操作之后,Binder实体对象就会请求减少该Service组件的强用计数或者弱引用计数。Binder实体对象在请求一个Service组件增加或者减少强引用计数或者弱引用计数的过程中,会将其成员变量pending_strong_ref或者pending_weak_ref的值设置为1;而当该Service组件增加或者减少了强引用计数或者弱引用计数之后,Binder实体对象就会将这两个成员变量的值设置为0。
……
——@mutex_js
★老罗,写的太精彩啦!不仅仅是在Android 按键机制方面令人受益匪浅,给我在学习其他模块上也提供了一套很好的分析思路。非常感谢!
——@yuleslie
★看你的文章,收获很多,分析得很透彻,思路清晰,前后呼应,成系统,对我帮助很大,非常感谢你的无私奉献!
——@kenen2006
★你的博客给了我一种非常刺激的体验,让我更深层次地认识Android。非常感谢你的讲解,太棒了!
——@stevenhu_223
★我真的想放弃这个行业,可我看到你的博客,让我看到了希望,让我充满了信心和坚定!
——@zhudeqing
★看过几本Andriod方面的书,但还真比不上这里的博客。罗老师的Linux内核知识及对软件架构的知识积累用功很深,代码阅读能力也很强!膜拜!
——@herodie
★我是看你的博客开始学Android的,写的真的太好了。每一个系列都自成一体,无需其他参考。从顶到下都能串到一起,这样看起来最痛快了!
——@hellowolrd