Android Native binder 通信实例

本文介绍了如何在Android的Native层使用AIDL进行跨进程通信。首先定义了ISpeedTestService和ISpeedTestCallback两个AIDL接口,接着配置Android.mk文件,然后分别实现了Service端和客户端的代码,最后展示了运行结果。Service端启动定时器和发送线程,客户端获取Service并设置回调。运行结果显示了成功的 Binder 通信过程。
摘要由CSDN通过智能技术生成

最近在考虑android native 跨进程通信问题,之前用hidl实现过system进程和vendor进程通信,这次考虑用aidl 在native层实现跨进程通信,了解到binder通信最大发送数据是1MB , 想要测试看看跨进程大数据通信吞吐率能达到多少。 下面开始上代码。

1 定义接口AIDL

首先是定义接口,需要先想好我们需要定义哪些通信接口。把想要提供的接口、callback 定义好,后续通过继承接口类实现具体功能。aidl文件需要以其包名的路径格式放在代码工程目录的:aidl/com/test/speedtest 目录下面:

ISpeedTestService.aidl : 

package com.test.speedtest;
  
import com.test.speedtest.ISpeedTestCallback;  // 在aidl中使用到其他aidl定义的接口需要import

interface ISpeedTestService {
    oneway void startSpeedTest();   // oneway 修饰使得耗时的调用不阻塞当前线程,直接返回
    void setSpeedTestCb(ISpeedTestCallback cb);
}
 

ISpeedTestCallback.aidl:

package com.test.speedtest;
  
interface ISpeedTestCallback {
  oneway void onSpeedTestDone(in float speed);  // callback异步返回测试结果
  oneway void onSend(in byte[] buf, int length);   //通过callback接口给client发数据
}

aidl文件在编译时会自动生成源文件,路径在out/target/product/xxx/obj/EXECUTABLES/SpeedTestClient_intermediates/aidl-generated 目录下,里面会有头文件和cpp文件,我们只需要后面继承里面的类重新实现里面的逻辑即可。  

不知道具体路径在哪里可以通过find 命令去查找, 比如: find . -name ISpeedTestService.h

我们只需要继承BnSpeedTestService 和 BnSpeedTestCallback 两个类即可,其他类都用自动生成的,不知道怎么继承自动生成的代码的话需要先找到自动生成代码,然后对着这两个类的实现重写类的实现。

2. 配置Android.mk

aidl文件定义好了后配置Android.mk 文件或者Android.bp, 这里以Android.mk为例:

LOCAL_PATH := $(call my-dir)
  
include $(CLEAR_VARS)

LOCAL_SHARED_LIBRARIES := libcutils \
                          libutils \
                          libbinder \      #binder通信so库
                          liblog

LOCAL_MODULE :=  SpeedTestService
LOCAL_C_INCLUDES := $(LOCAL_PATH)/inc
LOCAL_AIDL_INCLUDES := $(LOCAL_PATH)/aidl
LOCAL_SRC_FILES := $(call all-cpp-files-under, server/src)  #包含service端cpp文件
LOCAL_SRC_FILES += $(call all-subdir-Iaidl-files, aidl)    # 包含所有aidl文件

include $(BUILD_EXECUTABLE)

include $(CLEAR_VARS)

LOCAL_SHARED_LIBRARIES := libcutils \
                          libutils \
                          libbinder \
                          liblog

LOCAL_MODULE :=  SpeedTestClient
LOCAL_C_INCLUDES := $(LOCAL_PATH)/inc
LOCAL_AIDL_INCLUDES := $(LOCAL_PATH)/aidl
LOCAL_SRC_FILES := $(call all-cpp-files-under, client/src)  #包含client端cpp文件
LOCAL_SRC_FILES += $(call all-subdir-Iaidl-files, aidl)

include $(BUILD_EXECUTABLE)
 

3. 实现Service端代码

SPee

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值