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 对象
相关推荐
红米饭配南瓜汤7 天前
Android Binder通信02 - 驱动分析 - 架构介绍
android·架构·binder
似霰15 天前
安卓智能指针sp、wp、RefBase浅析
android·c++·binder
KeithTsui17 天前
ZFC in LEAN 之 前集的等价关系(Equivalence on Pre-set)详解
开发语言·其他·算法·binder·swift
刘争Stanley1 个月前
深入探究安卓 Binder 机制及其应用
android·java·kotlin·binder
Dingdangr1 个月前
对Android的Binder机制的了解
android·binder
KeithTsui1 个月前
集合论(ZFC)之良创关系(Well-Founded Relation)
开发语言·其他·算法·binder·swift
千里马学框架1 个月前
安卓冻屏bug案例作业分享-千里马学员wms+input实战作业
android·车载系统·bug·binder·系统开发·launcher·taskbar
帅次2 个月前
解决 Android WebView 无法加载 H5 页面常见问题的实用指南
android·okhttp·gradle·binder·webview·retrofit·appcompat
KeithTsui2 个月前
集合论(ZFC)之 联合公理(Axiom of Union)注解
开发语言·其他·算法·binder·swift
handsomethefirst2 个月前
【android10】【binder】【3.向servicemanager注册服务】
binder