HIDL实战开发-千里马android framework车载车技手机系统开发

平台 aosp8.1

1、创建hal文件

hardware/interfaces/hidltest/1.0/ITest.hal

package android.hardware.hidltest@1.0;
interface ITest {
	hello(string key) generates (int32_t result,string value);
};

2、生成对应的cpp文件

使用如下hidl命令:

hidl-gen -o hardware/interfaces/hidltest/1.0/default -Lc++-impl    -randroid.hardware:hardware/interfaces  android.hardware.hidltest@1.0

执行后生成如下Test.cpp,Test.h文件了

test@test:~/aosp/hardware/interfaces/hidltest$ tree
.
`-- 1.0
    |-- ITest.hal
    `-- default
        |-- Test.cpp
        `-- Test.h

2 directories, 3 files

3、生成编译hal实现代码 的Android.bp

命令:

hidl-gen -o hardware/interfaces/hidltest/1.0/default -Landroidbp-impl    -randroid.hardware:hardware/interfaces  android.hardware.hidltest@1.0

生成对于Android.bp

.
`-- 1.0
    |-- ITest.hal
    `-- default
        |-- Android.bp
        |-- Test.cpp
        `-- Test.h

// FIXME: your file license if you have one

cc_library_shared {
    name: "android.hardware.hidltest@1.0-impl",
    relative_install_path: "hw",
    // FIXME: this should be 'vendor: true' for modules that will eventually be
    // on AOSP.
    proprietary: true,
    srcs: [
        "Test.cpp",
    ],
    shared_libs: [
        "libhidlbase",
        "libutils",
        "android.hardware.hidltest@1.0",
    ],
}

4、生成一个自动生成 hal 接口的 Android.bp

(注意update-makefiles.sh 这个高版本谨慎使用,使用后注意git status看看,不要其他模块的Android.bp也修改,如果会修改其他的则不要使用,建议参考其他模块原生hidl手动加入既可以)
.
只需要在hardware/interfaces执行如下命令既可以

test@test:~/aosp/hardware/interfaces$ ./update-makefiles.sh 

