vendor/rockchip/hardware/interfaces/neuralnetworks/1.0/README.md

65 lines
4.5 KiB
Markdown
Raw Permalink Normal View History

2025-08-25 08:12:20 +08:00
https://source.android.com/devices/architecture/hidl
### 文件说明
- Android.bp
HAL的声明makefile写好*.hal文件后vendor/rockchip/hardware/interfaces/下执行update-makefiles.sh即可生成。
- *.hal
hidl源文件修改这些文件以更改接口。
- default/Android.bp
使用命令生成hidl-gen -o vendor/rockchip/hardware/interfaces/neuralnetworks/1.0/default -Landroidbp-impl -rrockchip.hardware:vendor/rockchip/hardware/interfaces -randroid.hidl:system/libhidl/transport rockchip.hardware.neuralnetworks@1.0
- default/*.cpp, *.h
使用命令生成hidl-gen -o vendor/rockchip/hardware/interfaces/neuralnetworks/1.0/default -Lc++-impl -rrockchip.hardware:vendor/rockchip/hardware/interfaces -randroid.hidl:system/libhidl/transport rockchip.hardware.neuralnetworks@1.0
生成后具体接口的实现需要在这些源文件中添加。HIDL_FETCH这个是service的加载入口需要自己添加。
- default/service/*
service的server注册服务一般不需要修改如果需要配置优先级等可以自己修改。
- default/sepolicy/*
SELinux配置目前不需要修改添加逻辑后需要修改对应配置。
- librknnhal_bridge/*
编译后生成在system/lib/下作为Client和app进行通讯。需要把该库添加到linker namespace中否则搜索不到: echo "librknnhal_bridge.so nopreload" >> /system/etc/public.libraries.txt
详情: https://android.googlesource.com/platform/ndk/+/master/docs/PlatformApis.md
- nnapi_implementation/*
提供给App jni链接的静态库能够调用system/lib/librknnhal_bridge.so中暴露出的接口。
### 修改接口流程
建议把接口定义成 request/response的模式这样修改接口时只需要改request/response的结构定义即可而不需要整套修改定义。
1. HAL声明文件接口定义修改
- types.hal: 数据类型及结构体定义
- IRKNeuralnetworks.hal: 接口定义
- ILoadModelCallback.hal: 可以自定义一些回调接口
- 如果新增了hal文件需要在Android.bp中添加也可以执行update-makefiles.sh更新脚本更新可能有些问题更新完需要检查下
2. 更新HAL Server的实现代码 ——— 这里链接接入librknn_api.so
- 新增或修改接口,可以通过文档开头说的命令更新,也可以手动修改。命令更新会覆盖本地文件,请注意备份。
- RKNeuralnetworks.cpp: HAL接口转换到librknn_api接口
3. 更新system/lib/librknnhal_bridge.so
- 这个库是暴露给app使用的需要配合nnapi_implementation使用。
- HalInterfaces.h: 头文件、命名空间等引入
- RockchipNeuralnetworksBuilder.*: 作为HAL Client的实体类通过构造函数初始化时会获取RKNN Service和allocator的实例。App最终会调到这里把nnapi_implementation的接口转换成HAL Client接口;
- librknnhal_bridge.map.txt: NDK libs暴露给app的接口
- rknnhal_bridge.*: 直接对接nnapi_implementation将虚对象"ARKNNHAL"转换成RKNN HAL Client, 以达到App持有Client对象却不用引入HAL相关头文件及动态库的效果
- 修改或增加接口时,上述三组文件都需要修改。
4. 更新nnapi_implementation.a给App去链接使用
- 通过dlopen librknnhal_bridge.so实现没有任何依赖。
- NeuralNetworksTypes.h: 映射函数定义,"函数名_fn"就是dlopen后获取到的实际函数指针。
- rknn_api.h: 提供给App的接口App端直接链接librknn_api_android.so后调用该头文件的接口即可使用HAL。
- nnapi_implementation.cpp: 映射实现,增加接口后,这三个文件都需要修改。
### 工作流程
```
|----------------------------------------------------|
| SystemApp/Bin -- Client | ==> | RKNN HAL -- Server |
|----------------------------------------------------|
```
#### c/c++ api (App直接作为HAL的Client)
```
|-------------------------------------------------------------------------------------------------------------------------------------|
|------------- Apk -------------------------|--------------------------------- System ---------------------------------|
|--------------------------------------------------------|----------------------------------------------------------------------------|
| App | ==> | jni | == link ==> | librknn_api.so | == dlopen ==> | librknnhal_bridge.rockchip.so -- Client | ==> | RKNN HAL -- Server |
|-------------------------------------------------------------------------------------------------------------------------------------|
```