Android-HIDL实例解析

HIDL 简介

HAL interface definition language or HIDL (pronounced “hide-l”) is an interface description language (IDL) to specify the interface between a HAL and its users. It allows specifying types and method calls, collected into interfaces and packages. More broadly, HIDL is a system for communicating between codebases that may be compiled independently.

HIDL 是用于指定 HAL 与其用户之间接口的一个接口描述语言(Interface Description Language),它允许定义变量和函数类型做成封装接口给其他程序调用。通俗的说,HIDL是两个独立程序的桥梁,另外两个程序可以独自编译生成互不影响。

HIDL is intended to be used for inter-process communication (IPC). Communication between processes is referred to as Binderized. For libraries that must be linked to a process, a passthough mode is also available (not supported in Java).

HIDL 实际上是用于进行进程间通信(Inter-process Communication,IPC)。进程间的通信可以称为 Binder 化(Binderized)。对于必须连接到进程的库,也可以使用 passthough 模式(但在Java中不支持)。

HIDL specifies data structures and method signatures, organized in interfaces (similar to a class) that are collected into packages. The syntax of HIDL will look familiar to C++ and Java programmers, though with a different set of keywords. HIDL also uses Java-style annotations.

HIDL 将指定的数据结构与方法签名组织到接口中,这些接口又会被收集到包中以供使用。它的语法与 C++、JAVA 是类似的,不过他们的关键字存在一些差异。其注释风格与 JAVA 是一致的。

为什么需要HIDL

(HIDL design)

The goal of HIDL is that the framework can be replaced without having to rebuild HALs. HALs will be built by vendors or SOC makers and put in a /vendor partition on the device, enabling the framework, in its own partition, to be replaced with an OTA without recompiling the HALs.

设计 HIDL 这个机制的目的,主要是想把**框架(framework)**与 HAL 进行隔离,使得框架部分可以直接被覆盖、更新,而不需要重新对 HAL 进行编译。HAL 的部分将会放在设备的 /vendor 分区中,并且是由设备供应商(vendors)或 SOC 制造商来构建。这使得框架部分可以通过 OTA 方式更新,同时不需要重新编译 HAL。

上图是Framework和HAL的发展图示,之前,具体是到什么时候,我没有去考证,如果知道的同学可以留个言说下,Framework直接调用 HAL,这样导致一个问题,如果HAL增加了什么接口,就需要重新整个都编译系统。

大佬们就发现了这个问题,然后就想多加一个东西,这个东西可以规范一些接口,底层的同学就去填充这些接口就好了。然后就有了直通模式Binderized化模式


测试demo源码

代码位置

  • https://github.com/weiqifa0/android-hidl-demo/blob/master/README.md

源码结构

weiqifa@bsp-ubuntu1804:~/mt8167s-9.0-sdk$ tree hardware/interfaces/naruto/
hardware/interfaces/naruto/
└── 1.0├── Android.bp├── default│   ├── Android.bp│   ├── android.hardware.naruto@1.0-service.rc│   ├── Naruto.cpp│   ├── Naruto.h│   └── service.cpp├── INaruto.hal└── test├── Android.mk└── client.cpp3 directories, 9 files
weiqifa@bsp-ubuntu1804:~/mt8167s-9.0-sdk$

default 里面编译后会生成服务,服务的名字看Android.bp文件,里面有指定了名字,这个名字需要和系统修改对应起来。

test这个目录是测试程序,会编译生成一个测试程序,需要先执行服务,再执行测试程序,代码比较简单,就没有必要解释了。

测试平台

  • Android 9.0 SDK

  • MTK8167s 硬件平台

系统部分修改

