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
  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;
}

参考 

Android9.0添加HIDL相关推荐

  1. Android9.0 添加APP后台防杀机制

    软件平台:Android9.0 硬件平台:MTK6771 开发过程中遇到在系统资源紧张的时候,后台进程被LMK杀死的情况,下面提供一个防杀策略,供参考: diff --git a/services/c ...

  2. Android 8.0 添加HIDL

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

  3. rk3368 Android9.0 HIDL调试记录

    rk3368 Android9.0 HIDL调试记录 Platform: RK3368 OS: Android 9.0 Kernel: 4.4.194 文章目录 rk3368 Android9.0 H ...

  4. Android9.0 Wifi模块Framework层分析

    Android9.0 Wifi Module 一.WifiService的启动 ​ Wifi Service是在SystemServer的startOtherServices中启动的.在其构造函数中主 ...

  5. 安卓9.0添加服务修改SELinux

    #文章目录 #前言 #SELinux来源 #SELinux基本框架 #SELinux 在不同版本的表现 #使用audit2allow工具生成SELinux 权限 #完整代码 #前言 先推荐下之前的SE ...

  6. SpUtil多样加密存储,兼容android9.0

    代码地址如下: http://www.demodashi.com/demo/15058.html ####前言 在android系统不断升级的过程中,Sharepreferences存储出现多中问题, ...

  7. android9.0自动使用24小时制

    最近做android9.0系统相关的定制工作,用户反馈时间设置中的自动使用24小时制没效果,亲自试了下确实时间显示的格式没变,于是一脸蒙逼.网上查了有人问相同的问题,不过也没有确切的答案,可能是and ...

  8. 利用Android9.0虚拟机的JVMTI技术实现一些黑科技

    Java生态中有一些非常规的技术,它们能达到一些特别的效果.这些技术的实现原理不去深究的话一般并不是广为人知.这种技术通常被称为黑科技.而这些黑科技中的绝大部分底层都是通过JVMTI实现的.形象地说, ...

  9. Android9.0 网络安全配置文件

    Android9.0 网络安全配置文件 在Android9.0版本中,对网络安全有较高的要求,如果访问的是 https 协议则不受影响:而如果你访问了 http 协议的网址,还需要添加安全配置文件,步 ...

最新文章

  1. SpringBoot 定时任务动态管理通用解决方案
  2. 独家 | 利用Python实现主题建模和LDA 算法(附链接)
  3. QT Creator使用matlab库文件读取.mat文件数据
  4. 致青春——谁的青春没有遗憾2018-01-05
  5. Fiori应用里如何隐藏prospect字段
  6. python有大括号吗_只有我一个人觉得Python取消了大括号而显得结构更加混乱了吗?...
  7. 1.窗体与界面设计-菜单应用实例
  8. 暴雪2013年内发布linux游戏,只因win8是场灾难?
  9. 牛客 2022年中国高校计算机大赛-团队程序设计天梯赛(GPLT)上海理工大学校内选拔赛 签到题13题
  10. Windows 11企业版虚拟机镜像官方版下载及安装
  11. 第四章第六题(圆上的随机点)(Random points on a circle)
  12. 递归算法删除某一链表指定节点为什么不会发生断链?(解析原因)
  13. 同厂玩伴---鸭子兄传
  14. 井字棋游戏案例C++语言
  15. Oracle 计算表中的时间与当前时间差
  16. 安全运营(SOC)概述
  17. 视频教程-20年Nodejs教程零基础入门到项目实战前端视频教程-Node.js
  18. C语言——PTA 最大公约数和最小公倍数
  19. 双十一来袭,想要掌控售卖数据,为何不试试智慧商场可视化系统?
  20. 淘宝被封980年怀疑恶意刷单?教你用爬虫秒杀抢购

热门文章

  1. Linux基础-固化命令的方式grep
  2. hdu4292 Food 最大流
  3. Lync 2013持久聊天迁移至Skype for Business
  4. unity: GetLocalizedString can only be called from the main thread 异常解决
  5. Erlang编程语言的一些痛点
  6. UiModeManager设置夜间模式和行车模式
  7. Skara 是研究JDK源代码的工具
  8. 【数据处理】奇异值分解(SVD) 数据降噪的python实现
  9. mysql三阶段提交实现_基于两阶段提交的分布式事务实现(UP-2PC)
  10. bat调用ant_bat调用ant_Ant调用批处理文件编译VS2005程序