详细介绍:【底层机制】【Android】Binder架构与原理

news/2025/11/12 9:09:29/文章来源:https://www.cnblogs.com/ljbguanli/p/19212339

详细介绍:【底层机制】【Android】Binder架构与原理

Binder 架构与原理

一、Binder 整体架构

1. 架构组成
  • Client:服务调用方
  • Server:服务提供方
  • ServiceManager:服务管理器,Android 系统启动时初始化的特殊 Binder 服务
  • Binder 驱动:内核空间的核心组件,负责进程间通信
2. 通信模型
Client Process      Kernel Space       Server Process|                   |                   || -- IBinder.Proxy ->|                   ||                   | -- Binder Driver ->||                   |                   | -- IBinder.Stub|                   | <- Transaction ---|| <- Result --------|                   |

二、Binder 驱动核心机制

1. 内存映射(mmap)
// Binder 驱动关键数据结构
struct binder_proc {
struct hlist_node proc_node;
struct rb_root threads;        // 线程红黑树
struct rb_root nodes;          // Binder 节点
struct list_head delivered_death; // 死亡通知列表
};
struct binder_thread {
struct binder_proc *proc;      // 所属进程
wait_queue_head_t wait;        // 等待队列
struct binder_transaction *transaction_stack; // 事务栈
};

mmap 工作原理

  • 进程打开 /dev/binder 设备后调用 mmap()
  • Binder 驱动在内核空间分配缓冲区
  • 同时映射到内核空间和用户空间
  • 一次拷贝机制:数据从客户端用户空间拷贝到内核缓冲区,服务端直接读取
2. 数据传输流程
  1. Client 发送数据

    • 数据打包为 binder_transaction_data
    • 通过 ioctl(BC_TRANSACTION) 发送到驱动
    • 驱动查找目标 Binder 实体
  2. Server 接收数据

    • 服务线程通过 ioctl(BC_ENTER_LOOPER) 进入循环
    • 调用 ioctl(BINDER_WRITE_READ) 读取事务
    • 驱动唤醒等待的服务线程

三、AIDL 本质解析

1. AIDL 生成的代码结构
// 自动生成的 Binder 接口
public interface IMyService extends android.os.IInterface {
// Binder 本地对象(服务端实现)
public static abstract class Stub extends android.os.Binder implements IMyService {
@Override
public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) {
switch (code) {
case INTERFACE_TRANSACTION:
reply.writeString(DESCRIPTOR);
return true;
case TRANSACTION_doSomething:
data.enforceInterface(DESCRIPTOR);
int _arg0 = data.readInt();
String _result = this.doSomething(_arg0);
reply.writeNoException();
reply.writeString(_result);
return true;
}
return super.onTransact(code, data, reply, flags);
}
}
// Binder 代理对象(客户端使用)
private static class Proxy implements IMyService {
private android.os.IBinder mRemote;
@Override
public String doSomething(int param) {
android.os.Parcel _data = android.os.Parcel.obtain();
android.os.Parcel _reply = android.os.Parcel.obtain();
String _result;
try {
_data.writeInterfaceToken(DESCRIPTOR);
_data.writeInt(param);
mRemote.transact(Stub.TRANSACTION_doSomething, _data, _reply, 0);
_reply.readException();
_result = _reply.readString();
} finally {
_reply.recycle();
_data.recycle();
}
return _result;
}
}
}
2. AIDL 本质
  • 代码生成工具:将接口定义转换为 Binder 通信代码
  • Proxy-Stub 模式实现
    • Proxy:客户端代理,序列化参数并调用 transact()
    • Stub:服务端基类,反序列化参数并调用实际方法
  • 接口描述符机制:确保客户端和服务端接口版本一致

startActivity 的 Binder 调用全过程

一、进程内准备阶段

1. 发起调用
// Activity.java
public void startActivity(Intent intent) {
// 调用 ActivityTaskManager 服务
ActivityTaskManager.getService().startActivity(
mMainThread.getApplicationThread(),
mToken,
intent,
intent.resolveTypeIfNeeded(getContentResolver()),
null, // resultTo
null, // resultWho
0,    // requestCode
FLAG_ACTIVITY_NEW_TASK,
null, // options
null  // userId
);
}

二、Binder 调用链详细流程

1. 客户端到系统进程(第一次 Binder 调用)
Client Process (App) → System Server Process (AMS)

