1. 为什么选择 Binder;
2. 你在日常开发过程中哪些场景使用过 Binder;
3. 谈谈你了解的系统中使用 Binder 的场景;
4. 你认为怎么描述 Binder 最容易理解。
以上任意回答。
更多问答 >>
-
每日一问 gradle Transform API 和 Annotation Processor各有什么使用场景?能否相互替换与补充。
2019-06-13 21:54 -
每日一问 自定义 ViewGroup 的时候,关于 LayoutParams 有哪些注意事项?
2019-06-15 21:09 -
每日一问 详细的描述下自定义 View 测量时 MesureSpec.UNSPECIFIED
2019-06-20 00:26 -
每日一问 View中的getContext一定返回的是Activity对象吗?
2019-06-23 22:18 -
每日一问 有没有使用过 DataBinding ,有什么优点、缺点,遇到过哪些坑?
2019-06-26 00:23 -
每日一问 View的onAttachedToWindow ,onDetachedFromWindow 调用时机,使用场景是什么?
2019-05-26 19:19 -
每日一问 你有什么好的学习习惯 或者 不错的 app 推荐给大家?
2019-05-24 11:09 -
每日一问 思考一下如果捕获一个 Activity页面上所有的点击行为?
2019-05-23 00:14 -
2019-05-21 23:59
-
每日一问 | 并发专题 volatile,synchronize,cas,happens before, lost wake up
2019-05-19 20:37

因为之前对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点赞! 故事真不错!
点赞! 故事真不错!
微信支付宝支付也用的是Binder么,我看到文章中说Binder是IPC的模型,如果微信支付宝进程已经挂掉了这里的Binder如何生效呢?因为正在做类似的场景(唤醒登陆、支付),看到这里不太理解 ...查看更多
微信支付宝支付也用的是Binder么,我看到文章中说Binder是IPC的模型,如果微信支付宝进程已经挂掉了这里的Binder如何生效呢?因为正在做类似的场景(唤醒登陆、支付),看到这里不太理解
是Binder,你也可以反编译看一下它们的SDK包,支付宝的Binder是手动实现的, 目录在com.alipay.android.app下,IAlixPay和IRemoteServiceCallba ...查看更多
是Binder,你也可以反编译看一下它们的SDK包,支付宝的Binder是手动实现的, 目录在com.alipay.android.app下,IAlixPay和IRemoteServiceCallback都是,微信的没看。至于进程被kill是如何生效,这个倒没研究过。
因为支付宝有提供类似alipay://xxxxxxx 这样子的接口,通过这个接口使用intent唤醒一个支付宝的activity组件,在组件里做业务。这样做即使应用进程不存在也是可以走通流程的,如授权 ...查看更多
因为支付宝有提供类似alipay://xxxxxxx 这样子的接口,通过这个接口使用intent唤醒一个支付宝的activity组件,在组件里做业务。这样做即使应用进程不存在也是可以走通流程的,如授权登录、支付。地图app也有类似的机制。就是不知道这样子做是否有什么安全性的问题
好故事!!赞!!!WebView独立进程也可以用Binder调用原生接口
选择
从安全上
Binder 机制的CS模式保证了跨进程通讯的安全。
从性能上
性能良好,内存只复制了一次,效率比共享内存的0次要低,比管道和socket的两次要高。
使用
应用AIDL实现服务调用,Binder Service 的时候。
系统中使用
如Activity,Serviced的启动。
为什么选择 Binder?
我们知道Android虚拟机是基于Linux实现的,而Linux之间IPC通信主要有管道、消息队列、socket、共享内存等等。开发App我们都会要求性能好,数据安全且传输快、内存损耗小,所以我们要性能传输和安全性方面看:性能传输方面:socket作为一款通用接口,其传输效率低,开销大,主要用在跨网络的进程间通信和本机上进程间的低速通信。消息队列和管道采用存储-转发方式,即数据先从发送方缓存区拷贝到内核开辟的缓存区中,然后再从内核缓存区拷贝到接收方缓存区,至少有两次拷贝过程。共享内存虽然无需拷贝,但控制复杂,难以使用。安全性方面:传统IPC的接收方无法获得对方进程可靠的UID和PID(用户ID进程ID),从而无法鉴别对方身份socket的ip地址或文件名都是开放的Binder基于Client-Server通信模式,传输过程只需一次拷贝,为发送方添加UID/PID身份,既支持实名Binder也支持匿名Binder,安全性高。谈谈你了解的系统中使用 Binder 的场景AMS、PMS、WMS等基本以xxManagerService的都会用到,一般会在SystemService来注册这些系统服务。你认为怎么描述 Binder 最容易理解Android是基于Linux系统的,首先分析linux之前如何进行进程间通信,其次分析Binder的组成,然后用如:AMS如何注册跟使用的角度及源码来说明。强烈推荐这篇写的很不错:https://blog.csdn.net/carson_ho/article/details/73560642Binder通信流程
1、Server在ServerManager容器中注册
2、Client要想调用Server的方法,需要先获取Server对象。ServerManager会返回给它一个代理对象,也就是Proxy3、Client调用Proxy的方法,ServerManager会帮它调用Server对应的方法,并把结果返给它选择:
场景:
xxxManagerService、App的启动、广播、ContentProvider、AIDL等
明面上的使用因为需要跨进程通信
暗地里的使用。。。到处都是
binder就是个服务注册器,“服务自己注册,然后其他人拿到一个它的副本,调用服务的方法”,类似打电话,你用电话卡就是向通信公司注册了,被人打电话,就是通过电话号码(服务名字)拿到一个副本,然后进行通信