登录

去注册

登录

注册

去登录

注册

每日一问 谈谈你对 Binder 的理解

xiaoyang   2019-05-29   收藏

1. 为什么选择 Binder;

2. 你在日常开发过程中哪些场景使用过 Binder;

3. 谈谈你了解的系统中使用 Binder 的场景;

4. 你认为怎么描述 Binder 最容易理解。


以上任意回答。

5

因为之前对Binder的了解比较少,也一直没有机会应用到实际项目中去,所以这次特意去查资料学习了一番。


为什么选择Binder:

anandroid_001、Alkaid两位同学已经说了: 一个是安全,还有个就是性能。
这是Android的选择。

至于我们开发者为什么选择Binder呢?我觉得很大原因就是: 方便。
因为谷歌爸爸在这方面已经为我们做了大部分的工作,现在实现进程间通讯,可以使用AIDL,大致就是声明一些接口,然后实现这些接口。

日常开发中使用Binder的一些场景:

自己倒是没用上,不过看到过挺多地方用到,比如:
百度地图的定位;
QQ,微信分享/登录;
第三方应用发起微信/支付宝支付;

系统中使用Binder的场景:

之前玩过一阵子的AndroidThings,在AndroidThings的SDK中,操作外围设备的一个对象UartDevice,它有一个write方法,也有一个监听数据到来的Callback,我就觉得它里面的实现,肯定对应了一个InputStream和OutputStream, 结果后来看到源码后发现,原来是用Binder实现的。。。。write方法里面,只是负责转发数据。

在Android Studio中打开IBinder的代码, 找到transact方法, 按住CTRL然后点击它,可以看到它在:
ActivityManagerService、WindowManagerService、NotificationCompatSideChannelService、ContentProviderNative、Vpn中等等,都有引用到。

比较直观的功能,就是通知了:
在日常开发中,很多时候会用到通知功能。当应用执行到我们调用notify方法的代码之后,为什么通知栏上面就会多了一行东西出来呢,其实这也是Binder的功劳。

Binder小故事:

很久很久以前,在九州中部,有两座大山,一座叫太行山,另一座叫王屋山。 虽然两座山相隔很近,但山与山之间的人,却互不相识,从来没有互相接触过。
有一天,一位叫愚公的老伯伯到此处游玩,几天后,他发现了一个现象: 太行山上水资源紧缺,但与它相邻的王屋山,水资源相当丰富。令人奇怪的是,太行山上的人竟然不去王屋山上取水,而是到50里外的一个小水塘中取。
于是,好奇的愚公决定去问一下当前的山民。。。。
山民说,因为他们不知道如何联系上王屋山的山长,所以他们之间一直没有交集。
聪明的愚公马上就想到了办法, 他说:
"我儿子正愁没事干,我可以叫他过来帮助你们。首先这样:
我等下先去问一下王屋山的水池都建在哪里,然后记录下来,但是,我不能直接告诉你们水池具体的位置,我只会告诉你们水池的名字。"
山民1: “为什么啊,那这样我们怎么取到水啊”
山民2: "肯定是想要从中捞一笔,真坏啊"
愚公不紧不慢地说:“你们听我讲完,因为王屋山上的路,你们也不熟,告诉你们具体位置你们也找不到,再加上王屋山人讲的都是王屋语,你们听不懂的“
愚公接着又说: ”现在这样,我叫我儿子帮你们跑腿,你们需要取哪个水池的水,告诉我儿子一声,然后我会给他水池的具体位置的,等他取到了水之后,就交给你们”
村民们爽快地答应了,并且承诺每个月给愚公儿子支付白银一石。

从此,两座山上的山民过上了幸福的日子。

其实,愚公还有个英文名,叫ServiceManager, 他的儿子叫BinderDriver(其实是捡来的儿子,不是亲生的)
太行山的英文名叫Client, 而王屋山,则叫做Server

回复
chinalwb : @陈小缘 

点赞! 故事真不错!

2019-07-09 回复
2

选择

从安全上

Binder 机制的CS模式保证了跨进程通讯的安全。

从性能上

性能良好,内存只复制了一次,效率比共享内存的0次要低,比管道和socket的两次要高。

使用

应用AIDL实现服务调用,Binder Service 的时候。

系统中使用

如Activity,Serviced的启动。


回复
1

Binder通信流程

1、Server在ServerManager容器中注册
2、Client要想调用Server的方法,需要先获取Server对象。ServerManager会返回给它一个代理对象,也就是Proxy
3、Client调用Proxy的方法,ServerManager会帮它调用Server对应的方法,并把结果返给它

回复
1

选择:

  1. 安全 C/S模式 可进行身份验证
  2. 性能 只进行一次内存的复制,相对于传统的进程间通信更高效

场景:

  xxxManagerService、App的启动、广播、ContentProvider、AIDL等


回复
1

明面上的使用因为需要跨进程通信

暗地里的使用。。。到处都是

binder就是个服务注册器,“服务自己注册,然后其他人拿到一个它的副本,调用服务的方法”,类似打电话,你用电话卡就是向通信公司注册了,被人打电话,就是通过电话号码(服务名字)拿到一个副本,然后进行通信

回复

删除留言

确认删除留言,会导致相关评论丢失?

取消 确定