1.编写hal文件并编译

在hardware/interfaces/目录下创建test文件夹和基版本1.0,这个版本号分为两部分,major.minor。major版本不变得话,只能添加api,不能修改。

创建ITest.hal和types.hal
hardware/interfaces/test/1.0/ITest.hal

package android.hardware.test@1.0;interface ITest
{//get led status get() generates (LedStatus result);//set led status set(LedStatus  val) generates(int32_t  ret);getBrightnessRange() generates(bool ret,BrightnessRange range);setBrightnessValue(vec<int32_t> range) generates(bool ret);on() ;off() ;};

hardware/interfaces/test/1.0/types.hal

package android.hardware.test@1.0;enum LedStatus : uint32_t {LED_ON,LED_OFF,LED_BAD_VALUE,
};struct BrightnessRange {uint32_t min;uint32_t max;
};

添加完后,设置环境变量之后,执行./hardware/interfaces/update-makefiles.sh 会自动生成编译编译脚本,然后在

hardware/interfaces/test/1.0/ 路径下执行mm,会生成所需要得hidl库,接下来我们需要实现hidl interface,供client调用。

2. 实现Hidl Interface

首先实现ITest interface的子类testImpl 得头文件和对应得cpp。

hardware/interfaces/test/1.0/default/testImpl.h

#ifndef ANDROID_HARDWARE_LED_V1_0_LED_H
#define ANDROID_HARDWARE_LED_V1_0_LED_H
#include <android/hardware/test/1.0/ITest.h>#include <hidl/Status.h>#include <hidl/MQDescriptor.h>namespace android {
namespace hardware {
namespace test {
namespace V1_0 {
namespace implementation {using ::android::hardware::test::V1_0::LedStatus;
using ::android::hardware::test::V1_0::BrightnessRange;
using ::android::hardware::test::V1_0::ITest;
using ::android::hardware::hidl_array;
using ::android::hardware::hidl_string;
using ::android::hardware::hidl_vec;
using ::android::hardware::Return;
using ::android::hardware::Void;
using ::android::sp;struct testImpl : public ITest {public:testImpl();Return<LedStatus>  get() override ;Return<int32_t> set(LedStatus val) override;Return<void> on() override;Return<void> off() override;Return<void> getBrightnessRange(getBrightnessRange_cb _hidl_cb) override;Return<bool> setBrightnessValue(const hidl_vec<int32_t>& range) override;private:LedStatus state;
};extern "C" ITest* HIDL_FETCH_ITest(const char* name);
}  // namespace implementation
}  // namespace V1_0
}  // namespace test
}  // namespace hardware
}  // namespace android#endif //ANDROID_HARDWARE_LED_V1_0_LED_H

testImpl.cpp

#define LOG_TAG "TestService"#include <log/log.h>
#include "testImpl.h"namespace android {
namespace hardware {
namespace test {
namespace V1_0 {
namespace implementation {testImpl::testImpl() {state = LedStatus::LED_BAD_VALUE;ALOGE("testImpl Init status:%d", state);
}Return<void> testImpl::on() {state = LedStatus::LED_ON;ALOGE("testImpl on status:%d", state);return Void();
}Return<void> testImpl::off() {state = LedStatus::LED_OFF;ALOGE("testImpl off status:%d", state);  return Void();
}Return<LedStatus>  testImpl::get() {return state;
}
Return<int32_t> testImpl::set(LedStatus val) {if(val == LedStatus::LED_OFF || val == LedStatus::LED_ON)state = val;elsereturn -1;return 0;
}Return<void> testImpl::getBrightnessRange(getBrightnessRange_cb _hidl_cb)
{ALOGE("testImpl getBrightnessRange ");BrightnessRange range;range.max = 100;range.min = 1;_hidl_cb(true,range);return Void();}Return<bool> testImpl::setBrightnessValue(const hidl_vec<int32_t>& range)
{ALOGE("testImpl getBrightnessValue ");auto iter = range.begin();ALOGE("testImpl getBrightnessValue range.begin: %d",*iter);iter = range.end();ALOGE("testImpl getBrightnessValue range.end: %d",*iter);ALOGE("testImpl getBrightnessValue range.size: %zu",range.size());return true;
}ITest* HIDL_FETCH_ITest(const char * /*name*/) {ALOGE("testImpl HIDL_FETCH_ITest "); return new testImpl();
}}  // namespace implementation
}  // namespace V1_0
}  // namespace test
}  // namespace hardware
}  // namespace android

