主要参考文章:
HIDL最全编译流程:https://blog.csdn.net/u013357557/article/details/84561652
谷歌文档:https://source.android.google.cn/devices/architecture/hidl-cpp
解决:ninja: error: unknown target ‘MODULES-IN-hardware-libhardware-modules-XXXX’
用Android.bp编译,如果提示这个错误,需要修改一下顶层的Android.bp,加入当初目录路径即可。或者顶层用的是Android.mk,这就需要把它改成Android.bp。
解决Android.bp的依赖问题
编译输出错误:
echo "module android.hardware.xxx.xx@1.0-impl missing dependencies: libhw_zzz_zzz" && false
module android.hardware.xxx.xx@1.0-impl missing dependencies: libhw_zzz_zzz
找了好久,明明已经libhw_zzz_zzz这个模块已经编译完成了,并且out目录下都能找到,为什么会提示依赖缺失呢?后来发现问题原因:在Android.bp中定义的模块在Android.mk中可以依赖,但是Android.bp中的模块不能依赖Android.mk中的模块。 把被依赖模块改成bp编译后,错误消失。
Selinux 添加tee规则
在写完hidl的接口之后,烧录系统,ps看到hidl的sevice已经启动。写了个测试程序测试接口功能,但是在运行测试程序时,会卡住没有反应,logcat输出以下信息:
07-08 08:58:35.527 236 236 E SELinux : avc: denied { find } for interface=android.hardware.xx::xxx pid=1667 scontext=u:r:sudaemon:s0 tcontext=u:object_r:default_android_hwservice:s0 tcl
ass=hwservice_manager permissive=1
07-08 08:58:36.535 1667 1667 W /mnt/usb/xxxx: Waited one second for android.hardware.xx@1.0::xxx/default. Waiting another...
可以看到是SELinux的权限问题,查看google文档,有如下说明:
供应商分区中包含下面几个库。请让这些库从 coredomain 和非 coredomain 都可访问。
VNDK-SP-Ext,位于 /vendor/lib[64]/vndk-sp
SP-HAL,位于 /vendor/lib[64] 或 /vendor/lib[64]/hw
SP-HAL-Dep,位于 /vendor/lib[64] 或 /vendor/lib[64]/hw
将这些文件明确标记为 same_process_hal_file,因为在默认情况下,从 coredomain 无法访问 vendor 分区中的任何内容。请向供应商专用的 file_contexts 文件中添加类似下面的代码行。
/vendor/lib(64)?/hw/libMySpHal.so u:object_r:same_process_hal_file:s0
/vendor/lib(64)?/vndk-sp/libBase.so u:object_r:same_process_hal_file:s0
/vendor/lib(64)?/libBaseInternal.so u:object_r:same_process_hal_file:s0
于是开始添加hidl的tee规则。
有蛮多地方需要添加的,这里懒得讲了,可以参考tee文件里面已经添加好的规则来逐一添加。
添加完可以正常运行之行,可以用audit2allow来解决一些avc的内核打印,方法百度上有很多。
这篇写得烂尾了…