Android学习6 -- HAL-2 HIDL

本文详细描述了如何使用HIDL(HardwareInterfaceDefinitionLanguage)进行系统级硬件接口的开发,包括创建HAL、生成桩代码、添加hash、生成Android.bp文件、服务编译和兼容性矩阵设置等步骤。开发者在面对Android系统架构时面临的包名规则和参数选择也做了说明。
摘要由CSDN通过智能技术生成

没写完哈。

不说废话,直接上干活。

1 创建HAL

mkdir -p vendor/fanged/hidltest/1.0/default
vi vendor/fanged/hidltest/1.0/Ilovefanged.hal
package vendor.fanged.hardware.hidltest@1.0;

interface Ilovefanged {
    add(int32_t a, int32_t b) generates (int32_t result);
};

2 生成桩代码

m hidl-gen
hidl-gen -o vendor/fanged/hidltest/1.0/default -L c++-impl -rvendor.fanged.hardware:vendor/fanged -randroid.hidl:system/libhidl/transport  vendor.fanged.hardware.hidltest@1.0

hidl-gen -o $vendor/fanged/hidltest/1.0/default -Lc++-impl -rvendor.fanged.hardware:vendor/fanged/hardware -randroid.hidl:system/libhidl/transport android.hardware.Lovefanged@1.0

这里有个疑问是包名和路径的关系,待会在板子上再试试吧。

这里专门说一下hidl-gen的参数,-o 没啥问题,生成物路径。可以说的是包名,-L和-r,这几个真的搞得欲仙欲死。

首先是包名,这个是和路径绑定的,Java的玩法。比如说vendor.fanged.hardware.hidltest@1.0,路径就几乎必须是vendor/fanged/hardware/hidltest,中间android或者interface好像可以省。。。我再做做实验。

其次是-r,这个是可选的。对应package:path。中间有一些又是可以省的,容我做做试验。

最后是-L。常用的好像就是-Lc++-impl,-Lhash和-Landroidbp。

3 增加hash

hidl-gen -Lhash  -rvendor.fanged.hardware:vendor/fanged -randroid.hidl:system/libhidl/transport vendor.fanged.hardware.hidltest@1.0 > vendor/fanged/hidltest/current.txt

hidl-gen -Lhash -randroid.hardware.xxx:hardware/interfaces/xxx -randroid.hidl:system/libhidl/transport android.hardware.xxx@1.0 > hardware/interfaces/xxx/current.txt

hash放的位置,我还得看看。

4 生成Android.bp

source system/tools/hidl/update-makefiles-helper.sh

source system/tools/hidl/update-makefiles-helper.sh

do_makefiles_update vendor.xxx.hardware:vendor/xxx android.hardware:hardware/interfaces android.hidl:system/libhidl/transport

hidl-gen -o vendor/fanged/hidltest/1.0/default -L androidbp -rvendor.fanged.hardware:vendor/fanged -randroid.hidl:system/libhidl/transport  vendor.fanged.hardware.hidltest@1.0

5 在default中增加service.cpp

6 hw_get_module

7 在default中增加Android.bp

cc_binary {
    name: "android.hardware.xxx-service",
    defaults: ["hidl_defaults"],
    vendor: true,
    relative_install_path: "hw",
    srcs: [
        "service.cpp",
        "xxx.cpp"
    ],
    init_rc: ["android.hardware.xxx-service.rc"],
    shared_libs: [
        "vendor.xxx.hardware.xxx2@1.0",
        "libhidlbase",
        "libhidltransport",
        "liblog",
        "libutils",
    ],
    vintf_fragments: ["android.hardware.xxx-service.xml"],
}

8 android.hardware.xxx-service.xml

<manifest version="1.0" type="device">

<hal format="hidl">

<name>vendor.xxx.hardware.xxx2</name>

<transport>hwbinder</transport>

<version>1.0</version>

<interface>

<name>Ilogihid</name>

<instance>default</instance>

</interface>

</hal>

</manifest>

9 android.hardware.xxx-service.rc

service android.hardware.xxx-service /vendor/bin/hw/android.hardware.xxx-service

class hal

user system

group system

10 增加client

11 绕开Android12限制。

12 编译

使用mmm

13 兼容性矩阵

adb push compatibility_matrix.device.xml /system/etc/vintf/compatibility_matrix.device.xml
adb push compatibility_matrix.xml /vendor/etc/vintf/compatibility_matrix.xml
adb push android.hardware.tc_uvc-service.xml /vendor/etc/vintf/manifest/android.hardware.xxx-service.xml

14 使用脚本拷贝

scp scm@192.168.1.1:/LINUX/android/out/target/product/kalama/vendor/bin/hw/android.hardware.tc_uvc-service .
adb push android.hardware.xxx-service /vendor/bin/hw
scp scm@192.168.1.1:/LINUX/android/out/target/product/kalama/system/bin/xxx_test .
adb push xxx_test /vendor/bin
#scp scm@192.168.1.1:/LINUX/android/out/target/product/kalama/vendor/lib/hw/vendor.xxx.hardware.xxx2@1.0-impl.so .
#adb push vendor.hardware.test@1.0-impl.so /vendor/lib/hw
scp scm@192.168.1.1:/LINUX/android/out/target/product/kalama/vendor/lib/vendor.xxx.hardware.xxx2@1.0.so .
adb push vendor.xxx.hardware.xxx2@1.0.so /vendor/lib
scp scm@192.168.1.1:/LINUX/android/out/target/product/kalama/vendor/lib64/vendor.xxx.hardware.xxx2@1.0.so .
adb push vendor.xxx.hardware.xxx2@1.0.so /vendor/lib64

15 关闭tee

adb setenforce 0

16 运行

开两个窗口

。。。

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
HIDL(Hardware Interface Definition Language)是一种用于定义硬件接口的语言,它允许不同的进程之间通过共享内存进行通信。在Android系统中,HIDL被广泛用于实现跨进程的硬件服务。 下面是一个简单的HIDL Service和Java Service共享内存的代码示例: 1. HIDL Service端代码(C++): ```cpp // IMyService.hal package com.example; interface IMyService { int sendData(in vec<uint8_t> data); }; // MyService.cpp #include <android/hidl/manager/1.0/IServiceManager.h> #include <android/hidl/base/1.0/IBase.h> #include <com/example/IMyService.h> using android::hardware::hidl_vec; using com::example::IMyService; class MyService : public IMyService { public: // 实现IMyService接口的sendData方法 int32_t sendData(const hidl_vec<uint8_t>& data) override { // 在这里处理接收到的数据 // ... return 0; } }; int main() { // 注册MyService到HIDL服务管理器 android::sp<IMyService> service = new MyService(); android::hardware::defaultPassthroughServiceImplementation<IMyService>(); android::hardware::joinRpcThreadpool(); return 0; } ``` 2. Java Service端代码: ```java // IMyService.aidl package com.example; interface IMyService { int sendData(byte[] data); } // MyService.java package com.example; import android.os.RemoteException; public class MyService extends IMyService.Stub { // 实现IMyService接口的sendData方法 @Override public int sendData(byte[] data) throws RemoteException { // 在这里处理接收到的数据 // ... return 0; } } ``` 以上是一个简单的HIDL Service和Java Service共享内存的代码示例。在这个示例中,HIDL Service通过实现`IMyService`接口来提供服务,Java Service通过继承`IMyService.Stub`类来实现服务。两者都需要实现`sendData`方法来处理接收到的数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值