weiqifa@bsp-ubuntu1804:~/mt8167s-9.0-sdk$ git diff
diff --git a/build/make/target/product/vndk/28.txt b/build/make/target/product/vndk/28.txt
old mode 100644
diff --git a/build/make/target/product/vndk/28.txt b/build/make/target/product/vndk/28.txt
old mode 100644
new mode 100755
index 712e91c587..82b4f53a7e
--- a/build/make/target/product/vndk/28.txt
+++ b/build/make/target/product/vndk/28.txt
@@ -106,6 +106,7 @@ VNDK-core: android.hardware.media.bufferpool@1.0.soVNDK-core: android.hardware.media.omx@1.0.soVNDK-core: android.hardware.media@1.0.soVNDK-core: android.hardware.memtrack@1.0.so
+VNDK-core: android.hardware.naruto@1.0.soVNDK-core: android.hardware.neuralnetworks@1.0.soVNDK-core: android.hardware.neuralnetworks@1.1.soVNDK-core: android.hardware.nfc@1.0.so
diff --git a/build/make/target/product/vndk/current.txt b/build/make/target/product/vndk/current.txt
old mode 100644
new mode 100755
index 712e91c587..82b4f53a7e
--- a/build/make/target/product/vndk/current.txt
+++ b/build/make/target/product/vndk/current.txt
@@ -106,6 +106,7 @@ VNDK-core: android.hardware.media.bufferpool@1.0.soVNDK-core: android.hardware.media.omx@1.0.soVNDK-core: android.hardware.media@1.0.soVNDK-core: android.hardware.memtrack@1.0.so
+VNDK-core: android.hardware.naruto@1.0.soVNDK-core: android.hardware.neuralnetworks@1.0.soVNDK-core: android.hardware.neuralnetworks@1.1.soVNDK-core: android.hardware.nfc@1.0.so
diff --git a/device/mediatek/mt8167/manifest.xml b/device/mediatek/mt8167/manifest.xml
index 2ae425901b..0bef90c30e 100644
--- a/device/mediatek/mt8167/manifest.xml
+++ b/device/mediatek/mt8167/manifest.xml
@@ -29,6 +29,16 @@<instance>default</instance></interface></hal>
+
+<hal format="hidl">
+    <name>android.hardware.naruto</name>
+    <transport>hwbinder</transport>
+    <version>1.0</version>
+    <interface>
+        <name>INaruto</name>
+        <instance>default</instance>
+    </interface>
+</hal><hal format="hidl"><name>android.hardware.light</name><transport>hwbinder</transport>
weiqifa@bsp-ubuntu1804:~/mt8167s-9.0-sdk$

编译

编译之前最好系统全编译一次,确保环境变量都生效

source build/envsetup.sh
lunch

使用hidl-gen生成一些文件

# PACKAGE=android.hardware.naruto@1.0
# LOC=hardware/interfaces/naruto/1.0/default/
# make hidl-gen -j64
# hidl-gen -o $LOC -Lc++-impl -randroid.hardware:hardware/interfaces -randroid.hidl:system/libhidl/transport $PACKAGE
# hidl-gen -o $LOC -Landroidbp-impl -randroid.hardware:hardware/interfaces -randroid.hidl:system/libhidl/transport $PACKAGE

使用update-makefiles.sh 生成Android.mk 和Android.bp

# ./hardware/interfaces/update-makefiles.sh

单独编译service

mmm hardware/interfaces/naruto/1.0/default/

编译测试client程序

mmm hardware/interfaces/naruto/1.0/test/

Service端执行

Knowin inSight5:/ # vendor/bin/hw/android.hardware.naruto@1.0-service
=== weiqifa ===start service

注意执行service 后是不会马上退出的,如果是马上退出的,可能你是用push方式的,是不对的。

Client 输出

PS C:\Users\weiqifa> adb shell
Knowin inSight5:/ # naruto_test
Hello World, JayZhang
Knowin inSight5:/ #

参考

这里面的链接有些地方没有说明清楚,我重新整理了下,代码主要来自这里,标明出处。

https://www.jianshu.com/p/ca6823b897b5 https://blog.csdn.net/shift_wwx/article/details/86530600

HIDL实例是一个同学在知识星球提问,我开始研究的,后来我把例子写出来后,这位同学也写出了自己的例子,而且形成了pdf文档,如果想了解 的话,在知识星球回复「HIDL」获取下载链接。

推荐阅读:

专辑|Linux文章汇总

专辑|程序人生

嵌入式Linux

