Android HIDL学习 - HelloWord入门(整理1)

本文详细介绍HIDL(HAL接口定义语言)的基本概念与实践步骤,包括HIDL接口文件定义、生成HAL相关文件、实现HAL服务端共享库、Halserver端启动注册、HIDLClient端测试程序等,帮助读者掌握HIDL在Android开发中的应用。

概述

HAL 接口定义语言(简称 HIDL,发音为“hide-l”)是用于指定 HAL 和其用户之间的接口的一种接口描述语言 (IDL)。HIDL 允许指定类型和方法调用(会汇集到接口和软件包中)。从更广泛的意义上来说,HIDL 是用于在可以独立编译的代码库之间进行通信的系统。

HIDL 旨在用于进程间通信 (IPC)。进程之间的通信采用 Binder 机制。对于必须与进程相关联的代码库,还可以使用直通模式(在 Java 中不受支持)。

HIDL 可指定数据结构和方法签名,这些内容会整理归类到接口(与类相似)中,而接口会汇集到软件包中。尽管 HIDL 具有一系列不同的关键字,但 C++ 和 Java 程序员对 HIDL 的语法并不陌生。此外,HIDL 还使用 Java 样式的注释。
详细可以了解官方参考链接

入手准备

程序员有个癖好,无论是学习什么新知识,都喜欢以HelloWorld作为一个简单的例子来开头,咱们也不例外。
OK,咱这里都是干货,废话就不多说啦,学习HIDL呢咱们还是需要一些准备工作和门槛的。
准备工作:

Android BSP编译环境, 需要做整编
Android 设备的BSP代码
Android设备,用来跑测试代码

我这边使用的是MTK的一款设备,基于Android O系统这个平台来做开发。

当然了,如果手头上没有设备的话,你也可以使用Andnroid模拟器做开发,Android模拟器的镜像可以使用官方的AOSP代码来编译,但是注意的是如果使用模拟器,kernel要去下载goldfish的代码,这个我这里就不赘述了,可以google了解一下。

实例应用

接下来我们开始第一个HIDL应用实例,我们需要给这个简单的例子起一个牛逼的名字,我这里叫Naruto,不要问我为什么,哥是一个铁打的火影迷,哈哈,就这么定了,就叫Naruto了,那么那么我们就来说一段故事吧:

咱们可是要写一个Android的HAL,大家不要把初衷搞混了,我们看看AOSP有哪些HAL:

  • Camera
  • Audio
  • Sensor
  • 等等
    在这里插入图片描述
    这些啊都是Android设备上的硬件,因为Google理论上只关心Android的框架层和上层软件,但是上层软件依赖于底层的硬件实现,但是每家手机厂商,或者说是CPU厂商底层硬件的实现都是不一样的,所以这个HAL层基本都是手机厂商或者CPU厂商去实现的,Google只是作为一个框架的指导,和Framework层API的接口定义,这些接口的实现都得由HAL去完成。

那么我们的Naruto就肩负了这个重任喽,控制底层硬件嘛,底层硬件都是由Linux kernel驱动控制的,提供文件读写就可以简单控制驱动啦,咱们这边就搞虚拟驱动好了,省略了kernel driver的实现;

等等,我们这个是HelloWorld,好吧,Naruto,你就提供一个HelloWorld的接口吧,大材小用了。目的是让我们知道写一个HIDL的流程这就够了!!!

1.HIDL接口文件定义

进入代码,我们假设Naruto作为标准AOSP的HAL,我们就把代码揉进标准HAL(hardware/interface)层去,进入代码目录创建HIDL目录:

mkdir -p hardware/interfaces/naruto/1.0/default

接着创建接口描述文件INaruto.hal,放在刚才创建的1.0/目录中:

// INaruto.hal
package android.hardware.naruto@1.0;

interface INaruto {
   
   
    helloWorld(string name) generates (string result);
};

没错这是一个Google定义的语言格式具体数据类型转换请查看对应关系,C++和Java的结合体,我相信咱们搞Android BSP来发的,什么语言不会呢,对不:

  • 汇编:bootloader和kernel中可能会用到
  • C语言:这你丫不会,你玩毛的Linux Kernel啊
  • C++:这你丫不会,你就别搞Android底层开发了,HAL和中间库
  • Java:这么再不会就自杀吧,framework和app的代码都是Java的
  • Python:这个不会么也没事,编译相关的
  • Shell:这个不可能不会
  • Makefile:肯定会的,不会跳楼吧

这里我们定义了一个INaruto接口文件,简单的添加了一个helloWorld接口,传入是一个string,返回一个string,后面我们会来实现这个接口。

2. 生成HAL相关文件

如上,hal接口文件已经定义完成,接下来我们需要继承实现这个接口,那么我们应该如何继承如何编写呢,幸运的是Google还是帮我们提供了一套工具hidl-gen来生成HAL层相关的代码框架和代码实例,这样子我们只需要关心实现部分,而不需要写一堆无用代码,浪费时间在搞Makefile和一些低级错误上。

  • hidl-gen 可以自动帮我们生成hal层实例框架和Android.mk/bp编译控制
    因此,系统已经帮我们提供了一个执行脚本hardware/interface/update-makefiles.sh, 如下执行将会自动为我们生成所需要的文件:
./hardware/interface/update-makefiles.sh

查看我们最新的代码目录: hardware/interface/naruto:

├── 1.0
│   ├── Android.bp	//自动生成
│   ├── Android.mk  //自动生成
│   ├── default
│   │   ├── Android.bp  //需要自己编写
│   │   ├── android.hardware.naruto@1.0-service.rc  //用于加入开机启动服务
│   │   ├── Naruto.cpp  //自动生成
│   │   ├── Naruto.h    //自动生成
│   │   └── service.cpp   // hidl服务端注册入口程序
│   └── INaruto.hal  //定义接口
└── Android.bp    //自动生成

是不是so easy,我们写代码就写了一个INaruto.hal,其余代码都是自动生成的,特别是Naruto.cpp和Naruto.h这两个文件是实现接口的关键文件。

3. 实现HAL服务端的共享库

打开Naruto.h文件:

// Naruto.h
#ifndef ANDROID_HARDWARE_NARUTO_V1_0_NARUTO_H
#define ANDROID_HARDWARE_NARUTO_V1_0_NARUTO_H

#include <android/hardware/naruto/1.0/INaruto.h>
#include <hidl/MQDescriptor.h>
#include <hidl/Status.h>

namespace android {
   
   
namespace hardware {
   
   
namespace naruto {
   
   
namespace V1_0 {
   
   
namespace implementation {
   
   

using ::android::hardware::hidl_array;
using ::android::hardware
评论 11
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值