调用路径

  • Activity.startActivity()
  • ActivityTaskManager.getService().startActivity()
  • IActivityTaskManager.Stub.Proxy.startActivity()

Binder 事务

// IActivityTaskManager.aidl 生成的 Proxy 类
public int startActivity(IApplicationThread caller, String callingPackage,
Intent intent, ...) {
Parcel data = Parcel.obtain();
Parcel reply = Parcel.obtain();
data.writeStrongBinder(caller != null ? caller.asBinder() : null);
data.writeString(callingPackage);
intent.writeToParcel(data, 0);
// ... 其他参数序列化
mRemote.transact(TRANSACTION_startActivity, data, reply, 0);
reply.readException();
int result = reply.readInt();
return result;
}
2. 系统进程处理(AMS 侧)

AMS 处理逻辑

// ActivityTaskManagerService.java
public final int startActivity(IApplicationThread caller, ...) {
return getActivityStartController().obtainStarter(intent, ...)
.setCaller(caller)
.execute();
}

关键步骤

  1. 权限验证:检查调用者权限
  2. Intent 解析:解析目标 Activity 信息
  3. 进程检查:判断目标 Activity 所在进程是否已启动
  4. 栈管理:确定 Activity 应该放入哪个 Task
3. 暂停当前 Activity(第二次 Binder 调用)
System Server Process (AMS) → Client Process (App)

AMS 调用应用进程

// 通过 ApplicationThread 的 Binder 接口
app.thread.schedulePauseActivity(token, finished, userLeaving, configChanges);

应用进程处理

// ActivityThread.java - ApplicationThread 内部类
public final void schedulePauseActivity(IBinder token, ...) {
sendMessage(H.PAUSE_ACTIVITY, token);
}
// H(Handler)处理消息
case PAUSE_ACTIVITY: {
handlePauseActivity((IBinder)msg.obj, ...);
break;
}
private void handlePauseActivity(IBinder token, ...) {
ActivityClientRecord r = mActivities.get(token);
if (r != null) {
// 调用 Activity 的 onPause()
performPauseActivity(r, finished, reason, pendingActions);
}
}
4. 启动目标进程(如果需要)

进程创建流程

  1. AMS 通过 Process.start() 请求 Zygote
  2. Zygote fork 新进程
  3. 新进程入口:ActivityThread.main()
5. 启动目标 Activity(第三次 Binder 调用)
System Server Process (AMS) → Target Process (App)

AMS 调用目标进程

// 通过目标进程的 ApplicationThread
thread.scheduleLaunchActivity(new Intent(r.intent), ...);

目标进程处理

// ActivityThread.java
private void handleLaunchActivity(ActivityClientRecord r, ...) {
// 1. 创建 Activity 实例
Activity activity = mInstrumentation.newActivity(
cl, component.getClassName(), r.intent);
// 2. 创建 Application(如果不存在)
Application app = r.packageInfo.makeApplication(false, mInstrumentation);
// 3. 关联 Context
activity.attach(appContext, ...);
// 4. 调用 onCreate()
mInstrumentation.callActivityOnCreate(activity, r.state);
// 5. 调用 onStart()
activity.performStart();
// 6. 调用 onResume()
activity.performResume();
}

三、Window 管理相关的 Binder 调用

1. 窗口创建(第四次 Binder 调用)
Target Process (App) → WindowManagerService (WMS)

调用流程

// ActivityThread.handleResumeActivity()
final void handleResumeActivity(IBinder token, ...) {
// 调用 Activity.onResume()
ActivityClientRecord r = performResumeActivity(token, ...);
if (r.activity.mVisibleFromClient) {
// 添加窗口到 WMS
ViewManager wm = r.activity.getWindowManager();
wm.addView(decorView, layoutParams);
}
}
// WindowManagerGlobal.addView()
public void addView(View view, ViewGroup.LayoutParams params, ...) {
ViewRootImpl root = new ViewRootImpl(view.getContext(), display);
root.setView(view, wparams, panelParentView);
}

ViewRootImpl 与 WMS 通信

// ViewRootImpl.java
public void setView(View view, ...) {
// 通过 Session 与 WMS 通信
res = mWindowSession.addToDisplay(mWindow, ...);
}

四、Binder 驱动中的关键数据结构