Android.dp

cc_library_shared {name: "android.hardware.test@1.0-impl",defaults: ["hidl_defaults"],srcs: ["testImpl.cpp"],shared_libs: ["libhidlbase","libhidltransport","libhardware","liblog","libutils","android.hardware.test@1.0",],
}cc_binary {name: "android.hardware.test@1.0-service",init_rc: ["android.hardware.test@1.0-service.rc"],srcs: ["service.cpp","testImpl.cpp"],shared_libs: ["liblog","libhardware","libhidlbase","libhidltransport","libutils","android.hardware.test@1.0",], }

3. 编写hdil service

接下来,使用相应功能填写存根并设置守护进程。可以使用passthrough方式和binder方式,示例:

hardware/interfaces/test/1.0/default/service.cpp

 #define LOG_TAG "android.hardware.test@1.0-service"#include <android/hardware/test/1.0/ITest.h>
#include <hidl/LegacySupport.h>
#include "testImpl.h"
using android::hardware::test::V1_0::ITest;
using android::hardware::test::V1_0::implementation::testImpl;
using android::hardware::defaultPassthroughServiceImplementation;
using android::hardware::configureRpcThreadpool;
using android::hardware::joinRpcThreadpool;
using android::sp;int main() {
#if 0
// Passthrough   dlopen so方式return defaultPassthroughServiceImplementation<Itest>();
#else
// Binder 方式sp<ITest> service = new testImpl();configureRpcThreadpool(1, true /*callerWillJoin*/);if(android::OK !=  service->registerAsService())return 1; joinRpcThreadpool();
#endif
}

4. 配置manifest.xml

add the code to the manifest.xm 以至于hwservicemanager 查找到指定的hidl service

About HIDL configures

system/libhidl/manifest.xml

    <hal format="hidl"><name>android.hardware.test</name><transport>hwbinder</transport>  <!--//hwbinder 或者passthrough (直通模式)-->  <version>1.0</version><interface><name>ITest</name><instance>default</instance></interface></hal>

5. hidl client端调用

hidl service运行后,可以通过C++和Java两种方式调用,非常方便,通过java直接访问,就省去了jni。

5.1 实现java调用hidl service的例子

将以下内容添加到 Android.mk 中:

 LOCAL_JAVA_LIBRARIES += android.hardware.test-V1.0-java

或将以下内容添加到 Android.bp 中:

  shared_libs: [/* … */"android.hardware.test-V1.0-java",],

该库还存在静态版:android.hardware.test-V1.0-java-static。

将以下内容添加到您的 Java 文件中:

  import android.hardware.test.V1_0.ITest;...// retry to wait until the service starts up if it is in the manifestITest server = ITest.getService(true /* retry */); // throws NoSuchElementException if not availableserver.on();

5.2 实现C++ 调用hidl service的例子

首先将 HAL 库添加到 makefile 中:

  Make:LOCAL_SHARED_LIBRARIES += android.hardware.test@1.0Soong:shared_libs: [ …, android.hardware.test@1.0 ]

接下来,添加 HAL 头文件:

  #include <android/hardware/test/1.0/ITest.h>…// in code:sp<ITest> client = ITest::getService();client->on();

下面是Demo clinet

 #define LOG_TAG "TEST_CLINET"