`-- 1.0
    |-- Android.bp  ---自动生成的,目的是编译时候会自动把ITest.hal生成cpp
    |-- ITest.hal
    `-- default
        |-- Android.bp  ----编译cpp文件的bp
        |-- Test.cpp
        `-- Test.h

2 directories, 5 files

5、添加service.cpp,自启动rc,修改Android.bp

一般hal服务都需要开机自启动,需要有rc

service hidltest /vendor/bin/hw/android.hardware.hidltest@1.0-service
    class hal
    user  system
    group  system

上面default默认生成的bp是so,这里要把他变成可执行的服务,需要增加一个service.cpp作为main方法载体
hardware/interfaces/hidltest/1.0/default/service.cpp

#define LOG_TAG "android.hardware.hidltest@1.0-service"

#include <hidl/HidlSupport.h>
#include <hidl/HidlTransportSupport.h>

#include "Test.h"

using ::android::OK;
using ::android::sp;
using ::android::hardware::configureRpcThreadpool;
using ::android::hardware::joinRpcThreadpool;
using ::android::hardware::hidltest::V1_0::ITest;
using ::android::hardware::hidltest::V1_0::implementation::Test;


int main(int /* argc */, char* /* argv */ []) {
    sp<ITest> hidltest = new Test;
    configureRpcThreadpool(1, true /* will join */);
    if (hidltest->registerAsService() != OK) {//注册为hwbinder的服务
        ALOGE("Could not register service.");
        return 1;
    }
    joinRpcThreadpool();

    ALOGE("Service exited!");
    return 1;
}

同时Test.cpp也要进行简单实现:
在这里插入图片描述

同时修改对于的bp文件如下:
hardware/interfaces/hidltest/1.0/default/Android.bp

cc_binary {
    name: "android.hardware.hidltest@1.0-service",
    relative_install_path: "hw",
    proprietary: true,
    init_rc: ["android.hardware.hidltest@1.0-service.rc"],
    srcs: [
        "Test.cpp",
        "service.cpp"
    ],  
    shared_libs: [
        "libhidlbase",
        "libhidltransport",
        "libutils",
	    "liblog",
        "android.hardware.hidltest@1.0",
    ],
}

6、需要搞个test,来测试一下服务是否ok,这个时候需要

在1.0 目录创建test文件夹
分别创建如下文件:

`-- test
    |-- Android.bp
    `-- HidlTest.cpp

Android.bp内容如下:

cc_binary {
    name: "HidlTestClient",
    //vendor: true,
    srcs: ["HidlTest.cpp"],

    shared_libs: [
        "liblog",
        "libhardware",
        "libhidlbase",
        "libhidltransport",
        "libutils",
        "android.hardware.hidltest@1.0",
    ],

}

HidlTest.cpp内容如下:

#include <android/hardware/hidltest/1.0/ITest.h>
#include <hidl/Status.h>
#include <utils/misc.h>
#include <hidl/HidlSupport.h>
#include <stdio.h>
#include <string>

using namespace std;

using ::android::hardware::hidl_string;
using ::android::sp;
using ::android::hardware::hidltest::V1_0::ITest;

int main(){
    android::sp<ITest> service = ITest::getService();
    if (service == nullptr){
        printf("Failed to get service\n");
        return -1;
    }
    service->hello("hello", [&](int32_t result,string value){
        printf("result %d %s\n",result, value.c_str());
    });

    return 0;
}


7.再次执行hardware/interfaces/update-makefiles.sh

只需要在hardware/interfaces执行如下命令既可以(注意这个高版本谨慎使用,使用后注意git status看看,不要其他模块的Android.bp也修改,如果会修改其他的则不要使用,建议手动加入既可以)

test@test:~/aosp/hardware/interfaces$ ./update-makefiles.sh 

主要目的是把test目录的Android.bp可以加入编译

test@test:/media/test/49a0eb6b-f410-4eed-9e0a-952e3c75d2b2/home/test/android-8.1.0_r1$ cat hardware/interfaces/hidltest/Android.bp 
// This is an autogenerated file, do not edit.
subdirs = [
    "1.0",
    "1.0/default",
    "1.0/test",
]

"1.0/test"就是新加入的,不加入编译会报错始终找不到目标

8、配置注册到manifest.xml中

需要在自己设备目录找到自己的manifest.xml然后加入自己的hidl
device/generic/goldfish/manifest.xml

      <hal format="hidl">
        <name>android.hardware.hidltest</name>
        <transport>hwbinder</transport>
        <version>1.0</version>
        <interface>
            <name>ITest</name>
            <instance>default</instance>
        </interface>

9、selinux相关适配

这个相对比较复杂一点
在这里插入图片描述

10、测试验证

检查是否hidltest服务自启动进程运行着

generic_x86_64:/ # ps -A | grep hidltest
system        1381     1   12276   4152 binder_thread_read 7eab08d0c2b7 S android.hardware.hidltest@1.0-service

检测到确实有运hidltest行

检测一下是否有system可以与其正常通讯

generic_x86_64:/ # /system/bin/HidlTestClient                                                                                                                                                             
result 1 test ok

可以看到有正常返回正确的值

更多framework干货请关注“千里马学框架”

<think>首先,用户的问题是关于HIDL安卓系统中的信息。用户说:“我想查找关于HIDL安卓系统中的相关信息 请问HIDL安卓系统中的应用、原理及相关介绍”。这表明用户想了解HIDL的应用、原理和介绍。 回顾系统级指令: - 我必须使用$...$格式表示行内数学表达式(尽管在这个上下文中可能没有数学,但如果有变量或代码,我需要正确处理)。 - 独立公式用$$...$$。 - LaTeX语法必须正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识,例如[^1]。 用户提供了参考站内引用: - 引用[1]:关于HALHIDL的讨论,提到用户学习时参考了Composer的HAL,写过经典的HALHIDL,原理来自马哥课程。 - 引用[2]:关于安卓充电灯更新逻辑,涉及变量定义。 这些引用不是直接相关的用户需求;用户的上一个问题可能是关于HIDL的。指令说:“上述引用仅供参考,并不是用户真正的需求,请尽可能多的参考用户上一次的问题和你的回答。” 所以,我需要基于用户当前的问题来回答,而不是直接依赖这些引用。用户当前的问题是询问HIDL的应用、原理和介绍。 我的回答结构应该清晰,帮助用户逐步解决问题。确保回答真实可靠。我需要回忆HIDL的知识: - HIDLHAL Interface Definition Language)是Android中用于定义HAL(Hardware Abstraction Layer)接口的语言,从Android 8.0引入。 - 应用:它允许硬件供应商实现HAL接口,而不依赖于Android框架的源码变化。HIDL接口定义了硬件服务和框架之间的通信。 - 原理:基于RPC(Remote Procedure Call),使用Binder IPC机制进行进程间通信。HIDL文件定义了数据类型和方法,然后生成C++或Java代码。 - 介绍:HIDL取代了旧的HAL方式,提高了模块化和可维护性。 由于用户提到引用[1]中说“原理:还是马哥课程讲解的HAL原理,HIDL原理”,我可以参考这个,但要自然地添加引用标识。 步骤结构化回答: 1. **介绍HIDL**:解释什么是HIDL及其目的。 2. **原理**:描述工作原理,包括接口定义、通信机制。 3. **应用**:给出安卓系统HIDL的使用场景,如灯光控制(参考引用[2]提到灯光)。 4. **相关代码或示例**:如果有简单的示例代码。 5. **生成相关问题**:在末尾添加相关问题。 确保使用中文回答。 生成相关问题: - 类似于示例中的快速排序问题,我应该提问如: 1. HIDL和传统HAL有什么区别? 2. 如何编写HIDL接口? 3. HIDLAndroid系统中的性能如何? 添加引用: - 在回答中,如果我提到引用中的内容,自然地添加[^1]或[^2]。例如,提到灯光控制时,参考引用[2]。 完整回答结构: - 开头简要介绍。 - 分段:应用、原理、相关介绍。 - 代码块如果需要(比如简单HIDL接口定义)。 - 结尾相关问题。 HIDL示例代码: - 一个简单的HIDL接口定义: ```hidl interface IExample { getName() generates (string result); setValue(int32_t value) generates (bool success); }; ``` 但在回答中,我可以描述或用代码块。 现在,构建回答: 1. **介绍**:HIDL(硬件接口定义语言)是Android系统中用于定义硬件抽象层(HAL)接口的语言。 2. **应用**:在安卓中,它用于硬件服务和框架之间的通信,如灯光控制、传感器等(参考引用[2]提到灯光变量定义)[^2]。 3. **原理**:基于接口定义文件(.hal文件),生成客户端和服务器端代码;使用Binder IPC进行通信(参考引用[1]提到原理)[^1]。 4. **相关介绍**:简要历史,为什么引入(取代传统HAL)。 代码块:如果合适,添加一个简单的HIDL接口示例。 最后,生成相关问题。 </think>### HIDLAndroid系统中的介绍、原理与应用 HIDL(Hardware Interface Definition Language,硬件接口定义语言)是Android系统中用于定义硬件抽象层(HAL)接口的核心技术,从Android 8.0(Oreo)开始引入。它旨在解决传统HAL的兼容性问题,通过严格的接口定义实现硬件和框架的解耦,确保Android系统升级时无需修改硬件供应商的代码[^1]。下面我将从应用、原理和相关介绍三个方面逐步解释,确保回答基于可靠信息(如Android官方文档和常见实践)。 #### 1. **HIDL的应用场景** HIDL主要用于Android的硬件抽象层(HAL),作为硬件驱动程序与上层框架(如Framework和System Server)之间的桥梁。其典型应用包括: - **灯光控制**:在Android中,HIDL用于管理充电灯、通知灯等硬件操作。例如,定义灯光颜色和开关状态的变量(如`config_notificationsBatteryLedOn`和`config_notificationsBatteryLedOff`),这些变量通过HIDL接口传递给底层驱动实现硬件控制[^2]。 - **传感器和多媒体**:如摄像头、音频设备和传感器数据的处理,HIDL确保硬件事件(如陀螺仪数据)能高效传递给应用层。 - **电源管理**:控制电池状态和充电逻辑,HIDL接口处理电量变化事件,并通过系统服务更新UI。 这些应用体现了HIDL的核心优势:**模块化**(硬件供应商独立实现HAL)和**向后兼容**(Android版本升级不影响现有硬件驱动)。例如,灯光更新逻辑中,HIDL接口将框架层的配置值(如ARGB颜色)转换为硬件指令。 #### 2. **HIDL的工作原理** HIDL的原理基于**接口定义**和**进程间通信(IPC)**,确保跨进程或跨语言的调用安全高效。关键机制包括: - **接口定义语言**:HIDL使用`.hal`文件定义接口,包括方法、数据类型和回调。接口一经定义,就不能修改以保证兼容性。例如,一个简单的灯光控制接口可能定义为: ```hidl // 示例:ILights.hal package android.hardware.light@2.0; interface ILights { setLight(LightType type, LightState state) generates (Result result); getSupportedLights() generates (vec<LightType> types); }; ``` 这个文件会被编译生成C++或Java绑定代码。 - **通信机制**:HIDL默认使用**Binder IPC**进行进程间通信(类似Android的AIDL)。在`passthrough`模式下,客户端和服务器运行在同一进程;在`binderized`模式下,它们运行在独立进程中。通信开销低(通常延迟在毫秒级),数据序列化通过HIDL的自动代码生成器处理[^1]。 - **生命周期管理**:HIDL接口通过代理对象(Proxy)和桩对象(Stub)实现远程调用。例如,当Framework调用`setLight()`时,请求经由Binder传输到HAL实现层,执行硬件操作后返回结果。 整个过程遵循“定义-生成-实现”流程:先定义`.hal`文件,编译生成客户端/服务器代码,再由硬件供应商实现具体逻辑(如操作GPIO控制LED灯)[^1]。 #### 3. **相关介绍与背景** - **历史背景**:HIDL替代了传统的基于共享库的HAL(如Android 7.x的legacy HAL),解决了碎片化问题。《Android Compatibility Definition Document》要求所有新设备从Android 8.0起支持HIDL- **关键组件**: - **HIDL Daemon**:系统服务(如`hwservicemanager`),管理接口的生命周期。 - **版本控制**:接口支持主版本号(如`@1.0`到`@2.0`),允许在不破坏兼容性的前提下扩展功能。 - **优势**: - 提高安全性:通过IPC隔离,减少系统崩溃风险。 - 加速更新:Google可以在不涉及供应商代码的情况下更新框架。 - **局限性**:初期学习曲线陡峭,且调试复杂(需使用`lshal`工具检查接口状态)。 通过HIDLAndroid实现了硬件和软件的真正解耦,这在灯光控制等场景中显著提升了系统的稳定性和可维护性[^2]。如果您对具体实现感兴趣,可以参考Android源代码中的`hardware/interfaces/lights`模块。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千里马学框架

帮助你了,就请我喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值