最近在考虑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