微信扫描二维码,关注我的公众号

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/467579.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

子矩阵(NOIP2014 普及组第四题)

描述 给出如下定义&#xff1a; 子矩阵&#xff1a;从一个矩阵当中选取某些行和某些列交叉位置所组成的新矩阵&#xff08;保持行与 列的相对顺序&#xff09;被称为原矩阵的一个子矩阵。 例如&#xff0c;下面左图中选取第 2、4 行和第 2、4、5 列交叉位置的元素得到一个 2*3 …

linux spinlock/rwlock/seqlock原理剖析(基于ARM64)

背景Kernel版本&#xff1a;4.14ARM64处理器&#xff0c;Contex-A53&#xff0c;双核使用工具&#xff1a;Source Insight 3.5&#xff0c; Visio1. 概述吹起并发机制研究的进攻号角了&#xff01;作为第一篇文章&#xff0c;应该提纲挈领的介绍下并发。什么是并发&#xff0c;…

爸爸都老了

今天是父亲节&#xff0c;早上韦泽楠去上绘画课&#xff0c;我睡了个回笼觉&#xff0c;一觉睡到了十一点。起来的时候老婆买了新鲜的荔枝和龙眼&#xff0c;当然我没有马上吃&#xff0c;我不是一个随便的男人&#xff0c;我刷了牙&#xff0c;洗了脸&#xff0c;再回到客厅慢…

java输出日志_java代码中如何正确使用loggger日志输出

java代码中如何正确使用loggger日志输出发布时间&#xff1a;2019-06-28作者&#xff1a;spider阅读(2980)当你遇到问题的时候&#xff0c;只能通过debug功能来确定问题&#xff0c;你应该考虑打日志&#xff0c;良好的系统&#xff0c;是可以通过日志进行问题定为的。使用slf4…

大学的多级放大电路,你交给老师了吗?

第一章 设计任务1.1项目名称&#xff1a;设计三极管多级音频放大电路本项目的主要内容是设计并实现三极管多级音频放大功能。该电路将所学习的三极管基本放大电路与功率放大电路有机结合。1.2项目设计说明&#xff08;1&#xff09;设计任务和要求使用常见的小功率三极管设计一…

第十四节TypeScript 联合类型

1、简介 联合类型可以通过管道&#xff08;|&#xff09;将变量设置多种类型&#xff0c;赋值时可以根据设置的类型来赋值。 注意&#xff1a;只能赋值指定的类型&#xff0c;如果赋值其它类型就会报错的。 2、创建联合类型的语法格式&#xff1a; Type1|Type2|Type3 实例&a…

Linux进程调度器-基础

背景Read the fucking source code! --By 鲁迅A picture is worth a thousand words. --By 高尔基说明&#xff1a;Kernel版本&#xff1a;4.14ARM64处理器&#xff0c;Contex-A53&#xff0c;双核使用工具&#xff1a;Source Insight 3.5&#xff0c; Visio1. 概述从这篇文章…

每天学习点--------第五天(2017-10-9) 摘要: 常用的集合

今天学习 java.util下面的软件包 包含 collection框架、遗留的coolection类、事件模型、日期和时间设施、国际化和各种工具类&#xff08;字符串标记生成器、随机数生成器和位数组&#xff09; 一、Collenction<.E> 接口 转载于:https://www.cnblogs.com/hanxue112253/p/…

Linux内存,先看这篇文章

内存大小计算我们拿32位系统来举个栗子2^32 ‭4,294,967,296‬ bytes‭4,294,967,296‬ bytes / 1024 ‭4,194,304‬ kbytes4,194,304‬ kbytes / 1024 ‭4,096‬ M‭4,096‬ M /1024 4G物理内存如何分页&#xff1f;分段和分页计算机内存管理的两种方式&#xff0c;这里我…

cloudstack java api_CloudStack API编程指引

前言本文阐述为CloudStack编写新API或者更新已存在API时应遵循的约定和编程指引。参考文档(暂略)介绍当你需要为CS添加新的API时&#xff0c;需要创建一个Request类和Response类(或者在扩展CS API功能时它的API Responese已经定义的情况下重用已经存在的API Response类)。编写C…

