如何利用aidl-cpp工具简化Android Binder通信开发C++篇

302 阅读2分钟

用通俗易懂的方式讲解了如何利用aidl-cpp工具简化Android Binder通信开发。以下是关键点:


🌰 核心比喻

想象你要给隔壁房间的人传递纸条(跨进程通信)。传统方式需要自己设计纸条格式、传递规则(手动写Binder代码)。而aidl-cpp就像一台自动纸条生成机,你只需要告诉它要传递什么内容(定义接口),机器就会自动生成标准化的纸条模板。


🔑 核心四步流程

  1. ​定义通信协议​​(写AIDL文件)

    • 创建IHello.aidl文件,就像写一份"通信指南":

      java
      Copy
      package com.yuandaima;
      interface IHello {
          void hello();
          int sum(int x, int y);
      }
      
    • 📌 声明了两个远程方法:打招呼(hello)和计算求和(sum)

  2. ​自动生成代码​​(用aidl-cpp工具)

    • 运行命令生成C++代码:

      bash
      Copy
      aidl-cpp IHello.aidl ./ ./IHello.cpp
      
    • 🛠️ 自动生成:

      • BnHello.h(服务端基类)
      • BpHello.h(客户端代理类)
      • IHello.h(接口定义)
  3. ​实现服务端​​(HelloServer.cpp)

    • 继承自动生成的BnHello类:

      cpp
      Copy
      class IHelloServer : public BnHello {
          Status hello() { /* 实现hello */ }
          Status sum(int x, int y, int* result) {
              *result = x + y; // 实际计算
          }
      };
      
    • 🏃 启动服务:

      cpp
      Copy
      defaultServiceManager()->addService("IHello", new IHelloServer());
      
  4. ​实现客户端​​(HelloClient.cpp)

    • 获取服务代理:

      cpp
      Copy
      sp<IHello> hello = interface_cast<IHello>(binder);
      
    • 📞 远程调用:

      cpp
      Copy
      hello->hello();
      hello->sum(1,2, &result);
      

🛠️ 工具链运作

cdn.nlark.com/yuque/0/202…

💡 关键理解

  1. ​Binder双胞胎​​:

    • BnHello(服务端基类):处理请求的真身
    • BpHello(客户端代理):替身负责传递请求
  2. ​接口转换魔法​​:

    cpp
    Copy
    interface_cast<IHello>(binder) // 把Binder对象转成接口
    

    类似把USB接口转换成手机充电口

  3. ​线程池必要性​​:
    服务端启动线程池startThreadPool(),就像餐馆需要多个服务员同时接待客人


⚡ 快速验证

  1. 编译后通过adb运行:

    bash
    Copy
    adb push IHelloServer /data/local/tmp
    adb shell "./IHelloServer &"
    adb shell "./IHelloClient"
    
  2. 查看日志确认通信:

    bash
    Copy
    logcat | grep "aidl_cpp"
    

📚 学习延伸

  • ​Binder核心三剑客​​:

    • ​Binder驱动​​:内核层的"快递小哥"
    • ​ServiceManager​​:服务黄页
    • ​Proxy/Stub​​:客户端代理和服务端存根

通过aidl-cpp工具,开发者只需关注业务逻辑,无需再手动编写大量模板代码,极大提升了Binder通信的开发效率。就像用预制菜包做菜,省去了备菜过程,直接进入烹饪环节。