#include <android/hardware/test/1.0/ITest.h>
#include <log/log.h>using android::hardware::test::V1_0::ITest;
using android::hardware::test::V1_0::LedStatus;
using android::hardware::test::V1_0::BrightnessRange;
using android::hardware::hidl_vec;
using android::sp;int main(){// BrightnessRange range;sp<ITest> service = ITest::getService();if( service == nullptr ){ALOGE("Can't find ITest service...");return -1;}ALOGE("ITest ON");service->on();ALOGE("ITest OFF");service->off();ALOGE("ITest set");service->set(LedStatus::LED_ON);ALOGE("ITest get");LedStatus ret = service->get();ALOGE("ITest get: %d",ret);service->getBrightnessRange([](bool ret1,BrightnessRange range){ALOGE("ITest getBrightnessRange ret: %d",ret1);ALOGE("ITest getBrightnessRange Max: %d",range.max);ALOGE("ITest getBrightnessRange Min: %d",range.min);});int32_t array[] = {5, 6, 7};hidl_vec<int32_t> hv1 = std::vector<int32_t>(array, array + 3);bool ret2 = service->setBrightnessValue(hv1);ALOGE("ITest getBrightnessValue bool: %d",ret2);return 0;
}

参考

具体步骤

1. 创建目录cd  hardware/interfacesmkdir -p test/1.0
2. 定义hal接口Itest.halpackage android.hardware.test@1.0;interface Itest {setData(YeData data) generates (YeStatus ret);getData() generates (YeData ret);};定义数据类型types.halpackage android.hardware.test@1.0;enum YeStatus : int32_t {SUCCESS = 1,FAILED,};struct YeData {int32_t x;int32_t y;};
3. 根据.hal自动生成impl库的cpp实现make hidl-gen在hardware/interfaces/test/1.0目录执行hidl-gen命令:PACKAGE=android.hardware.test@1.0LOC= default/implhidl-gen -o $LOC -Lc++-impl -r android.hardware:hardware/interfaces $PACKAGE
4. 生成impl的Android.bphidl-gen -o default -Landroidbp-impl -r android.hardware:hardware/interfaces $PACKAGE
5. 生成hidl的Android.bp执行hardware/interfaces/update-makefiles.sh
6. 修改device/fsl/imx8q/XXX/manifest.xml添加以下代码:<hal format="hidl"><name>android.hardware.test</name><transport>hwbinder</transport><version>1.0</version><interface><name>Itest</name><instance>default</instance></interface></hal>
7. 编写.rc文件配置自启动service vendor.test-1.0 /vendor/bin/hw/android.hardware.test@1.0-serviceclass haluser systemgroup system
8. 添加PRODUCT_PACKAGES在device/fsl/imx8q/XXX/XXX.mk中新增打包.so和service到vendor.img# Yetest HALPRODUCT_PACKAGES += \android.hardware.test@1.0-impl \android.hardware.test@1.0-service
9. device/fsl/imx8q/XXX/BoardConfig.mk中指定sepolicy路径:BOARD_SEPOLICY_DIRS +=  hardware/interfaces/test/sepolicy
10. 在hardware/interfaces/test/sepolicy目录新增test.te:type test, domain;type test_exec, exec_type, vendor_file_type, file_type;hwbinder_use(test);init_daemon_domain(test)add_hwservice(test,test_hwservice)allow test hwservicemanager_prop:file {read open getattr map};allow test system_file:dir {read open getattr search};
11. hardware/interfaces/test/sepolicy目录下新增file_contexts:绑定android.hardware.test@1.0-service与test_exec的关系的关键/(vendor|system/vendor)/bin/hw/android\.hardware\.test@1\.0-service    u:object_r:test_exec:s0/(vendor|system/vendor)/lib(64)?/hw/android\.hardware\.test@1\.0-impl\.so     u:object_r:same_process_hal_file:s0
12. 新增harware/interfaces/test/sepolicy/hwservice_contexts:android.hardware.test::Itest u:object_r:test_hwservice:s0
13. 新增harware/interfaces/test/sepolicy/hwservice.te:type test_hwservice, hwservice_manager_type;

