HAL 接口定义语言(简称 HIDL,发音为“hide-l”)是用于指定 HAL 和其用户之间的接口的一种接口描述语言 (IDL)。HIDL 允许指定类型和方法调用(会汇集到接口和软件包中)。从更广泛的意义上来说,HIDL 是用于在可以独立编译的代码库之间进行通信的系统。 HIDL 旨在用于进程间通信 (IPC)。进程之间的通信采用 Binder 机制。对于必须与进程相关联的代码库,还可以使用直通模式(在 Java 中不受支持)。 HIDL 可指定数据结构和方法签名,这些内容会整理归类到接口(与类相似)中,而接口会汇集到软件包中。尽管 HIDL 具有一系列不同的关键字,但 C++ 和 Java 程序员对 HIDL 的语法并不陌生。此外,HIDL 还使用 Java 样式的注释。 HIDL 的目标是,可以在无需重新构建 HAL 的情况下替换框架。HAL 将由供应商或 SOC 制造商构建,并放置在设备的 /vendor 分区中,这样一来,就可以在框架自己的分区中通过 OTA 替换框架,而无需重新编译 HAL。 HIDL 设计在以下方面之间保持了平衡: 根据设计,HIDL 语言与 C 语言类似(但前者不使用 C 预处理器)。下面未描述的所有标点符号(用途明显的 = 和 | 除外)都是语法的一部分。 注意:如需详细了解 HIDL 代码样式,请参阅代码样式指南。 例如 以上摘自Google 官网 创建自己的service目录 创建service版本1.0目录可以根据需要创建1.1/1.2或者2.0版本 创建默认service实现目录 指定package-root 参照如下,可以根据自己的需要适当的增删 在接口hal文件中创建自己的接口 在callback的hal文件创建回调函数 在类型定义的hal中添加自己的定义 在vendor/lee/interfaces/leeservice/目录执行 然后你就发现在impl目录生成了cpp文件及bp文件,这是自动生成发的空实现 注释掉vendor/lee/interfaces/leeservice/1.0/default/impl/Android.bp中 然后你就可以在LeeManager.cpp及其他文件中添加自己的实现了 在vendor/lee/interfaces/leeservice/1.0/default添加service.cpp 在vendor/lee/interfaces/leeservice/1.0/default创建vendor.lee.lee@1.0-service.rc并添加如下代码 自此hidlservice就创建完成了 修改自己board目录的manifest.xml 并在vendor_framework_compatibility_matrix.xml添加如下代码 至此hidl service部分已经全部完成
HIDL
HIDL 设计
–效率。 HIDL 会尝试尽可能减少复制操作的次数。HIDL 定义的数据以 C++ 标准布局数据结构传递至 C++ 代码,无需解压,可直接使用。此外,HIDL 还提供共享内存接口;由于 RPC 本身有点慢,因此 HIDL 支持两种无需使用 RPC 调用的数据传输方法:共享内存和快速消息队列 (FMQ)。
–直观。 通过仅针对 RPC 使用 in 参数,HIDL 避开了内存所有权这一棘手问题(请参阅 Android 接口定义语言 (AIDL));无法通过相应方法高效返回的值将通过回调函数返回。无论是将数据传递到 HIDL 中以进行传输,还是从 HIDL 接收数据,都不会改变数据的所有权,也就是说,数据所有权始终属于调用函数。数据仅需要在函数被调用期间保留,可在被调用的函数返回数据后立即清除。HIDL 语法
ROOT = PACKAGE IMPORTS PREAMBLE { ITEM ITEM ... } // not for types.hal | PACKAGE IMPORTS ITEM ITEM... // only for types.hal; no method definitions ITEM = ANNOTATIONS? oneway? identifier(FIELD, FIELD ...) GENERATES?; | safe_union identifier { UFIELD; UFIELD; ...}; | struct identifier { SFIELD; SFIELD; ...}; // Note - no forward declarations | union identifier { UFIELD; UFIELD; ...}; | enum identifier: TYPE { ENUM_ENTRY, ENUM_ENTRY ... }; // TYPE = enum or scalar | typedef TYPE identifier; VERSION = integer.integer; PACKAGE = package android.hardware.identifier[.identifier[...]]@VERSION; PREAMBLE = interface identifier EXTENDS EXTENDS = <empty> | extends import_name // must be interface, not package GENERATES = generates (FIELD, FIELD ...) // allows the Binder interface to be used as a type // (similar to typedef'ing the final identifier) IMPORTS = [empty] | IMPORTS import import_name; TYPE = uint8_t | int8_t | uint16_t | int16_t | uint32_t | int32_t | uint64_t | int64_t | float | double | bool | string | identifier // must be defined as a typedef, struct, union, enum or import // including those defined later in the file | memory | pointer | vec<TYPE> | bitfield<TYPE> // TYPE is user-defined enum | fmq_sync<TYPE> | fmq_unsync<TYPE> | TYPE[SIZE] FIELD = TYPE identifier UFIELD = TYPE identifier | safe_union identifier { FIELD; FIELD; ...} identifier; | struct identifier { FIELD; FIELD; ...} identifier; | union identifier { FIELD; FIELD; ...} identifier; SFIELD = TYPE identifier | safe_union identifier { FIELD; FIELD; ...}; | struct identifier { FIELD; FIELD; ...}; | union identifier { FIELD; FIELD; ...}; | safe_union identifier { FIELD; FIELD; ...} identifier; | struct identifier { FIELD; FIELD; ...} identifier; | union identifier { FIELD; FIELD; ...} identifier; SIZE = // Must be greater than zero constexpr ANNOTATIONS = [empty] | ANNOTATIONS ANNOTATION ANNOTATION = | @identifier | @identifier(VALUE) | @identifier(ANNO_ENTRY, ANNO_ENTRY ...) ANNO_ENTRY = identifier=VALUE VALUE = "any text including " and other escapes" | constexpr | {VALUE, VALUE ...} // only in annotations ENUM_ENTRY = identifier | identifier = constexpr
写自己的Hidl service
创建自己的代码工作目录
例如 vendor/lee/interfaces/leeservicemkdir -p vendor/lee/interfaces/leeservice
mkdir -p vendor/lee/interfaces/leeservice/1.0
mkdir -p vendor/lee/interfaces/leeservice/1.0/default/impl
在vendor/lee/interfaces/leeservice创建Android.bp 然后写入subdirs = [ "1.0", "1.0/default", ] hidl_package_root { name: "vendor.lee.lee", path: "vendor/lee/interfaces/leeservice", }
创建自己的Hal文件
在logservice目录创建自己的hal文件
vendor/lee/interfaces/leeservice/1.0/ILeeManager.hal
vendor/lee/interfaces/leeservice/1.0/ILeeCallback.hal
vendor/lee/interfaces/leeservice/1.0/typers.hal
例如package vendor.lee.lee@1.0; import ILeeCallback; interface ILeeManager { setLevel(int32_t level); getLevel() generates(int32_t level); requestString(string s); registerCallback(ILeeCallback callback); unregisterCallback(ILeeCallback callback); };
例如package vendor.lee.lee@1.0; interface ILeeCallback { OnLeeEvent(LeeEvent event, LeeExtra extra); };
例如package vendor.lee.lee@1.0; enum LeeEvent : uint32_t { LEE_ADD = 0, LEE_DEL = 1, }; struct LeeExtra { uint32_t extraSize; string extraPath; };
生成CPP文件和bp文件
LOC=1.0/default/impl PKG=vendor.lee.lee@1.0 hidl-gen -Landroidbp -rvendor.lee.lee:vendor/lee/interfaces/leeservice $PKG hidl-gen -o $LOC -Lc++-impl -rvendor.lee.lee:vendor/lee/interfaces/leeservice $PKG hidl-gen -o $LOC -Landroidbp-impl -rvendor.lee.lee:vendor/lee/interfaces/leeservice $PKG
现在文件树形结构如下vendor/lee/interfaces/leeservice/ |-- 1.0 | |-- Android.bp | |-- ILeeCallback.hal | |-- ILeeManager.hal | |-- default | | `-- impl | | |-- Android.bp | | |-- LeeCallback.cpp | | |-- LeeCallback.h | | |-- LeeManager.cpp | | `-- LeeManager.h | `-- types.hal `-- Android.bp 3 directories, 10 files
// relative_install_path: “hw”,
并添加如下两句 local_include_dirs: [ ".", ], export_include_dirs: [ ".", ],
添加service及rc
添加如下代码#include <LeeManager.h> #include <android/log.h> #include <hidl/HidlTransportSupport.h> using namespace android; using namespace vendor::lee::lee::V1_0::implementation; int main(int /* argc */, char* /* argv */[]) { android::hardware::configureRpcThreadpool(8, true /* callerWillJoin */); sp<LeeManager> mLeeManager = new LeeManager(); status_t status = mLeeManager->registerAsService(); if (status != OK) { ALOGE("Unable to register log service (%d)", status); return 1; } android::hardware::joinRpcThreadpool(); return 1; }
service lee-hal-1.0 /vendor/bin/hw/vendor.lee.lee@1.0-service class hal user system group system on post-fs-data start lee-hal-1.0
但是此时上层应用是拿不到service的
需要注册service注册halservice
例如
device/google/wahoo/manifest.xml
添加如下代码 <hal format="hidl" optional="true"> <name>vendor.lee.lee</name> <transport>hwbinder</transport> <version>1.0</version> <interface> <name>ILeeManager</name> <instance>default</instance> </interface> </hal>
<hal format="hidl" optional="true"> <name>vendor.lee.lee</name> <version>1.0</version> <interface> <name>ILeeManager</name> <instance>default</instance> </interface> </hal>
剩下的就是根据需要配置selinux的权限了
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算