Android11 添加HIDL接口编译报错

在Android11系统中,基于QCS6125硬件平台,添加HIDL接口后遇到ABI不兼容的错误。该问题通过执行创建参考dump文件的脚本解决,更新ABI参考并提交修改后的lsdump文件,从而使得构建过程通过校验。此方法涉及对VNDK的兼容性检查和build规则的规避。

软件平台:Android11

硬件平台:QCS6125

近日,在基线代码的Hardware层添加了HIDL接口,整编出现了如下报错:

[ 46% 55871/118986] //hardware/interfaces/graphics/composer/2.4:android.hardware.graphics.composer@2.4 header-abi-diff android.hardware.graphics.composer@2.4.so.abidiff
FAILED: out/soong/.intermediates/hardware/interfaces/graphics/composer/2.4/android.hardware.graphics.composer@2.4/android_vendor.30_arm64_armv8-a_shared/android.hardware.graphics.composer@2.4.so.abidiff
(prebuilts/clang-tools/linux-x86/bin/header-abi-diff -allow-unreferenced-changes -allow-unreferenced-elf-symbol-changes -lib android.hardware.graphics.composer@2.4 -arch arm64 -o 'out/soong/.intermediates/hardware/interfaces/graphics/composer/2.4/android.hardware.graphics.composer@2.4/android_vendor.30_arm64_armv8-a_shared/android.hardware.graphics.composer@2.4.so.abidiff' -new 'out/soong/.intermediates/hardware/interfaces/graphics/composer/2.4/android.hardware.graphics.composer@2.4/android_vendor.30_arm64_armv8-a_shared/android.hardware.graphics.composer@2.4.so.lsdump' -old prebuilts/abi-dumps/vndk/30/64/arm64_armv8-a/source-based/android.hardware.graphics.composer@2.4.so.lsdump)|| (echo 'error: Please update ABI references with: $ANDROID_BUILD_TOP/development/vndk/tools/header-checker/utils/create_reference_dumps.py  -l android.hardware.graphics.composer@2.4' && (mkdir -p $DIST_DIR/abidiffs && cp 'out/soong/.intermediates/hardware/interfaces/graphics/composer/2.4/android.hardware.graphics.composer@2.4/android_vendor.30_arm64_armv8-a_shared/android.hardware.graphics.composer@2.4.so.abidiff' $DIST_DIR/abidiffs/) && exit 1)
******************************************************
error: VNDK library: android.hardware.graphics.composer@2.4's ABI has INCOMPATIBLE CHANGES Please check compatibility report at: out/soong/.intermediates/hardware/interfaces/graphics/composer/2.4/android.hardware.graphics.composer@2.4/android_vendor.30_arm64_armv8-a_shared/android.hardware.graphics.composer@2.4.so.abidiff
******************************************************
error: Please update ABI references with: $ANDROID_BUILD_TOP/development/vndk/tools/header-checker/utils/create_reference_dumps.py  -l android.hardware.graphics.composer@2.4
[ 46% 55872/118986] //hardware/interfaces/radio/1.1:android.hardware.radio@1.1 header-abi-linker android.hardware.radio@1.1.so.lsdump
[ 46% 55873/118986] Install: out/target/product/qssi/system/apex/com.android.vndk.current/lib64/android.hardware.secure_element@1.2.so
[ 46% 55874/118986] //system/hardware/interfaces/net/netd/1.0:android.system.net.netd@1.0 link android.system.net.netd@1.0.so
[ 46% 55875/118986] //hardware/interfaces/media/c2/1.0:android.hardware.media.c2@1.0 generate toc android.hardware.media.c2@1.0.so

看起来像是VNDK校验的问题,这个问题可以通过多个渠道规避解决,一种就是修改build的规则,将VNDK校验关掉,一种是直接修改校验文件,我才用的后者,于是按照日志中的提示,执行了如下指令:

$ANDROID_BUILD_TOP/development/vndk/tools/header-checker/utils/create_reference_dumps.py -l android.hardware.graphics.composer@2.4 -product XXX

注意后边的product参数是在执行前边部分报错退出来的,需要将自己的product参数加上,去android根目录执行上述指令,最后会提示如下生成文件:

