在android里使用hidl技术,代替了以前的dlopen的方式来加载第三方的so.从android8.0开始使用Android Treble框架来加载service.这里从我在实际开发中遇到的问题说起,在VTS测试服务是否存在时,老是报Cannot find entry XXX服务。各种关键接口找不到,也不知道问题出在哪里。所以只好看其源码实现了。
1.各种hal文件都继承胃IBase接口,而IBase定义在system/libhidl/transport/base目录下
2…hal会被hidl-gen程序进行解析,生成输出文件。下面看两个核心的接口的生成,一个是getService 一个是registerAsService
3.一般代码里经常看到IXXXXService.getService()。但是getService这个接口根本没查询不到。其实这个接口,是hidl-gen自动生成的。其核心文件是system/tools/generateCpp.cpp
接口declareGetService申明getService定义,截图如下
接口implementGetService实现了getService的定义,部分截图如下
declareServiceManagerInteractions接口申明registerAsService
implementServiceManagerInteractions接口实现registerAsService
从自动生成的代码来看,registerAsService基本就是调用hwservicemanager add接口把自己注册到map中去。这一块代码大家有兴趣自己去看,这里关注的是getService的调用。
来看下大体的流程图
这里要注意的是,我这个代码比较旧。根最新的版本差异是很大的,但原理差不多。
1.首先getService获取服务,紧接着就是getTransport的接口调用。我个人有理解就是在这里做了一层拦截处理,在配置文件里面没找到我们所要求的服务,就会报错并结束服务的获取。
这里首先会去system/etc/vintf/manifest.xml文件去找我们调用者的服务名,如果找到就返回。
如果没找到就会去vendor/etc/vintf/manifest.xml文件去找,如果找到就返回。如果没找到则返回NULLPRT
同时打印Cannot find entry xxx in either framework or device manifest.
所以,如果我们碰到这样的LOG后,首先要去检测这两个文件里面有没有配置我们调用的服务,没有就要自己配置。一般是没有配置引起的,当然也有可能是xml增加的语法有问题,比如对齐。个人感觉C++对xml支持不够强大。
以上是我自己的理解,如有不妥之处敬请提出。大家一起学习
Cannot find entry in either framework or device manifest
最新推荐文章于 2023-11-01 15:03:35 发布
1113

被折叠的 条评论
为什么被折叠?



