Binder 是如何贯穿 ART / Native / Kernel 的?

在理解了 Android Native 层如何运行 ART 与 Native Libraries 之后,接下来一定会遇到一个绕不开的问题:

Binder 到底是怎么把 ART、Native 和 Linux Kernel 串成一个整体的?

很多资料只会告诉你一句话:

Binder 是 Android 的 IPC 机制

真正的系统级理解,应该回答的是:

  • Binder 在 ART / Native / Kernel 各自扮演什么角色?
  • Java Binder 和 Native Binder 是不是两套?
  • 一次 Binder 调用,真实的执行链路是什么?

这篇文章,我们就从运行机制出发,把 Binder 彻底讲透。

一、先给结论(直接定锚)

Binder 不是某一层的组件,而是一套贯穿用户态与内核态的 IPC 机制体系:

  • ART 层:Java Binder(Framework / App 使用)

  • Native 层:C++ Binder(libbinder)

  • Kernel 层:Binder Driver(真正的 IPC 实现)

👉 三层协作,缺一不可。

二、Binder 在 Android 架构中的位置

基于我们前面采用的系统分层模型:

复制代码
Application
Application Framework
Native Layer
 ├─ Android Runtime(ART)
 └─ Native Libraries(libbinder 等)
HAL
Linux Kernel(Binder Driver)

可以看到:

  • Binder 横向贯穿多层
  • 唯一运行在内核态的是 Binder Driver
  • ART 和 Native 层只是 Binder 的 使用者和封装者

三、Kernel 层:Binder Driver(真正的核心)

1. Binder Driver 是什么?

Binder Driver 是一个 Linux 内核驱动,主要职责只有三件事:

  1. 跨进程数据传输
  2. 线程唤醒与调度
  3. 对象引用与生命周期管理

📌 它并不理解 Java、也不理解 C++,只做 IPC。

2. Binder Driver 的工作方式(简化)

复制代码
Client Process
   ↓ ioctl
Binder Driver(Kernel)
   ↓
Server Process
  • 通过 ioctl 与用户态通信
  • 数据在内核中完成拷贝或映射
  • 唤醒目标进程的 Binder 线程

👉 所有 Binder 通信,最终都必须经过 Binder Driver。

四、Native 层:C++ Binder(libbinder)

1. libbinder 的角色

Native 层通过 libbinder 对 Binder Driver 做了一层 面向对象封装

  • IBinder
  • BpBinder(Proxy)
  • BBinder(Stub)
  • Parcel

📌 libbinder 是 Native 世界中 Binder 的"门面"。

2. Native Binder 的典型调用链

复制代码
Client (Native)
   ↓
BpBinder.transact()
   ↓
libbinder
   ↓ ioctl
Binder Driver
   ↓
BBinder.onTransact()

典型使用场景:

  • SurfaceFlinger
  • CameraServer
  • AudioServer
  • HAL Service

📌 这些调用完全不经过 ART。

五、ART 层:Java Binder(Framework / App 使用)

1. Java Binder 从哪来?

Java Binder 并不是"新实现的一套 Binder",而是:

Java 层对 Native Binder 的封装

关键组件包括:

  • android.os.Binder
  • android.os.IBinder
  • Parcel
  • BinderProxy

2. Java Binder 的真实执行路径

复制代码
Framework / App (Java)
   ↓
android.os.Binder
   ↓ JNI
libbinder(Native)
   ↓ ioctl
Binder Driver(Kernel)
   ↓
Target Process

📌 Java Binder 最终仍然会落到 libbinder + Binder Driver。

六、一次完整的 Binder 调用,全链路长什么样?

Framework 调用 Native Service 为例:

复制代码
Framework (Java)
   ↓ Java Binder
ART Runtime
   ↓ JNI
libbinder (Native)
   ↓ ioctl
Binder Driver (Kernel)
   ↓
Native Service (C++)
   ↓
Native Libraries / HAL

关键点总结:

  • ART 不参与 IPC 本身
  • ART 只负责 Java → Native 的桥接
  • 真正的 IPC 在 Native + Kernel 完成

七、为什么 Binder 要这样分三层?

1️⃣ 内核只做"最小职责"

  • 不关心语言
  • 不关心对象模型
  • 只负责 IPC

👉 保持 Kernel 简洁、稳定、安全


2️⃣ Native 层负责"通用能力封装"

  • 面向对象
  • 高性能
  • 供 ART 和 Native Service 共用

3️⃣ ART 层只做"语言适配"

  • Java API 友好
  • 生命周期受控
  • 不引入性能敏感逻辑

👉 这是 Android 可维护性的关键设计。

八、一个常见误解(一定要避开)

❌ 错误理解:

Binder 是 ART 的一部分

✔ 正确认知:

Binder 的核心在 Linux Kernel

ART 只是 Binder 的一个使用者。

九、一句话总结(系统工程级)

Binder 是一套以内核 Binder Driver 为核心,通过 Native libbinder 向上抽象,并由 ART 提供 Java 封装的跨进程通信机制,贯穿了 Android 的 ART、Native 与 Kernel 三个世界。

写在最后

当你真正理解 Binder 时,你会发现:

  • Android 的 IPC 并不"魔法"
  • Binder 只是一个 设计非常克制的内核机制
  • 复杂性被分摊到了合适的层级

而这,正是 Android 能支撑庞大系统服务的根本原因。

相关推荐
帅次2 天前
Android 高级工程师面试速记版
android·java·面试·kotlin·binder·zygote·android runtime
帅次7 天前
Android 高级工程师面试参考答案:Framework、生命周期、View 与 Binder
android·面试·binder
Grackers11 天前
Android Perfetto 系列 10:Binder 调度与锁竞争
android·binder
小书房16 天前
Android Binder机制
binder·aidl
灵感菇_3 个月前
全面解析Android Binder机制
android·binder
刘信的csdn4 个月前
RK3568 Android11 使用AIDL添加Hal层binder通讯
binder·hal·aidl
tmacfrank4 个月前
Binder 预备知识
linux·运维·binder
李坤林4 个月前
Android Binder 详解(6) Binder 客户端的创建
android·binder
李坤林4 个月前
Android Binder详解【5】 ServiceManager
android·binder