[100% 367/367] writing build rules ...
build/make/core/Makefile:892: warning: overriding commands for target `out/target/product/trinket/vendor/lib/modules/rdbg.ko'
build/make/core/Makefile:892: warning: ignoring old commands for target `out/target/product/trinket/vendor/lib/modules/rdbg.ko'
[100% 833/833] //hardware/interfaces/graphics/composer/2.4:android.hardware.graphics.composer@2.4 header-abi-linker android.hardware.graphics.composer@2.4.so.lsdump
Creating dumps for target_arch: arm and variant  armv7-a-neon
Created abi dump at /home/jianbin/code/LINUX/android/prebuilts/abi-dumps/vndk/30/64/arm_armv7-a-neon/source-based/android.hardware.graphics.composer@2.4.so.lsdump
Creating dumps for target_arch: arm64 and variant  armv8-a
Created abi dump at /home/jianbin/code/LINUX/android/prebuilts/abi-dumps/vndk/30/64/arm64_armv8-a/source-based/android.hardware.graphics.composer@2.4.so.lsdump

可以看到在prebuilts目录生成了两个lsdump文件,cd到相应目录,git status看到文件确实被修改了,git commit这俩文件即可,这样其他人sync下来,直接就会build通过而不再报这个错误。

Mark。

<think>我们正在解决Android 9中使用HIDL时出现的'Cannot find entry'错误。 根据引用[1]中的信息,类似错误可能是由于VNDK库列表不一致导致的。在Android构建系统中,VNDK(Vendor Native Development Kit)库是供应商实现HAL所依赖的核心库。如果HAL模块被错误地添加VNDK列表中,但未在相应的current.txt或版本特定的txt文件(如30.txt)中列出,就会导致编译错误。 但是,用户遇到的是运行时错误('Cannot find entry'),而不是编译错误。因此,我们需要从运行时加载HIDL服务的角度来考虑。 常见原因: 1. HAL服务未正确注册:HIDL服务需要在设备启动时注册到hwservicemanager中。如果服务没有注册,客户端尝试获取服务时就会报告“Cannot find entry”。 2. SELinux策略限制:SELinux可能阻止了服务进程的启动或注册。 3. 服务二进制文件缺失或权限问题:HAL服务可执行文件可能不在系统分区中,或者没有执行权限。 4. 服务未启动:可能是init.rc脚本中服务定义有误,导致服务未启动。 解决方案步骤: 步骤1:检查服务是否注册 在设备上执行: ```shell adb shell hidl-ls ``` 或者对于特定接口(假设接口android.hardware.foo@1.0::IFoo): ```shell adb shell hidl-ls android.hardware.foo@1.0::IFoo ``` 如果列表中不存在,则服务未注册。 步骤2:检查服务进程是否运行 使用ps命令查看服务进程是否在运行。例如,如果服务进程名为vendor.foo_service,则: ```shell adb shell ps -A | grep foo_service ``` 步骤3:检查init.rc文件 确保在设备的vendor/etc/init/目录下有对应的init.rc文件(例如vendor.foo_service.rc),并且其中定义了服务启动命令和接口注册。 示例init.rc文件内容: ``` service vendor.foo_service /vendor/bin/hw/foo_service class hal user system group system ``` 步骤4:检查SELinux策略 查看日志中是否有avc拒绝信息: ```shell adb logcat | grep avc ``` 如果有,需要添加相应的SELinux规则。 步骤5:检查manifest.xml文件 确保在vendor/manifest.xml(或类似的位置)中声明了HIDL服务。例如: ```xml <hal format="hidl"> <name>android.hardware.foo</name> <transport>hwbinder</transport> <version>1.0</version> <interface> <name>IFoo</name> <instance>default</instance> </interface> </hal> ``` 步骤6:检查HIDL_FETCH_*函数 在服务实现中,必须实现HIDL_FETCH_*函数(例如HIDL_FETCH_IFoo)并返回接口的实例。确保该函数被正确实现且没有返回nullptr。 步骤7:检查服务可执行文件 确保服务可执行文件被正确推送到设备的/vendor/bin/hw/目录下,并具有执行权限(权限应为755)。 如果以上步骤都检查无误,问题应该可以解决。 引用[2]和[3]提到了HAL实现文件的位置,这提醒我们在开发HIDL服务时,代码应放在正确的目录下(如vendor/.../interfaces/...)。同时,引用[4]提到了系统启动的早期阶段,如果服务需要在引导早期启动,应确保它被放置在正确的启动类中(如`class hal`)。 根据经验,最常见的错误是init.rc文件配置错误或SELinux权限问题。 如果问题仍然存在,请提供更详细的错误日志,以便进一步分析。 生成相关问题: 1. 如何调试HIDL服务无法注册的问题? 2. 在Android HIDL开发中,如何正确配置init.rc文件? 3. 如何为HIDL服务添加SELinux策略? 4. Android HIDL服务的启动过程是怎样的?</think>### Android 9 HIDL "Cannot find entry" 错误解决方案 该错误通常发生在 HIDL 服务未正确注册或客户端无法定位服务实现时,以下是系统级排查方案: #### 1. **检查 HIDL 服务注册状态** - 在设备上执行命令验证服务是否注册: ```shell adb shell hidl-ls -r # 列出所有已注册的 HIDL 服务 ``` 若目标服务(如 `android.hardware.foo@1.0::IFoo`)未列出,说明服务未正确注册。 #### 2. **验证 manifest 声明** - 确保在 `manifest.xml` 中声明了 HIDL 接口: ```xml <!-- 示例:vendor/manifest.xml --> <hal format="hidl"> <name>android.hardware.foo</name> <transport>hwbinder</transport> <version>1.0</version> <interface> <name>IFoo</name> <instance>default</instance> </interface> </hal> ``` 文件路径参考:`vendor/<vendor>/<device>/manifest.xml`[^3] #### 3. **检查 init.rc 服务启动** - 确认服务在 `init.rc` 中正确启动: ```rc # 示例:vendor/etc/init/hw/foo_service.rc service vendor.foo_service /vendor/bin/hw/foo_service class hal user system group system ``` - 重启服务并检查日志: ```shell adb shell stop vendor.foo_service adb shell start vendor.foo_service adb logcat | grep foo_service ``` #### 4. **验证 SELinux 策略** - 检查 avc 拒绝日志: ```shell adb shell dmesg | grep avc ``` - 添加缺失策略(示例): ```te # 文件:device/<vendor>/sepolicy/vendor/foo_service.te allow foo_service hwservicemanager_prop:file read; allow foo_service hwservice_manager:service_manager add; ``` #### 5. **检查 VNDK 兼容性** - 确认 `current.txt` 包含所需库(Android 9 对应 `28.txt`): ```txt # 文件:build/make/target/product/vndk/28.txt libhidlbase.so libhidltransport.so ``` 若缺失关键库,需在 `device.mk` 添加: ```makefile PRODUCT_PACKAGES += libhidlbase libhidltransport ``` 此错误通常由 VNDK 库列表不一致引起[^1]。 #### 6. **验证 HIDL_FETCH_ 实现** - 在服务实现中确保导出符号: ```cpp // 文件:vendor/xxx/hardware/foo/1.0/service.cpp extern "C" IFoo* HIDL_FETCH_IFoo(const char* /* name */) { return new FooImplementation(); // 必须返回有效实例 } ``` - 检查映射文件: ```map # 文件:vendor/xxx/hardware/foo/1.0/Android.bp symbols_file: "foo.hidl.28.map.txt" ``` #### 7. **清除构建缓存** - 删除中间文件后重新编译: ```shell make clean make -j24 ``` > **关键日志定位**:搜索 `hwservicemanager` 相关日志: > ```shell > adb logcat | grep -E 'hwservicemanager|HIDL' > ``` --- ### 相关问题 1. 如何调试 HIDL 服务的 SELinux 权限问题? 2. Android 9 的 VNDK 机制与旧版本有何区别? 3. HIDL 服务注册失败时如何分析 `hwservicemanager` 日志? 4. 如何为自定义 HIDL 接口编写正确的 `manifest.xml` 声明? [^1]: VNDK 库列表不一致导致的编译错误 [^2]: HAL 实现文件路径参考 [^3]: HIDL 接口定义文件位置 [^4]: 系统服务启动阶段说明
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值