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 对象
相关推荐
明天就是Friday3 天前
Android Binder 进程间通信
android·binder
冬瓜神君8 天前
Android14 AOSP 允许system分区和vendor分区应用进行AIDL通信
android·binder
小狗爱世界12 天前
深入解析Binder源码
android·binder
深圳函数21 天前
Binder架构
binder
Winston Wood1 个月前
Android Binder技术概览
android·binder·进程通信
红米饭配南瓜汤1 个月前
Android Binder通信02 - 驱动分析 - 架构介绍
android·架构·binder
似霰2 个月前
安卓智能指针sp、wp、RefBase浅析
android·c++·binder
KeithTsui2 个月前
ZFC in LEAN 之 前集的等价关系(Equivalence on Pre-set)详解
开发语言·其他·算法·binder·swift
刘争Stanley2 个月前
深入探究安卓 Binder 机制及其应用
android·java·kotlin·binder
Dingdangr2 个月前
对Android的Binder机制的了解
android·binder