Android 8.0 添加HIDL相关推荐

  1. android 7.0 添加google play

     android 7.0 添加google play 1.需要去谷歌官网下载google play的本地升级包. 2.解压需要解压3次,先unzip file.zip解压整包,在用lunzip解压ta ...

  2. android ble5.0添加扫描过滤,bluetooth-lowenergy

    精简版: 在我使用Android 5.0 Lollipop的测试中,我注意到android.bluetooth.le.BluetoothLeScanner检测BLE设备的频率低于Android 4.4 ...

  3. Android9.0添加HIDL

    1.编写hal文件并编译 在hardware/interfaces/目录下创建test文件夹和基版本1.0,这个版本号分为两部分,major.minor.major版本不变得话,只能添加api,不能修 ...

  4. android 10.0添加开机铃声

    在定制化系统中,默认是没有开机铃声的,有客户提出需要要添加开机铃声,所以为了 完成需求,就来实现这一个功能 关于开机铃声 都是在bootanimation_main.cpp 这里面负责管理 frame ...

  5. android 11.0添加开机铃声

    1.概述 在11.0在定制化系统中,默认是没有开机铃声的,有客户提出需要要添加开机铃声,所以为了 完成需求,就来实现这一个功能 关于开机铃声 都是在BootAnimation.cpp 这里面负责管理 ...

  6. Android 11.0 添加关机铃声功能实现

    1.前言 在11.0的系统rom定制化开发中,在原生系统中,关于开机铃声和关机铃声是默认不支持的,系统默认支持开机动画和关机动画等功能,所以关于增加开机铃声和关机 铃声的相关功能,需要自己增加相关的关 ...

  7. Android 10.0添加关机动画和关机音乐

    最近客户提出要添加关机动画和关机音乐的需求,于是就来实现这一需求,和开机动画开机音乐一样要添加资源 先看BootAnimation.cpp来分析源码 frameworks\base\cmds\boot ...

  8. Android 10 HAL 层添加HIDL实现过程

    本文以跑步机为假想场景介绍如何在Android Q(10)上添加HIDL,内容涉及HAL.HIDL进程间通讯.多线程以及串口操作,涵盖了标准的Android硬件服务的主要技术.编写时参考了两篇博客(见 ...

  9. 细数Android 7.0“牛轧糖”的五大缺陷:不支持悬浮窗口

    导语:当前,Android 7.0 Nougat(牛轧糖)已经开始被缓慢部署至全球各地的Android设备中.按照惯例,仍然是Nexus设备首先获得谷歌最新的移动操作系统,其他的智能手机则还需要等待一 ...

最新文章

  1. java excel读取操作,Java读取Excel并操作
  2. php 更新页面代码,php – 自动更新页面的代码大纲
  3. RedHat6配置网络yum源
  4. c++-add two numbers 两个链表相加
  5. 与非CCR代码互操作
  6. HTTP请求的GET与POST方式的区别
  7. dj电商-模型类设计-1.x-订单模块表
  8. [Code Snipper]图片轮换
  9. ImageNet2012数据集完整版百度云下载
  10. linux 下的sar工具命令小结
  11. 含有自增序列的表中使用truncate与delete的不同结果
  12. redis实现订单过期取消
  13. Proteus 8.4软件安装教程
  14. 信息安全实验二、漏洞扫描与病毒防治
  15. 计算机毕业设计项目推荐(源码+论文+PPT)
  16. 抖音seo源码,抖音短视频SEO,SEO系统源码搭建
  17. 用Windows自带的系统恢复环境WinRE进行系统重大故障排查,轻松修复Windows蓝屏、白屏等问题
  18. 【arduino】常用芯片ATMEGA328P-AU 32TQFP资料详解
  19. VM 虚拟机网络配置
  20. matlab 矩阵大小变换,matlab 矩阵变换

热门文章

  1. R语言GWR地理加权回归
  2. Mac M1系统 miniconda安装、配置conda环境,及在conda环境中安装激活QIIME2
  3. SoftMax函数,交叉熵损失函数与熵,对数似然函数
  4. python中[x for x in range(n)]列表推导式
  5. 3D音频理论研究(二)---3D全介绍(转)
  6. 电力英语及计算机成绩查询入口官网,考试成绩查询入口
  7. Java在Web端微信公众号授权登录
  8. java thread dump
  9. Linux服务器搭建--NTP服务器的搭建与配置
  10. Linux故障处理——磁盘空间满缺找不到对应大文件