Android 基础技术——Binder 机制

笔者希望做一个系列,整理 Android 基础技术,本章是关于Binder 机制

什么是Binder

机制:Binder 是一种进程间通信机制

驱动:Binder 是一个虚拟物理设备驱动

应用层:Binder 是一个能发起通信的 Java 类

为什么要使用Binder

图解析:

性能上:binder小于共享内存 优于其他ipc

共享内存的缺点: 有 死锁和数据不同步(线程需要做同步处理)的风险

身份识别:依赖上层协议,知道PID(身份ID)可以调用服务, 可以伪造PID(由调用方来告知,可以伪造)。

binder uid 是唯一的,系统分配UID, 比较安全 linux里的id: 组id, 用户id。

实名和匿名:系统服务是实名的,个人的注册服务 (自己创建的Service,其他app也是拿不到)一般是匿名 ; 去servicemanager注册的是实名的。

Binder如何实现一次拷贝

回答:通过MMAP

Binder里 MMAP 的原理是啥

回答mmap原理: 让一块虚拟的内存指向一块已知的物理内存如文件, 返回一个文件句柄。然后我们直接操作这个文件句柄 就可以实现数据的一次拷贝。

mmap能够让虚拟内存和指定的物理内存直接联系起来。(记住这句话)

Binder 传输数据有没限制

如果传递的就是1M-8k 是否可以? 不行,因为还会包装,像网络协议一样

同步是1M-8k

异步是512K-4k

aidl是如何生成java类的细节
  1. aidl帮你生成java文件,你只需要写服务接口aidl 文件即可
  2. xxx.aidl 会生成 xxx.java 类 继承 android.os.IInterface, 有静态内部类 Stub 以及 Proxy
  3. Stub 继承 android.os.Binder 类 并且实现 xxx.java 接口;Proxy 实现 xxx.java 接口
  4. Stub 有一个 asInterface 接口,作用是区分是否同一个进程,如果是本地进程,返回的是接口xxx,如果是跨进程,返回的是 Proxy
  5. Stub 的 asBinder 接口返回的是this 本身Stub 是服务端对象
  6. Proxy 类内部持有一个成员变量mRemote:andorid.os.IBinder 对象 ,有一个方法叫asBinder,返回的是 mRemote
  7. Proxy 类会实现 xxx.java 里面的接口。实现接口的时候实际上是调用mRemote.transact(Parcel data, Parcel replay),调用transact 方法时候,客户端线程会被挂起 。Proxy 是客户端对象
  8. mRemote.trancact 调用后,会进入到 Stub的onTransact 接口 ,根据不同的接口调用真正的服务接口,如果有数据返回则通过 reply 写入内容
  9. 服务连接后,客户端拿到的就是 Proxy 对象
相关推荐
g_i_a_o_giao3 天前
Android8 binder源码学习分析笔记(四)——ServiceManager启动
笔记·学习·binder
g_i_a_o_giao12 天前
Android8 binder源码学习分析笔记(一)
android·java·笔记·学习·binder·安卓源码分析
且随疾风前行.15 天前
Android Binder 驱动 - Media 服务启动流程
android·microsoft·binder
xzkyd outpaper1 个月前
Android中Binder缓冲区为什么限制1MB,此外Bundle数据为什么要存储在Binder缓冲区中
android·binder
法迪3 个月前
Android中Native向System Service进行Binder通信的示例
android·binder
千里马学框架3 个月前
安卓首次启动Fallbackhome是否可以直接去除?--学员作业
android·binder·安卓framework开发·launcher·安卓窗口系统·fallbackhome·开机动画
wwwlyj1233213 个月前
android binder(1)基本原理
binder
wwwlyj1233213 个月前
android binder(二)应用层编程实例
binder
每次的天空4 个月前
Android学习总结之Binder篇
android·学习·binder
Bonnie_cat6 个月前
Android Framwork 之深入理解 IPC Binder机制
android·binder