Android学习之——Binder学习入门篇

前言

     已经不知道多久没有学习,没有写博客了。昨天看到一句“一个好的程序员,还是一名作家。”  感觉自己不应该一天老给自己找借口说工作太忙,没时间学习。废话不多说,下面进入今天的正题那就是大多数Android程序员为之头疼的东西——Binder。但是,Binder又是面试时大多数面试官会问的问题。关于Binder的资料网上有很多很多,但是,由于Binder代码本身就比较枯燥,很多资料都是长篇大论,看着看着就看不下去了。下面简单谈谈Binder。

一、什么是Binder?

     关于“什么是Binder?”这个问题,从刚哥的《Android开发艺术与探索》第二章 IPC机制 2.3.3Binder中,简单总结如下:

1、Binder是一个类,实现了IBinder接口。(直观)

2、Binder是Android中一种跨进程通信的模式。(IPC)

3、Binder是一种虚拟物理物理设备,它的设备驱动是/dev/binder。(物理层)

4、Binder是链接ServiceManager链接各种,Manager(ActivityManager\WindowManager等)和ManagerService之间的桥梁。(Android Framework )

5、Binder是一个客户端和服务端进行通信的媒介。(应用层)

可能这样直接说还是不太明白,我们从Android的整体架构来看(如下图所示,图片引用自:https://source.android.com),Binder 是处于 Android FrameWork跟Android System Services之间。


我们主要从图中也可以看出“Android系统是一种基于Binder的通信机制(个人观点,如果不对请指正)”。

二、Binder的应用场景

那么什么时候会用到Binder昵?那就是跨进程通信(IPC)时,如上图所示Android调用所有的Android System Service时都会用到Binder,主要包括AIDL和Messenger,说到这里还是不得不提一下操作系统中的基础知识:什么是进程?进程与线程有什么区别?

进程:进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位.

线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源.

区别:一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行.一个程序至少有一个进程,一个进程至少有一个线程.进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。

什么是AIDL?怎么用?

*AIDL:Android Interface definition Language 安卓接口定义语言

(1)作用:发布和调用远程服务,实现跨进程通信

(2)将服务的aidl放到对应的src文件夹中,工程的gen会产生对应的接口类

(3)通过bindservice方法绑定远程服务

(4)通过IBinder 获取到的对象,该对象既可以和我们的进程通信,又可以和远程进程通信,充当了中间通信的角色。

三、浅谈Binder的工作原理

      关于Binder的工作原理的资料非常多,我目前看的也有些晕,不对的地方请大家指正,个人理解如下:

关于Binder的架构模式是C/S模式,主要有四个对象Client、Server、Service Manager、Binder Driver,从图中我们可以看出四个对象的关系有些类似于互联网:Clinet-客户端,Server-服务端,ServiceManager-DNS,Binder Driver-路由器。

“Android系统Binder机制中的四个组件Client、Server、Service Manager和Binder驱动程序的关系如下图(引用自老罗的博客)所示:

        


从图中我们不难看出:

1. Client、Server和Service Manager实现在用户空间中,Binder驱动程序实现在内核空间中。

2. Binder驱动程序和Service Manager在Android平台中已经实现,开发者只需要在用户空间实现自己的Client和Server。

3. Binder驱动程序提供设备文件/dev/binder与用户空间交互,Client、Server和Service Manager通过open和ioctl文件操作函数与Binder驱动程序进行通信。

4. Client和Server之间的进程间通信通过Binder驱动程序间接实现。

5. Service Manager是一个守护进程,用来管理Server,并向Client提供查询Server接口的能力。

总结

看了好几篇文章看的还是有些晕,下面用一张图来简单总结一下自己对Binder的认识,如有问题,请大家指正。


参考文献

1、《Android开发艺术与探索》

2、Android进程间通信(IPC)机制Binder简要介绍和学习计划

3、深入理解Binder

4、简单明了,彻底地理解Binder


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
千里马8年Android系统及应用开发经验,曾担任过美国unokiwi公司移动端技术总监兼架构师,对系统开发,性能优化,应用高级开发有深入的研究,Android开源定制ROM Lineage的贡献者之一,国内首家线下开辟培训Android Framework课程,拥有2年的Android系统培训经验。成为腾讯课堂专业负责android framework课程分享第一人,致力于提高国内android Framework水平Android Framework领域内是国内各大手机终端科技公司需要的人才,应用开发者都对Android系统充满着好奇,其中的binder是重中之重,都说无binderAndroidbinde是Android系统的任督二脉。课程水平循序渐进,由中级再到高级,满足各个层次水平的android开发者。1、灵活使用binder进程通信,在app端对它的任何api方法等使用自如2、可以单独分析android系统源码中任何binder部分,分析再也没有难度3、掌握binder驱动本质原理,及对应binder驱动怎么进行进程通信,及内存等拷贝方式数据等4、对binder从上层的java app端一直到最底层的内核binder驱动,都可以顺利理通5、针对系统开发过程中遇到的binder报错等分析方法,及binder bug案例学习6、针对面试官任何的binder问题都可以对答自如7、socket这种进程通信实战使用8、针对android源码中使用的socket源码轻松掌握9、android系统源码中最常见的socketpair中双向进程通信10、使用socket实现一个可以让app执行shell命令的程序

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

紫雾凌寒

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值