Android framework HAL(HIDL)
简述
当你在Android系统中使用不同的硬件设备(例如摄像头、传感器、音频设备等)时,你需要与硬件抽象层(HAL)进行通信。 HAL是一个中间层,它充当了硬件和应用程序之间的桥梁。但是,由于硬件设备的不同,HAL接口在不同的硬件之间也会有所不同。这就是Android HAL接口定义语言(HIDL)的用武之地。
HIDL允许开发人员为每个硬件设备定义自己的接口。这些接口定义了硬件设备的功能和特性,包括输入参数、返回值和异常。使用这些接口,应用程序可以直接与硬件设备通信,而无需了解特定的硬件细节。在Android中,HIDL被广泛用于与HAL进行通信。
在Android Project Treble被提出,在android O中被全面的推送,设计 HIDL 这个机制的目的,主要目的是把框架(framework)与 HAL 进行隔离,使得框架部分可以直接被覆盖、更新,而不需要重新对 HAL 进行编译。
HIDL 实际上是用于进行进程间通信(Inter-process Communication,IPC)的。进程间的通信可以称为 Binder 化(Binderized)。对于必须连接到进程的库,也可以使用 passthough 模式(但在Java中不支持)。
官方介绍
编写代码
在Aosp代码目录中创建目录 hardware/interfaces/stksensor/1.0(有关1.0版本相关的,可以查看官网的版本管理概念),
1、新建文件IStksensor.hal
package android,hardware.stksensor@1.0;improt IStksensorCallBack;interface IStksensor {setCallBack(IStksensorCallBack callback);write(string data) generates (bool res);init() generates (MyResult result);
};
2、创建UDT(用户自定义类型),types.hal
package android.hardware.stksensor@1.0;enum ResultCode : int32_t {UNKNOWN = -1,ERROR = 0,OK = 1,};struct MyResult{ResultCode resultCode;string msg;
};
3、新建文件回调文件IStksensorCallBack.hal
package android.hardware.stksensor@1.0;interface IStksensorCallBack {passData(uint32_t data) generates (MyResult result);
};
使用hidl-gen生成相关文件
在终端执行以下命令,设置临时变量
PACKAGE=android.hardware.stksensor@1.0
LOC=hardware/interfaces/stksensor/1.0/default
在AOSP源码根目录执行hidl-gen生成default目录里的c++文件
hidl-gen -o $LOC -Lc++-impl -randroid.hardware:hardware/interfaces -randroid.hidl:system/libhidl/transport $PACKAGE
在AOSP源码根目录执行hidl-gen生成default目录里的Android.bp文件
hidl-gen -o $LOC -Landroidbp-impl -randroid.hardware:hardware/interfaces -randroid.hidl:system/libhidl/transport $PACKAGE
在AOSP源码根目录执行./hardware/interfaces/update-makefiles.sh会生成hardware/interfaces/stksensor/1.0/目录里的Android.bp文件
实现接口代码
修改hardware/interfaces/stksensor/1.0/default/Stksensor.cpp,这边实现单纯是打印日志
// FIXME: your file license if you have one#include "Stksensor.h"
#include <log/log.h>namespace android::hardware::stksensor::implementation {// Methods from ::android::hardware::stksensor::V1_0::IStksensor follow.
Return<void> Stksensor::setCallBack(const sp<::android::hardware::stksensor::V1_0::IStksensorCallBack>& callback) {// TODO implementALOGE("stksensor service have called the funtion of setCallBack");return Void();
}Return<::android::hardware::stksensor::V1_0::ResultCode> Stksensor::write(const hidl_string& data) {// TODO implementALOGE("stksensor service have called the funtion of write");return ::android::hardware::stksensor::V1_0::ResultCode {};
}Return<void> Stksensor::init(init_cb _hidl_cb) {// TODO implementALOGE("stksensor service have called the funtion of init");return Void();
}// Methods from ::android::hidl::base::V1_0::IBase follow.//IStksensor* HIDL_FETCH_IStksensor(const char* /* name */) {//return new Stksensor();
//}
//
} // namespace android::hardware::stksensor::implementation
添加启动服务
1、在hardware/interfaces/stksensor/1.0/default/创建service.cpp
#define LOG_TAG "android.hardware.stksensor@1.0-service"
#include <hidl/HidlTransportSupport.h>
#include <log/log.h>using android::hardware::configureRpcThreadpool;
using android::hardware::joinRpcThreadpool;
using android::hardwara::stksensor::V1_0::IStksensor;
using android::hardware::stksensor::V1_0::implementation::Stksensor;
using namespace android;int main() {configureRpcThreadpool(1, true);sp<IStksensor> service = new Stksensor();status_t status = service->registerAsService("stksensor"); if (status != OK) {ALOGE("Error registering stksensor as service: %d", status);return status;}ALOGE("Ok to registering stksensor as service");joinRpcThreadpool();return 1;
}
2、在hardware/interfaces/stksensor/1.0/default/创建android.hardware.stksensor@1.0-service.rc启动脚本
service stksensor-hal-1-0 /vendor/bin/hw/android.hardware.stksensor@1.0-serviceclass haluser systemgroup system
3、在hardware/interfaces/stksensor/1.0/default/创建android.hardware.stksensor@1.0-service.xml的vintf
<manifest version="1.0" type="device"><hal format="hidl"><name>android.hardware.stksensor</name><transport>hwbinder</transport><version>1.0</version><interface><name>IStksensor</name><instance>stksensor</instance></interface></hal>
</manifest>
修改编译脚本
1、再修改hardware/interfaces/stksensor/1.0/default/Android.bp
// FIXME: your file license if you have onecc_library_shared {// FIXME: this should only be -impl for a passthrough hal.// In most cases, to convert this to a binderized implementation, you should:// - change '-impl' to '-service' here and make it a cc_binary instead of a// cc_library_shared.// - add a *.rc file for this module.// - delete HIDL_FETCH_I* functions.// - call configureRpcThreadpool and registerAsService on the instance.// You may also want to append '-impl/-service' with a specific identifier like// '-vendor' or '-<hardware identifier>' etc to distinguish it.name: "android.hardware.stksensor@1.0-impl",relative_install_path: "hw",// FIXME: this should be 'vendor: true' for modules that will eventually be// on AOSP.proprietary: true,srcs: ["Stksensor.cpp","StksensorCallBack.cpp",],shared_libs: ["libhidlbase","libutils","android.hardware.stksensor@1.0",],
}cc_binary {name: "android.hardware.stksensor@1.0-service",relative_install_path: "hw",defaults: ["hidl_defaults"],proprietary: true,init_rc: ["android.hardware.stksensor@1.0-service.rc"],vintf_fragments: ["android.hardware.stksensor@1.0-service.xml"],srcs: ["SerialPort.cpp","service.cpp",],shared_libs: ["libbase","liblog","libdl","libutils","libhardware","libhidlbase","libhidltransport","android.hardware.stksensor@1.0",],
}
2、在device/$your_company/$SOC/device.mk添加
PRODUCT_PACKAGES += \android.hardware.stksensor@1.0-service \android.hardware.stksensor@1.0-impl
现在stksensor目录结构
stksensor/
└── 1.0├── Android.bp├── default│ ├── Android.bp│ ├── android.hardware.stksensor@1.0-service.rc│ ├── android.hardware.stksensor@1.0-service.xml│ ├── service.cpp│ ├── StksensorCallBack.cpp│ ├── StksensorCallBack.h│ ├── Stksensor.cpp│ └── Stksensor.h├── IStksensorCallBack.hal├── IStksensor.hal└── types.hal
注意:会报一些avc权限 ,需要自己添加
相关文章:
Android framework HAL(HIDL)
简述 当你在Android系统中使用不同的硬件设备(例如摄像头、传感器、音频设备等)时,你需要与硬件抽象层(HAL)进行通信。 HAL是一个中间层,它充当了硬件和应用程序之间的桥梁。但是,由于硬件设备…...
QML 模型(ListModel)
LIstModel(列表模型) ListModel 是ListElement定义的简单容器,每个定义都包含数据角色。内容可以在 QML 中动态定义或显式定义。 属性: count模型中数据条目的数量dynamic动态角色,默认情况下,角色的类型…...
你还在调戏AI,有的公司已经用ChatGPT开展业务了
近日,OpenAI 正式宣布开放 ChatGPT 和 Whisper 两个模型的 API,API 版本的ChatGPT 不仅功能更多、性能更强,而且还更便宜一一相当于目前 GPT-3 模型价格打一折!划重点OpenAl正式开放 ChatGPT 和 Whisper 模型的 API,目前 SnapChat…...
DatenLord前沿技术分享 No.20
达坦科技专注于打造新一代开源跨云存储平台DatenLord,致力于解决多云架构、多数据中心场景下异构存储、数据统一管理需求等问题,以满足不同行业客户对海量数据跨云、跨数据中心高性能访问的需求。喷泉码具有极高的纠错能力,且具有低延迟、地复…...
基于vivado(语言Verilog)的FPGA学习(1)——了解viviado面板和编译过程
基于vivado(语言Verilog)的FPGA学习(1)——了解程序面板和编译过程 每日废话:最近找实习略微一些焦虑,不想找软件开发,虽然有些C和python基础(之前上课学的),…...
PACS(CT、CR、DR、MR、DSA、RF医院影像管理系统源码)
PACS具体功能介绍: 病人、采集、观片、三维、报告、照相、退出、文件、图像采集、观片操作、三维、测量标注、诊断报告、照相打印、统计报表、系统管理、帮助、病人浏览器、选择数据源、打开图像、病人登记、工作列表、采集、打开画廊。 DICOM查询/获取:…...
Centos7 安装Mysql8.0
1、到指定目录下下载安装包[rootVM-0-14-centos ~]# cd /usr/local/src2、下载mysql8[rootVM-0-14-centos src]# wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.20-linux-glibc2.12-x86_64.tar.xz3、解压mysql8, 通过xz命令解压出tar包, 然后通过t…...
2023年全国最新道路运输从业人员精选真题及答案18
百分百题库提供道路运输安全员考试试题、道路运输从业人员考试预测题、道路安全员考试真题、道路运输从业人员证考试题库等,提供在线做题刷题,在线模拟考试,助你考试轻松过关。 181.某客运企业拥有55辆营运客车,下列关于该企业设置…...
web worker的基本使用案例
文件目录如下 代码按照顺序分别如下 webworker.html <!DOCTYPE html> <html lang"en"><head><meta charset"utf-8" /><meta http-equiv"X-UA-Compatible" content"IEedge" /><meta name"viewpo…...
机器看世界
博主简介 博主是一名大二学生,主攻人工智能研究。感谢让我们在CSDN相遇,博主致力于在这里分享关于人工智能,c,Python,爬虫等方面知识的分享。 如果有需要的小伙伴可以关注博主,博主会继续更新的,…...
18、指数移动平均——EMA
简介 在深度学习中,经常会使用EMA(指数移动平均)这个方法对模型的参数做平均,以求提高测试指标并增加模型鲁棒。 指数移动平均(Exponential Moving Average)也叫权重移动平均(Weighted Moving…...
用Go快速搭建IM即时通讯系统
WebSocket的目标是在一个单独的持久连接上提供全双工、双向通信。在Javascript创建了Web Socket之后,会有一个HTTP请求发送到浏览器以发起连接。在取得服务器响应后,建立的连接会将HTTP升级从HTTP协议交换为WebSocket协议。由于WebSocket使用自定义的协议…...
2023年江苏省职业院校技能大赛中职网络安全赛项试卷-学生组-任务书
2023年江苏省职业院校技能大赛中职网络安全赛项试卷-学生组-任务书 2023年江苏省职业院校技能大赛中职网络安全赛项试卷-学生组-任务书第一阶段 (300分) [手敲的任务书 点个赞吧]任务一:主机发现与信息收集 (50分)任务二: 应急响应 (60分)任务三:数字取证与分析(80分)任务四:…...
如何使用码匠连接 MariaDB
MariaDB 是一个免费的、开源的关系型数据库管理系统,由 MariaDB 的创始人 Michael Widenius 于 2010 年创建。它基于 MariaDB,但在对数据存储的处理中加入了一些自己的特性。MariaDB 相对于 MariaDB 而言,具有更好的性能和更好的兼容性&#…...
JavaEE简单示例——Bean的实例化
简单介绍: 在我们之前使用某个对象,那么就要创建这个类的对象,创建对象的过程就叫做实例化。对于Spring来说,实例化Bean的方式有三种,分别是构造方法实例化,静态方法实例化,实例工厂实例化。我…...
1229. 日期问题
目录 题目链接 一些话 流程 套路 ac代码 题目链接 1229. 日期问题 - AcWing题库 一些话 切入点 // 小明知道这些日期都在1960年1月1日至2059年12月31日。 // 这些日期采用的格式非常不统一,有采用年/月/日的,有采用月/日/年的,还有采用…...
Java 中的浅拷贝和深拷贝
无论是浅拷贝还是深拷贝,都可以通过 Object 类的 clone() 方法来完成: /*** 拷贝** author qiaohaojie* date 2023/3/5 15:58*/ public class CloneTest {public static void main(String[] args) throws Exception {Person person1 new Person(23, &…...
【java】 java开发中 常遇到的各种难点 思路方案
文章目录逻辑删除如何建立唯一索引唯一索引失效问题加密字段模糊查询问题maven依赖冲突问题(jar包版本冲突问题)sql in条件查询时 将结果按照传入顺序排序作为一个开发人员 总会遇到各种难题 本文列举博主 遇见/想到 的例子 ,也希望同学们可以…...
ViewBinding 和 DataBinding的使用
1.ViewBinding:视图绑定 通过视图绑定功能,您可以更轻松地编写可与视图交互的代码。在模块中启用视图绑定之后,系统会为该模块中的每个 XML 布局文件生成一个绑定类。绑定类的实例包含对在相应布局中具有 ID 的所有视图的直接引用。在大多数情况下&…...
HTML+CSS入门
CSS概述 CSS指层叠样式表 (Cascading Style Sheets),用来定义HTML网页中的内容用什么样式来显示。 HTML: 指定网页显示的内容 CSS: 指定内容显示的样式CSS入门案例 <html><head><meta charset"UTF-8"><title>入门案例</tit…...
现代React Native开发:从Expo生态到Redux状态管理的工程实践
1. 项目概述:一个为现代React Native开发量身定制的生产力引擎 如果你和我一样,在过去几年里用React Native做过几个项目,那你一定对项目初始化时那种重复、繁琐的“体力活”深有体会。每次新建一个项目,都要重新安装一堆依赖库&…...
告别手动配网!用IEEE 1905.1协议实现Wi-Fi AP自动配置的保姆级流程拆解
告别手动配网!用IEEE 1905.1协议实现Wi-Fi AP自动配置的保姆级流程拆解 想象一下,当你需要为三层别墅部署全屋Wi-Fi覆盖,或是为小型办公室搭建多AP无线网络时,传统方式需要逐个登录每个AP的后台,重复输入SSID、密码、…...
如何快速配置Windows端口转发:终极图形化管理工具指南
如何快速配置Windows端口转发:终极图形化管理工具指南 【免费下载链接】PortProxyGUI A manager of netsh interface portproxy which is to evaluate TCP/IP port redirect on windows. 项目地址: https://gitcode.com/gh_mirrors/po/PortProxyGUI PortProx…...
AI浏览器扩展实战:从原理到应用,提升网页AI体验
1. 项目概述与核心价值如果你和我一样,每天花大量时间在浏览器里和各类AI工具打交道,那你肯定也遇到过这些烦心事:在亚马逊上挑个商品,想问问AI哪个型号更划算,得手动复制粘贴商品信息到另一个聊天窗口;用C…...
PEX8796实战解析:从芯片特性到PCIe扩展设计的关键考量
1. PEX8796芯片基础认知与核心特性 第一次拿到PEX8796这颗PCIe交换芯片时,我盯着密密麻麻的引脚图发了半小时呆。作为PLX(现已被博通收购)的经典产品,这颗芯片在工业控制、服务器扩展等领域已经默默服役了十余年。实测中发现&…...
R语言实战:用DescTools、ggiraphExtra、factoextra等包搞定多变量数据可视化(附完整代码)
R语言实战:多变量数据可视化的高效工具箱指南 在数据分析的日常工作中,我们常常需要处理包含数十甚至上百个变量的复杂数据集。传统的单变量或双变量可视化方法在这种场景下显得力不从心,而R语言生态系统中丰富的可视化包为我们提供了强大的工…...
3步解决下载难题:imFile下载管理器实战指南
3步解决下载难题:imFile下载管理器实战指南 【免费下载链接】imfile-desktop A full-featured download manager. 项目地址: https://gitcode.com/gh_mirrors/im/imfile-desktop 你是否经常遇到这些下载烦恼?浏览器下载速度慢如蜗牛,大…...
从NLP基础到LLM实战:手把手构建大模型全栈能力
1. 从NLP到LLM:为什么你需要一个坚实的“地基” 最近几年,大语言模型(LLM)的火爆程度有目共睹,ChatGPT、Claude、文心一言这些名字几乎成了日常谈资。很多开发者,尤其是刚入行的朋友,可能一上来…...
ExifToolGUI:如何轻松批量管理照片元数据的完整指南
ExifToolGUI:如何轻松批量管理照片元数据的完整指南 【免费下载链接】ExifToolGui A GUI for ExifTool 项目地址: https://gitcode.com/gh_mirrors/ex/ExifToolGui 你是否曾经面对成百上千张照片,想要批量修改拍摄时间、添加版权信息或调整GPS坐标…...
避开这些坑:在MATLAB中用DQN做LKA时,我的并行训练为什么失败了?
避开这些坑:在MATLAB中用DQN做LKA时,我的并行训练为什么失败了? 当你第一次在MATLAB中启用UseParalleltrue选项时,可能满怀期待地以为训练速度会直线上升。但现实往往很骨感——要么直接报错终止,要么训练效率反而比串…...
