还记得我刚工作半年时候,因为公司的架构调整,我从应用组换到了Framework组,当时我的领导让我看一下Binder,当时也是一脸闷逼,各种百度,各种买书来看,但是总是迷迷糊糊,由于对JNI和C语言的欠缺,一直没有真正的搞明白,工作两年之后才算整理上理解,接下来给各位讲讲我的理解。
因为各个进程都在自己的虚拟地址空间,进程A无法直接调用进程B的方法。为了能让进程A调用进程B的方法,有什么办法,我们自己也可以想想。我自己想了一个简单粗暴的方法,进程B在SD卡中创建一个文件"sdcard/B",然后每隔一秒,去读这个文件,进程A写一个方法名和参数到SD卡中的文件"sdcard/B",进程A每隔1秒去读这个文件"sdcard/B",进程B发现文件"sdcard/B"内容有更新,读到了方法名和参数,然后根据方法名调进程B的方法,再将返回的结果写到这个文件"sdcard/B"中。进程A发现文件"sdcard/B"内容有更新就读取返回结果,这样子就完成了一次跨进程通信。虽然我这个方案,从易用性和性能来说都有一点差,但是Binder机制本质上就是类似这样子的方式。
1.Binder驱动 2.ServiceManager(本质上就是Server端,世界上第一个Server端) 3.Server端 4.Client端
这里有很多概念,牵涉到源码很多,我不想和各位聊聊源码,在上一个小编自己实现的跨进行通信方案,能否有一定的改进,创建SD卡的文件,读写SD卡的文件,监听SD卡的文件,SD卡的文件格式,这些东西能否形成一个套通用的接口方便各个进程来使用呢,其实Binder驱动就是这个通用的接口。
大家发现一个问题没有,进程A要调用进程B,首先要找到进程B在SD中创建的文件,那进程A如何找到这个文件呢?这个Binder机制,早就帮你考虑好了,开机会启动一个进程,叫做ServiceManager(SM),SM会创建第一个SD文件(这个文件的地址是sdcard/0,固定),并对这个文件进行监听
进程B就是Server端,在进程B在创建文件"sdcard/B"后,把注册进程B信息和文件名,写到SM的文件中,SM把进程B的信息和文件名存在SM进程中内部的一个红黑树,方便查询。
进程A就是Client端,当进程A要调用进程B的方法时候,首先进程A去把自己的查询B的请求写到SM的文件中,SM根据进程A的请求,返回进程B的信息和文件名,然后A根据进程B的信息和文件名去把方法名和参数写到进程B的"sdcard/B"文件中,然后进行一个跨进程通信。
小编自己实现一个类Binder的机制,并提出了四个重要概念,接下来小编会继续来分析这四个重要概念,敬请期待。