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

Android HIDL 介绍学习和实战应用 什么是HIDL? 官方回答: HAL 接口定义语言(简称 HIDL,发音为“hide-l”)是用于指定 HAL 和其用户之间的接口的一种接口描述语言 (IDL)。HIDL 允许指定类型和方法调用(会汇集到接口和软件包中)。从更广泛的意义上来说,HIDL 是用于在可以独立编译的代码库之间进行通信的系统。 HIDL 旨在用于进程间通信 (IPC)。进程之间的通信采用Binder机制。对于必须与进程相关联的代码库,还可以使用直通模式(在 Java 中不受支持)。 HIDL 可指定数据结构和方法签名,这.. 阅读详情
AI摘要

本文详细介绍了如何使用HIDL(HostInterfaceDefinitionLanguage)创建、生成并编译HAL(HardwareAbstractionLayer)文件,包括接口定义、CPP文件生成、Android.bp配置、服务启动、测试和MANIFEST.XML集成,以及SELinux适配等内容。

平台 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干货请关注“千里马学框架”

Hidl编程实战(一)——定义HAL服务 hidl基本知识可以参考官网也讲解了C++和Java实现hidl本文讲解C++Hal服务的创建。 阅读详情

相关推荐

Android HIDL 实例

前言: 从Android HIDL 详解一文得知HIDL 使用passthrough 模式,为了与原来的HAL 版本兼容。除了passthrough 模式,还有一种binderized模式。本文通过HIDL 中的Helloworld 进行实例分析,进一步了解HIDL 使用。 本文source code 基于Android P。 Step 1 确定环境 Android HIDL 编程......

私房菜 2万+

安卓车载车机手机framework系统开发WMS/AMS体验专题

Android手机车机大厂Framework系统-WMS/AMS系统专题实战课作者:千里马10年+Android系统及应用开发经验,曾就职于爱奇艺,美国unokiwi,中兴努比亚,主要红魔手机ROM创新技术规划,技术难题,亮点卖点挖掘突破,基本好多游戏特色功能(游戏空间,红魔时刻,一键连招,红魔投屏)都有我的成果,多次获得公司优秀员工,优秀发明人,优秀讲师,发布发明专利百余篇国内首个做android framework实战开发课程作者 ps:购买了课程一定记得联系客服加入课程专群基于最新国内aosp 13/android 13代码深入理解framework重点模块wms胜任wms相关的需求开发掌握系统闪黑,冻屏疑难问题解决成为业界wms/ams模块专家打下基础

Imatest-Dot Pattern

本文介绍了DotPattern模块测试方法,用于评估相机拍摄点阵图的表现。测试主要关注两点:色彩准确性(是否存在彩色噪点和杂边)和摩尔纹现象。测试步骤包括导入图片、选择分析区域、微调ROI、选择点状图类型和分析保存结果。测试结果包含横向色差、光学畸变和SMIATV畸变等数据,其中0.115%的色差值和0.004度的网格旋转角度表明相机表现良好,但-10.4%的SMIATV畸变显示存在明显桶形畸变。文章还提供了各项指标的具体解读标准。

weixin_64706696的博客 1351

千里马android framework开发解决Accessing hidden method限制,让应用访问隐藏方法(需要可以修改系统源码方案)

hi,粉丝朋友们大家好! 今天来给大家分享一下,就是经常大家会做安卓系统开发工作问到一个问题,那就是我如果framework代码中增加了一个方法啥的,但是我又不想公开给第三方应用知道,只想让我系统的应用知道,那该怎么办呢?其实这个时候经常就会用到一个hidden的标签,来代表这个方法是隐藏方法,隐藏方法就是给系统内部用的,意味着第三方app就无法使用。这个其实也很常见,自从android p开始android系统就开始对访问hidden的限制越来越严格,虽然我们网络上有各种奇葩招来逃避不允许调用hidden

learnframework的博客 1万+

零基础实战:YOLO检测头自定义替换全攻略

本文为零基础用户提供了YOLO检测头自定义替换的完整实战指南。通过将检测头比作汽车的“方向盘”,文章详细阐述了为何需要替换、如何寻找和集成新检测头模块、修改配置文件以及最终训练验证的全过程,旨在帮助用户针对特定任务(如小目标检测)提升模型性能。

perl8的博客 255

Laravel 结合 jwt-auth 实现无状态 API 认证(实战解析)