在ODM公司要不要跳槽到创业公司

读者朋友提问&#xff1a; 发哥&#xff0c;我现在在手机odm公司做指纹模块做了两三个月&#xff0c;基本天天加班到十点以后&#xff0c;后面要被调到camera团队&#xff0c;但是从这几个月的经历来看&#xff0c;感觉学到的不多&#xff0c;代码都是供应商写的&#xff0c;很…

安卓系统应用启动流程分析

随着移动开发的兴起&#xff0c;安卓系统的重要性愈加突显。本文简要介绍安卓系统上应用启动流程&#xff0c;对于应用开发、系统定制以及性能优化人员来说&#xff0c;熟悉应用启动流程会使得在今后的工作中更加得心应手&#xff0c;做到知其然&#xff0c;知其所以然。本文主…

物联网通信协议全解析

随着物联网设备数量的持续增加&#xff0c;这些设备之间的通信或连接已成为一个重要的思考课题。通信对物联网来说十分常用且关键&#xff0c;无论是近距离无线传输技术还是移动通信技术&#xff0c;都影响着物联网的发展。而在通信中&#xff0c;通信协议尤其重要&#xff0c;…

【长沙集训】2017.10.10

Adore 1.1 问题描述 小 w 偶然间遇到了一个 DAG。 这个 DAG 有 m 层&#xff0c;第一层只有1个源点&#xff0c;最后一层只有1个汇点&#xff0c;剩下的每一层都有 k 个 节点。 现在小 w 每次可以取反第 i(1 < i < n − 1) 层和第 i 1 层之间的连边。也就是把原本从 (i,…

Linux中断子系统之Workqueue

背景说明Kernel版本&#xff1a;4.14ARM64处理器&#xff0c;Contex-A53&#xff0c;双核使用工具&#xff1a;Source Insight 3.5&#xff0c; Visio1. 概述Workqueue工作队列是利用内核线程来异步执行工作任务的通用机制&#xff1b;Workqueue工作队列可以用作中断处理的Bott…

给你准备的Linux启动流程

读者朋友提问&#xff1a; 昨天在后台看到一个读者朋友跟我说&#xff0c;发哥&#xff0c;你能不能讲一下嵌入式Linux的开机流程&#xff0c;然后我看了下&#xff0c;我是没有写过这方面的文章&#xff0c;所以&#xff0c;就有了这篇文章。回答&#xff1a;我们都知道pc指针…

Linus Torvalds:我们都老了,但Linux维护者真的很难找

Linux 之父Linus Torvalds非常担忧没人继续维护内核「真的很难找到维护者&#xff01;」在本周召开的Linux开源峰会与嵌入式大会上&#xff0c; VMware的首席开放源代码官Dirk Hohndel和Linux的创建者Linus Torvalds再次就Linux开发展开了远程对话讨论。左&#xff1a;Dirk Ho…

看printk引发的一点思考

在源码位置kernel/printk/函数原型asmlinkage __visible int printk(const char *fmt, ...) {printk_func_t vprintk_func;va_list args;int r;va_start(args, fmt);/** If a caller overrides the per_cpu printk_func, then it needs* to disable preemption when calling pr…

我毕业时候写的简历

写简历这个事情&#xff0c;一直是一个非常让人头疼的&#xff0c;在我看来&#xff0c;写简历并不是一件简单的事情&#xff0c;所以&#xff0c;现在是晚上一点钟&#xff0c;我倒腾了一个晚上&#xff0c;才有了这篇文章。我认为写简历有几个需要注意的地方&#xff0c;不啰…

idea java 非法字符_解决IDEA显示非法字符 \ufeff 的问题

一、问题在txt文本中复制代码进入IDEA报错Error:(1, 1) java: 非法字符: ‘\ufeffError:(1, 10) java: 需要class, interface或enum二、解决办法用IDEA转换&#xff0c;先转换为GBK&#xff0c;再转回UTF-8()补充知识&#xff1a;Eurake问题Failed to bind properties under eu…