多个基于AIDL的server,Binder驱动怎么区分它们
发布日期:2021-05-19 23:22:17 浏览次数:23 分类:精选文章

本文共 2064 字,大约阅读时间需要 6 分钟。

Binder服务与AIDL的技术实现

在Android系统中,Binder服务是将组件进程与用户空间中的服务进行通信的重要机制。要实现Binder服务,一个进程必须调用以下两个方法,并进入Binder循环:

void ProcessState::self()->startThreadPool();void IPCThreadState::self()->joinThreadPool();

通过以上两个方法,Binder设备节点被打开,内存映射完成,并进入与Binder驱动交互的循环状态。

IPCThreadState::joinThreadPool方法解析

void IPCThreadState::joinThreadPool(bool isMain) {mOut.writeInt32(isMain ? BC_ENTER_LOOPER : BC_REGISTER_LOOPER);do {result = getAndExecuteCommand();} while (result != -ECONNREFUSED && result != -EBADF);mOut.writeInt32(BC_EXIT_LOOPER);talkWithDriver(false);}

该方法告知Binder驱动进入Binder主循环,并处理来自Binder驱动的命令。getAndExecuteCommand方法负责与驱动进行数据交互。

status_t IPCThreadState::getAndExecuteCommand() {    result = talkWithDriver();    result = executeCommand(cmd);}

BinderCommand执行详解

status_t IPCThreadState::executeCommand(int32_t cmd) {    switch ((uint32_t)cmd) {        case BR_TRANSACTION:            // Binder驱动向Server发送请求,解析请求数据            result = mIn.read(&tr, sizeof(tr));            if (tr.target.ptr) {                error = reinterpret_cast
(tr.cookie)->transact(...); } else { error = the_context_object->transact(...); } break; // 其他命令类型... }}

Binder驱动实现细节

在Binder驱动中,binder_transaction函数处理命令类型:

static void binder_transaction(struct binder_proc *proc, struct binder_thread *thread, struct binder_transaction_data *tr, int reply) {    // 根据命令类型处理    switch (fp->type) {        case BINDER_TYPE_BINDER:        case BINDER_TYPE_WEAK_BINDER:            node = binder_new_node(proc, fp->binder, fp->cookie);            ref = binder_get_ref_for_node(target_proc, node);            break;        // 其他类型...    }}

AIDL服务的实现机制

在基于AIDL的服务中,Binder.java的构造函数初始化JavaBBinderHolder,并通过JNI层实现与Binder驱动的交互。服务注册过程通过addService方法完成,此时会生成DummyBinder对象,并通过Parcel.writeStrongBinder方法将其写入包中。

Parcel实现中,writeStrongBinder方法调用flatten_binder,将IBinder对象的cookie转换为Binder节点。通过Binder驱动的处理,服务方能够正确接收来自客户端的请求并进行处理。

技术总结

从技术实现来看,AIDL中的Binder服务通过IBinder接口与服务端进行交互,核心逻辑包含:

  • Binder节点的生命周期管理
  • Transaction处理机制
  • 驱动服务的注册与发现
  • 这种设计确保了在组件化架构下,进程间的通信和服务交互更加高效和可靠。

    上一篇:压缩目录,排除多个子目录
    下一篇:Binder:为什么要通过onTransact()调用目标方法

    发表评论

    最新留言

    能坚持,总会有不一样的收获!
    [***.219.124.196]2025年05月09日 10时49分27秒