本文详细解析了如何在Laravel框架中结合jwt-auth实现无状态API认证,包括JWT的优势、环境搭建、Token签发与刷新、API路由保护等实战内容。通过具体代码示例和优化技巧,帮助开发者高效解决跨域认证问题,提升系统安全性。

weixin_29315569的博客 210

Android 经典hal开发实战-千里马android framework车载车机手机系统开发

上面的load方法就是我们说的hardware动态性的关键,它是在运行时候才真正依赖具体硬件抽象so,编译期间只需要依赖公共的hardware相关公共类既可以,不需要so,所以这里就给硬件抽象提供商带来很大灵活性,哪怕硬件厂商不提供也一般会有一个default的so保证不会产生什么严重的崩溃和强依赖问题,大大减低了aosp的代码对于硬件抽象的各个厂商的耦合性。在结构体 hw_module_methods_t 中只有一个成员,它是一个函数指针,名字是open,它主要作用就是用来打开硬件抽象层中给的硬件设备。

learnframework的博客 2783

功率电感的设计步骤

学习视频原链接截图1截图2。

qq_32419593的博客 4887

千里马android framework车机车载手机智能驾驶双屏互动实现方案

这个就是没有动画版本的双屏互动,功能其实也是实现的,但是体验是不是感觉起来差的太多,而且还带有黑屏。2、画面A的平移,两个屏幕都要进行显示,这个难度较大,得考虑好相关的画面怎么都可以显示在两个屏幕。这里其实不需要写代码,可以直接调用am display相关的命令即可以实现这个方法的调用。不过还好的是功能可以用,那么我们也根据wms课程基础后也来实现一下这个双屏互动的功能。1、多指全局动作监听,而不是在某个app的onTouch里面监听,这里其实之前的。

learnframework的博客 5967

2025华为OD机试真题目录汇总 B+C+D+E卷(570道)(Python语言)

本文是华为OD机试真题(Python 语言)专栏的目录贴(持续更新中…)华为OD是Outsourcing Dispacth模式,是华为和外企德科联合招聘的简称。目前华为大多数是OD招聘。OD模式也是华为提出的一种新的用工形式,每年都会从OD项目挑优秀员工转为正编。所有OD和正式员工一样对待,没有差别,部门平时开会、评审等活动都是一起参加的,是同薪同酬,都是由华为的HR直接定的薪资,看的是我们技术能力。华为是大企业,能到华为上班也是有能力的,每个部门都有好多职位,是金子,在哪都会发光。

KJ.JK 18万+

【YOLO系列】YOLOv8详解:模型结构、损失函数、训练方法及代码实现

YOLOv8是Ultralytics团队2023年推出的高效目标检测框架,在速度与精度平衡、多任务支持和易用性方面实现突破。模型采用改进的CSPDarknet主干网络、C2f模块和SPPF加速结构,结合PAN-FPN特征融合和解耦检测头设计,支持目标检测、实例分割和关键点检测任务。创新性地使用CIoU定位损失、Focal Loss置信度损失和动态样本分配策略,显著提升检测性能。实验表明,YOLOv8较前代模型mAP提升5-10%,在TensorRT加速下可达1000FPS,提供5种尺寸灵活选择,成为实时目标

一碗白开水一 2779

clearCallingIdentity与restoreCallingIdentity-千里马framework系统源码实战详解

hi,粉丝朋友大家好:今天带大家来学习一个系统开发过程中大家即“熟悉”又陌生的两个方法,分别是clearCallingIdentity和restoreCallingIdentity,一般他们是成对出现在我们的framework代码中,但大家平时分析源码时候好像并没有在意他的真正作用是什么?为啥在框架代码分析时候可以看到他的大量出现?

learnframework的博客 1308

基于YOLOv5s的RK3588多线程部署16FPS暴涨到120FPS 轻量化深度学习部署实战教程(包括性能优化与加速)37

本文介绍了如何在RK3588平台上利用线程池优化YOLOv5模型的推理性能。RK3588内置3个NPU核心,支持多核并行处理。作者设计了一个线程池架构:1个线程负责数据读取,10个线程处理NPU运算,1个线程输出结果。该架构包含任务队列、线程管理和工作线程三个核心组件,通过合理设置线程数、任务队列大小等参数确保性能稳定。文章提供了详细的C++实现代码,包括线程池初始化、任务提交、结果获取等功能模块,并讨论了多线程同步和内存管理的关键技术要点。该方案可显著提升深度学习模型在嵌入式设备上的部署效率。

FJN110的博客 9230

千里马2024年终总结-android framework实战

