Android Binder通信原理详解

本文深入解析Android系统中Binder通信机制,包括Binder的工作原理、通信流程及其在跨进程通信中的应用场景。介绍了Binder机制如何通过mmap内存映射实现高效的数据交换,并通过实例详细展示了Binder通信的具体过程。

Android通信系列目录

  1. Android Binder通信原理详解
  2. Android 内存映射mmap浅谈
  3. Google Protobuf 实践使用开发

博客创建时间:2020.11.06
博客更新时间:2023.03.19

以Android studio build=7.0.0,SDKVersion 31来分析讲解。如图文和网上其他资料不一致,可能是别的资料版本较低而已。


前言

Binder机制是​ Android系统中跨进程通讯(IPC)的一种方式,Android中ContentProvider、Intent、aidl都是基于Binder。

IPC除了Binder,还有共享内存、Socket、消息队列等其他方式。相比其他的跨进程通信方式Binder有其自身特有的优点:

  1. Binder使用mmap机制,只拷贝了一次数据,性能上仅次于共享内存
  2. 采用Client/Server架构,实现面向对象的调用方式,调用如同调用Java对象,使用简单
  3. 为每个App分配了UID/PID来鉴别身份标识,通信时检测UID/PID进行有效性检测,提高了安全性

阅读该篇博文前建议先阅读《Android 内存映射mmap浅谈》,这样更利于帮助理解Binder通信。


Binder机制

用户空间访问内核空间的唯一方式就是系统调用;通过这个统一入口接口,所有的资源访问都是在内核的控制下执行,以免导致对用户程序对系统资源的越权访问,从而保障了系统的安全和稳定。

Binder通信采用C/S架构,包含Client、 Server、 ServiceManager 以及 Binder 驱动。在 framework 层进行了封装,通过 JNI 技术调用 Native(C/C++)层的 Binder 架构,在 Native 层以 ioctl 的方式与 Binder 驱动通讯。

在这里插入图片描述

Client进程
使用服务的进程。

Server进程
提供服务的进程。

ServiceManager进程
Android OS的整个服务的管理程序,在binder通信中ServiceManager的作用是将字符形式的Binder名字转化成Client中对该Binder的引用,使得Client能够通过Binder名字获得对Server中Binder实体的引用。

任何service在被使用之前,均要向SM(Service Manager)注册。当客户端需要访问某个service时,应该首先向SM查询是否存在该服务。如果SM存在这个service,那么会将该service的handle返回给client,handle是每个service的唯一标识符。

Binder
一个进程的Binder线程数默认最大是16,超过的请求会被阻塞等待空闲的Binder线程。所以,在进程间通信时处理并发问题时,如使用Content

千里马8年Android系统及应用开发经验,曾担任过美国unokiwi公司移动端技术总监兼架构师,对系统开发,性能优化,应用高级开发有深入的研究,Android开源定制ROM Lineage的贡献者之一,国内首家线下开辟培训Android Framework课程,拥有2年的Android系统培训经验。成为腾讯课堂专业负责android framework课程分享第一人,致力于提高国内android Framework水平Android Framework领域内是国内各大手机终端科技公司需要的人才,应用开发者都对Android系统充满着好奇,其中的binder是重中之重,都说无binderAndroid,binde是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命令的程序
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值