AidConnect 开发者文档
简介
AidLux 是一款融合 Android 与 Linux 的系统,具备流媒体处理和 AI 推理加速等能力。随着产品的迭代发展,部分客户希望将 AidLux 作为服务载体,利用其处理能力与第三方(客户自有)应用进行数据交互。为满足这一需求,AidConnect 应运而生。
AidConnect 基于 AidIPC 构建,支持 AidLux 与第三方应用之间进行自定义大小的高速数据传输。开发者可通过 SDK 接口 或 手动配置 的方式添加通信管道的名称和大小。配置完成后,通信管道即可在 Android 或 Linux 环境中被访问,用于数据读写。
以第三方应用调用 AidLux 的 AI 推理能力为例,完整流程如下:
在 AidLux App 中通过界面或 SDK 添加通信管道名称和大小;
若为手动配置,需重启 AidLux App 以生效;通过 SDK 添加的通道则可立即生效;
Android 应用通过已配置的通道写入源数据;
AidLux Linux 端从对应通道读取数据并进行 AI 推理;
推理完成后,将结果数据写入另一条通道;
Android 应用从该通道读取推理结果并执行后续逻辑。
通过 AidConnect,AidLux 能够在 Android 与 Linux、以及第三方应用之间实现高效、灵活的数据流转与 AI 能力共享。
开发流程

支持情况
| Linux | Android | |
|---|---|---|
| C++ | ✅ | / |
| Python | 🚧 | / |
| Kotlin/Java | / | ✅ |
✅: 已支持 🚧: 计划支持
快速开始
安装
sudo aid-pkg update
## ubuntu 20.04
sudo aid-pkg -i -d aidconnect_1.0.0.2_arm64_ub2004.aid.gpg
## ubuntu 22.04
sudo aid-pkg -i -d aidconnect_1.0.0.2_arm64_ub2204.aid.gpg 联系阿加犀获取AidConnect Android SDK,并集成到Android项目工程中开始示例
以下示例是展示 AidConnect Linux 和 Android 如何进行数据传输,传输需要提前定义传输管道,或者通过 AidConnect Android SDK进行接口添加,两者选其一。传输管道配置存放在 AidLux App 里 /etc/opt/aidlux/memory_config
如果手动配置传输通道,规则如下:
- 打开
memory_config文件,手动在customer_block_array节点下添加 json 对象,json 对象包含传输的管道名称和管道的大小 (以兆为单位)。例如:
# 定义了test管道,大小为1M
{"cap":6,"m":3,"n":5,"size":5,"block":5,"customer_block_array":[{"name":"test","size":1}]}提示
使用 AidConnect SDK C++ 开发需要了解如下事项::
- 在安装完AidConnect C++ sdk,头文件存放路径
/usr/local/include/aidlux/aidconnect/aidconnect.hpp - 在安装完AidConnect C++ sdk,动态库存放路径
/usr/local/lib/aidlux/aidconnect/libaidconnect.so - 在安装完AidConnect C++ sdk,示例程序存放路径
/usr/local/share/aidconnect/examples
//AidConnect 初始化
Aidlux::AidConnect aidconnect;
int status = aidconnect.init();
if(EXIT_SUCCESS != status){
printf("aidconnect.init failed !\n");
return EXIT_FAILURE;
}
//获取管道
status = aidconnect.aidconnect_with_name("test");
if(EXIT_SUCCESS != status){
printf("aidconnect.aidkv_with_id failed !\n");
return EXIT_FAILURE;
}
//写数据到管道中
char aaa[] = "Hello Cpp";
printf("Set string[%s], length[%d]\n", aaa, (int)sizeof(aaa));
status = aidconnect.set_bytes(aaa, sizeof(aaa));
if(EXIT_SUCCESS != status){
printf("aidconnect.set_bytes failed !\n");
return EXIT_FAILURE;
}
//从管道读取数据
char* result = new char[10000];
uint64_t length = 0;
status = aidconnect.get_bytes(&result, &length);
if(EXIT_SUCCESS != status){
printf("aidconnect.get_bytes failed !\n");
return EXIT_FAILURE;
}
printf("Result string[%s], length[%ld]\n", result, length);//AidConnect 初始化
AidConntect.initialize(application,true,object : AidConnectCallback {
override fun initCallback(isInitSuccess: Boolean, keys: Set<String>?) {
if (isInitSuccess){
}else {
}
}
});
//添加管道,名为test,大小1M
val channels = AidConntect.addChannelWithName("test", 1)
if (channels==null){
Log.e("Activity","addChannelWithName failed")
}
//移除管道
val channels = AidConntect.removeChannelWithName("test")
if (channels==null){
Log.e("Activity","removeChannelWithName failed")
}
//获取管道
val aidConn = AidConntect.aidConnectWithName("test")
if (aidConn!=null){
Log.e("Activity","aidConnectWithName failed")
}else {
}
//写数据到管道中
val buffer = ByteArray(3840*2160*3)
val setFlag = aidConn.setBytes(buffer)
if (setFlag==true){
Log.i("Activity","setBytes successfully")
}else {
Log.e("Activity","setBytes failed")
}
//从管道读取数据
val buffer = ByteArray(3840*2160*3)
val bytes = aidConn?.getBytes(buffer,3840*2160*3)
if (bytes!=null){
Log.e("Activity","getBytes failed")
}else {
}
//AidConnect 释放
val ret = AidConntect.release()
if (ret==0){
Log.i("Activity","release successfully")
}else {
Log.e("Activity","release failed")
}