1. 事务处理
struct binder_transaction_data {
union {
size_t handle;    // 对 Server 的引用
void *ptr;        // Server 的本地地址
} target;
void *data.ptr;       // 数据缓冲区
size_t data_size;     // 数据大小
};
// Binder 驱动处理事务
static void binder_transaction(struct binder_proc *proc,
struct binder_thread *thread,
struct binder_transaction_data *tr) {
// 查找目标 Binder 节点
target_node = binder_get_node(proc, tr->target.handle);
// 分配事务缓冲区
t = kzalloc(sizeof(*t), GFP_KERNEL);
// 拷贝数据到目标进程
t->buffer = binder_alloc_buf(target_proc, tr->data_size);
}

五、完整调用时序总结

[Client Process]           [Binder Driver]        [System Server]        [Target Process]|                           |                       |                       ||--- startActivity() ------>|                       |                       ||                           |-- TRANSACTION ------->|                       ||                           |                       |-- AMS.startActivity() ||                           |                       |                       ||                           |<-- schedulePauseActivity --|                  ||<-- onPause() ------------|                       |                       ||                           |                       |                       ||                           |                       |-- (如果需要)创建进程 -||                           |                       |                       ||                           |<-- scheduleLaunchActivity -|                  ||                           |                       |                  |-- onCreate()|                           |                       |                  |-- onStart()|                           |                       |                  |-- onResume()|                           |                       |                  |-- addView()|                           |                       |                  |   (WMS调用)

六、性能优化关键点

  1. 一次拷贝优势:相比其他 IPC(如 Socket 需要 4 次拷贝),Binder 只需 1 次用户空间到内核空间的拷贝
  2. 引用计数:Binder 对象自动管理生命周期,避免内存泄漏
  3. 线程池管理:Binder 驱动维护线程池,避免频繁创建销毁线程
  4. 死亡通知:通过 linkToDeath() 监控 Binder 服务状态,及时清理资源

整个 startActivity 过程涉及 3-4 次主要的 Binder 调用,通过精心设计的异步回调机制和状态管理,实现了跨进程的 Activity 启动流程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/962987.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025年防爆汽车窗膜制造厂口碑排行榜

2025年防爆汽车窗膜制造厂口碑排行榜,浦诺菲实力领跑随着汽车安全意识的不断提升,防爆汽车窗膜作为行车安全的重要保障,越来越受到车主的重视。2025年,防爆窗膜行业经过新一轮技术革新和市场洗牌,各大品牌的口碑排…

2025年资深的杭州个体户注册渠道口碑推荐榜

2025年杭州个体户注册渠道口碑推荐榜:八爪鱼财税服务领跑行业随着杭州数字经济的蓬勃发展,越来越多的创业者选择在这座创新之城开启个体经营之路。在2025年这个充满机遇与挑战的年份,选择一个靠谱的个体户注册渠道显…

linux终端颜色测试shell

#!/bin/bash # # This file echoes four gradients with 24-bit color codes # to the terminal to demonstrate their functionality. # The foreground escape sequence is ^[38;2;<r>;<g>;<b&…

2025年天津税收筹划推荐排行榜

2025年天津税收筹划推荐排行榜随着2025年天津税收政策的不断优化,企业税收筹划已成为提升竞争力的重要手段。在众多财税服务机构中,朝阳八爪鱼网络文化中心凭借其专业实力和创新服务模式,在天津税收筹划领域表现突出…

2025年肉类速冻冷库优质厂家口碑推荐榜

2025年肉类速冻冷库优质厂家口碑推荐榜随着肉类消费市场的持续增长,速冻冷库作为保障肉类品质的重要设施,其市场需求也在不断提升。在众多制冷设备厂家中,有一家凭借其专业技术和优质服务脱颖而出,成为行业内的佼佼…

ARC207A

AT_arc207_a Affinity for Artifacts CSP-S T4 同款trick(好像是) 首先注意到若某个灯在第 \(i\) 次被点亮,那么它的贡献为 \(\max(0,a_i-i+1)\),可以提出 \(a_i\) 变成 \(a_i+\max(-a_i,-i+1)\),变一下号就可以得到…

2025年城市主站消防车生产商推荐排行榜

2025年城市主站消防车生产商推荐排行榜楚胜汽车集团有限公司 - 行业领军者企业实力楚胜汽车集团有限公司作为中车城市交通有限公司旗下核心企业,在消防车制造领域展现出卓越实力。公司拥有70万平方米现代化生产基地,…