心里焦虑加大了,需要调节好平常心面对创业以来最大感受就是“创业艰难”,原本预想的很美好,终于可以有勇气为了理想和兴趣奋斗了,一定是每天满怀激情的干。实际情况是:当自己的兴趣与谋生的收入挂钩时候,一切变得不那么理想和美好。每天还是会有担心自己课程的销售情况,必然就会有焦虑,这种心态和上班兼职搞完全不是一回事。所以心态上确实是相比以前有焦虑一些,这个部分做的不够好。时间不够用创业初期,也没有很多资金搞团队,大部分工作都落到我的头上,比如一些售前咨询,课程研发录制,答疑服务等。

learnframework的博客 2003

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

千里马平台介绍(1)

因为是开源的,对甲方而言,获取了话语权。这里有个关键,就是平台的技术是开放的,离开了平台一样用:平台不会创造一个自己的语言,也不会开发一个专用的开发工具,全部都是开发技术。坦诚讲,千里马平台也是基于开源资源的,所以也会开源。首先再次强调,平台是平台,应用是应用,这里讨论的是平台特性,无关任何业务。从商业角度,平台是共享共建的,应用是各家独有的。平台的价值在于:平台上有很多应用,且这些应用可互联互通,界面操作一致;平台+应用是未来企业内部信息化的发展方向,就平台而言,很多团队都在做,例如。

wangbing1125的博客 2927

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

千里马Android Framework实战开发-Binder通信之startActivity跨进程源码分析

上节课我们已经讲解完了Binder常见使用的一些方法,下面这节课我们来讲解一些Binder跨进程通信在平时Framework及SystemServer源码分析场景。 (注意这个分析是基于我们的android 10,因为课程上讲过android 8.1,也相对比较清楚了,这里blog就单独写一下android 10,因为和8.1有一些差异,这样可以多学习到android 10的情况) 首先我们来看一副图: 1、 startActivity源码分析 上面是不是我们常见的一种App与系统SystemServer

learnframework的博客 1022

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

我们的世界

我们的世界

qq_24829537的博客 162

千里马android framework实战开发-binder驱动之oneway导致的transaction failed

csdn在线学习课程,课程咨询答疑和新课信息:QQ交流群:422901085进行课程讨论 android跨进程通信实战视频课程(加群获取优惠) 千里马android framework实战开发-binder驱动之oneway导致的transaction failed 首先来看错误: 06-15 12:10:36.686 31395 31507 W System.err: android.os.DeadObjectException: Transaction failed on small parcel; r

liaosongmao1的专栏 2599

千里马Android Framework实战课程-应用程序app的Binder启动篇

上一个学习专题zygote启动app进程时候,有简单讲过一下binder启动,但没有详细进行分析。这一节进行重点详细分析。 ProcessState的启动 sp<ProcessState> ProcessState::self() { Mutex::Autolock _l(gProcessMutex); if (gProcess != nullptr) { return gProcess; } gProcess = new ProcessState

learnframework的博客 3075

千里马2023年终总结-android framework实战

2023年开始全职做课程后,有了更多时间投入到framework的课程研发,可以把在公司里面的很多丰富经验都放到课程中来分享给大家。大专题课程都是经过非常严格的调研,主要调研因素有以下几个:1、这个专题课程马哥自己是不是有这方面比较深入的经验分享,比如马哥经常在公司里面处理wms闪黑等疑难问题,这类经验属于不太可能从网络学得到的,也基本上很少程序员知道也不可能外传的有用“绝招”,这种在我课程里会毫无保留地分享给大家。

learnframework的博客 2584

千里马Android Framework实战开发-跨进程通信专题博客总结

csdn在线学习课程,课程咨询答疑和新课信息:QQ交流群:422901085进行课程讨论 FrameWork入门课视频链接:https://edu.youkuaiyun.com/course/detail/30298 FrameWork实战课1视频链接:https://edu.youkuaiyun.com/course/detail/30275 android跨进程通信实战视频课程(加群获取优惠) 千里马Android Framework实战开发-跨进程通信专题介绍 1、跨进程通信之课程介绍 1 binder高级 应用程序app的

liaosongmao1的专栏 597
上一篇: 自学成为android framework工程师需要准备哪些装备-千里马车载车机系统开发学习
下一篇: Android 经典hal开发实战-千里马android framework车载车机手机系统开发
千里马学框架
博客等级 码龄6年 1万+粉丝 650原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

千里马学框架

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

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

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

打赏作者

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

抵扣说明:

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

余额充值