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,一经查实,立即删除!

相关文章

phpstudy mysql创建表_MySQL_Mysql入门基础 数据库创建篇,1.创建数据表---基础(高手跳 - phpStudy...

Mysql入门基础 数据库创建篇1.创建数据表---基础(高手跳过)正统方法&#xff1a;create [TEMPORARY] table 表名 [if not exists](创建的列项定义)[表的选项][分区的选项];#正统的创建方式&#xff0c;具体的参数&#xff0c;请参考mysql手册&#xff0c;在这里不做详细的解释&…

区域赛第33天

1、最近感觉自己的时间可以利用好的&#xff0c;但是就是自己的学习效率比较低&#xff0c;主要问题就是一旦放松下来就会放松很长的时间&#xff0c;所以说浪费了很多的时间。。。 2、现在最重要的就是从心底相信自己真的能拿金牌&#xff0c;所以就是现在主要的任务就是恢复信…

用bat-抓取android日志

echo off cls set filename%date:~0,4%%date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%%time:~6,2% set postfixdebug.log set debugfilename%filename%-%postfix% adb shell logcat -G 4M adb shell logcat > %debugfilename%pause

mysql报错error2002_mysql中异常错误ERROR:2002的解决方法分享

最近在启动mysql的时候发现mysql报错了&#xff0c;错误代码是2002&#xff0c;通过查找相关的资料发现是var/lib/mysql 的访问权限问题&#xff0c;所以这篇文章主要介绍了mysql中异常错误ERROR&#xff1a;2002的解决方法&#xff0c;需要的朋友可以参考借鉴&#xff0c;下面…

子矩阵(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;…

isfull mysql_MySQL数据库之MySQL 出现 The table is full 的解决方法

本文主要向大家介绍了MySQL数据库之MySQL 出现 The table is full 的解决方法 &#xff0c;通过具体的内容向大家展现&#xff0c;希望对大家学习MySQL数据库有所帮助。当我们要写入新数据而发生“The table is full”告警错误时&#xff0c;先不要着急&#xff0c;按照下面的思…

RabbitMQ 资料整理

前言&#xff1a; 官方教程&#xff1a;    https://www.rabbitmq.com/getstarted.html 应用场景&#xff08;之马云赚钱&#xff09;&#xff1a;    http://blog.csdn.net/whoamiyang/article/details/54954780    http://www.cnblogs.com/saltlight-wangchao/p/…

爸爸都老了

今天是父亲节&#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…

C#数组的声明方式

C#数组的五种声明方式一、声明一个未经初始化的数组引用&#xff0c;以后可以把这引用初使化为一个数组实例int[] intArray;intArray new int[10];注&#xff1a;数组的引用必须以相同或相关类型实例化&#xff0c;数组初使化默认值&#xff0c;值类型为0&#xff0c;引用类型…

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

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

【u204】高级砝码称重

Time Limit: 1 second Memory Limit: 128 MB 【问题描述】 现有n个砝码&#xff0c;重量分别为a1&#xff0c;a2&#xff0c;a3&#xff0c;……&#xff0c;an&#xff0c;在去掉m个砝码后&#xff0c;问最多能称量出多少不同的重量&#xff08;不包括0&#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. 概述从这篇文章…

java spring注解_spring注解是如何实现的?

注解呢&#xff0c;是java本身自带的一个东西&#xff0c;它基于java的接口进行实现&#xff0c;是一种特殊的接口类型&#xff0c;通常对于注解来说&#xff0c;三种情况&#xff0c;一个是在编译前就会被丢弃的&#xff0c;一个是编译后留在class中的&#xff0c;另一种是会一…

每天学习点--------第五天(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…

深入解析hostname

结论&#xff1a;/etc/sysconfig/network 确实是hostname的配置文件&#xff0c;hostname的值跟该配置文件中的HOSTNAME有一定的关联关系&#xff0c;但是没有必然关系&#xff0c;hostname的值来自内核参数/proc/sys/kernel/hostname&#xff0c;如果我通过命令sysctl kernel.…