4.5 KiB
4.5 KiB
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的结构定义即可,而不需要整套修改定义。
- HAL声明文件,接口定义修改
- types.hal: 数据类型及结构体定义
- IRKNeuralnetworks.hal: 接口定义
- ILoadModelCallback.hal: 可以自定义一些回调接口
- 如果新增了hal文件,需要在Android.bp中添加,也可以执行update-makefiles.sh更新(脚本更新可能有些问题,更新完需要检查下)。
- 更新HAL Server的实现代码 ——— 这里链接接入librknn_api.so
- 新增或修改接口,可以通过文档开头说的命令更新,也可以手动修改。命令更新会覆盖本地文件,请注意备份。
- RKNeuralnetworks.cpp: HAL接口转换到librknn_api接口
- 更新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相关头文件及动态库的效果;
- 修改或增加接口时,上述三组文件都需要修改。
- 更新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 |
|-------------------------------------------------------------------------------------------------------------------------------------|