2025年3000全自动卫生纸加工设备直销厂家

2025年3000全自动卫生纸加工设备直销厂家推荐:优创机械专业制造,品质保证许昌优创机械制造有限公司作为专业的卫生纸机械制造企业,在2025年将继续为客户提供高品质的3000全自动卫生纸加工设备。我们拥有多年的行业经…

MySQL/MariaDB NULL 值查询优化:避开索引失效的坑

MySQL/MariaDB NULL 值查询优化:避开索引失效的坑在 MySQL 或 MariaDB 开发中,NULL值是处理 “缺失数据” 的常用方式,但包含IS NULL的查询往往隐藏着性能隐患。尤其当多个字段同时使用IS NULL条件时,查询可能从毫…

2025年地下室垃圾车厂商口碑推荐榜单

2025年地下室垃圾车厂商口碑推荐榜单楚胜汽车集团:行业领军品牌作为中车城市交通有限公司旗下核心企业,楚胜汽车集团有限公司在2025年地下室垃圾车领域表现卓越,凭借其深厚的技术积累和优质的产品质量,稳居行业口碑…

2025年不锈钢管道风机生产厂家排名

2025年不锈钢管道风机生产厂家权威排名随着工业发展和环保要求的提高,不锈钢管道风机在各行业的应用日益广泛。以下是2025年不锈钢管道风机生产厂家的综合排名:一、行业领先品牌1. 国豪空调设备有限公司综合评分:★…

emacs以服务器方式启动

nohup emacs --daemon > /dev/null 2>&1 &步骤 使用emacs --daemon启动emacs server.使用emacsclient -t 连接到这个server.即使关闭emacs后,daemon仍然存在,可重复连接;需要关闭的话,M-x kill-emacs…

revit api 自定义失败处理器

revit api 自定义失败处理器public class CustomFailureProcessor : IFailuresPreprocessor{public FailureProcessingResult PreprocessFailures(FailuresAccessor failuresAccessor){IList<FailureMessageAccesso…

2025年调速电机供应厂家排行

2025年调速电机供应厂家综合实力排行榜随着工业自动化水平的不断提升,调速电机作为关键动力设备,其市场需求持续增长。根据2025年最新市场调研数据,现为您呈现调速电机供应厂家综合实力排行榜:一、行业领军企业1. …

2025学校高空防坠网销售厂家口碑推荐榜

2025学校高空防坠网销售厂家口碑推荐榜前言随着校园安全意识的不断提升,学校高空防坠网的需求日益增长。2025年,市场上涌现出众多防坠网生产厂家,但产品质量和口碑参差不齐。本文将为您推荐值得信赖的高空防坠网厂家…

2025灯具不锈钢绳网批发厂家推荐排行

2025年灯具不锈钢绳网批发厂家推荐排行行业现状概述随着建筑装饰行业的快速发展,灯具不锈钢绳网作为兼具实用性与装饰性的新型材料,在2025年市场需求持续增长。这类产品不仅用于灯具悬挂固定,还广泛应用于商场、酒店…

2025免费简历模版行业领先的推荐榜单

2025免费简历模板行业领先推荐榜单🏆 顶级推荐:超级简历WonderCV✨ 核心优势 AI智能评分系统:实时检测简历质量,提供专业修改建议 3000+HR专家推荐模板:覆盖15+大行业,300+岗位 中英双语支持:满足国内外求职需…

2025agm fpga专业的排行榜单

2025年遨格芯微电子(AGM)FPGA专业排行榜单行业地位与市场表现综合排名表现国内FPGA市场前三强 连续三年稳居国产FPGA品牌前三 工业级应用市场份额持续增长 消费电子领域出货量领先 技术创新排名技术突破奖项可编程逻辑…

完整教程:AbMole小课堂丨重组R-spondin-3(RSPO3)的作用机理及其在类器官和干细胞研究中的应用

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025实木复合地板源头厂家哪家靠谱

2025年选购实木复合地板,彬迪地板是您的不二之选随着2025年的到来,家居装修市场对高品质实木复合地板的需求持续升温。在众多地板厂家中,如何选择一家靠谱的源头供应商成为消费者关注的焦点。今天,我们向您推荐深圳…