如何在AOSP环境下通过Java访问自定义HIDL HAL接口
自定义HIDL接口Java层调用实现方案
只要你的自定义HIDL按AOSP规范完成编译配置,Java层调用完全可实现,不需要依赖Android Studio做特殊导入,所有接口存根会在AOSP编译阶段自动生成
编译配置前置要求
- 自定义
.hal文件必须按规则放置在AOSP源码树对应目录:通用路径为hardware/interfaces/<自定义接口名>/<版本号>/,例如ICustomHal1.0版本对应路径为hardware/interfaces/customhal/1.0/ - 同目录下的
Android.bp编译配置必须打开Java代码生成开关,配置示例:
hidl_interface { name: "vendor.xxx.customhal@1.0", root: "vendor.xxx.customhal", srcs: [ "ICustomHal.hal", "types.hal", ], interfaces: [ "android.hidl.base@1.0", ], gen_java: true, // 必须开启该配置,否则不会生成Java层调用所需的存根类 }
- 执行全量编译命令
m -j$(nproc)完成编译后,Java存根类会自动生成,生成路径为out/soong/.intermediates/hardware/interfaces/<自定义接口名>/<版本号>/<接口全量名>-java_gen_java/gen/srcs/,无需手动拷贝这些文件,AOSP编译系统会自动将其加入系统框架类路径。
AOSP源码树内的Java代码调用方法
- 如果是在AOSP源码树内开发(比如框架修改、内置系统应用),不需要手动导入任何依赖,直接按固定包名规则import即可:包名由HIDL接口的命名空间、版本号转换而来,例如接口全称为
vendor.xxx.customhal@1.0::ICustomHal,对应import语句为:
import vendor.xxx.customhal.V1_0.ICustomHal;
- 获取服务实例并调用的示例代码:
try { ICustomHal customHalService = ICustomHal.getService(true); // 直接调用.hal中定义的方法即可,跨进程通信、类型转换由系统自动完成 int result = customHalService.targetMethod(传入参数); } catch (RemoteException e) { // 处理服务未启动、跨进程调用异常、权限拦截等问题 e.printStackTrace(); }
Android Studio独立开发适配方案
如果需要在Android Studio中开发独立应用调用该HIDL接口,需满足以下要求:
- 应用必须使用系统签名,且在
AndroidManifest.xml中配置android:sharedUserId="android.uid.system",非系统应用会被SELinux、服务权限机制直接拦截,无法访问自定义HIDL服务 - 从AOSP编译产物中提取Java存根jar包,路径为
out/target/common/obj/JAVA_LIBRARIES/<接口全量名>-java_intermediates/javalib.jar,将其重命名后拷贝到Android Studio项目的libs目录下,在模块级build.gradle中添加依赖implementation files('libs/自定义名.jar'),即可正常import调用。
内容的提问来源于stack exchange,提问作者George
相关产品推荐
相关产品推荐

