Android HIDL第一个demo编写: HIDL Test——实现Framework&App层与HAL进程IPC

本文介绍了Android HIDL的基本概念,包括它的设计目的和进程间通信方式。详细阐述了如何编写和实现HIDL接口的客户端和服务器,并提供了一个简单的HIDL demo,演示了在Android 9.0平台上创建HAL代码、生成接口文件、实现Passthrough模式以及在框架和应用层调用HAL接口的过程。
摘要由CSDN通过智能技术生成

1.HIDL简介

HAL接口定义语言(简称 HIDL,发音为"hide-l")是用于指定HAL和其用户之间的接口的一种接口描述语言(IDL).HIDL允许指定类型和方法调用(会汇集到接口和软件包中).从更广泛的意义上来说,HIDL 是指用于在可以独立编译的代码库之间进行通信的系统.
HIDL旨在用于进程间通信(IPC).进程之间的通信采用Binder机制.对于必须与进程相关联的代码库,还可以使用直通模式(在Java中不受支持).

2.HIDL设计目的

HIDL 的目标是,可以在无需重新构建 HAL 的情况下替换框架.HAL 将由供应商或 SOC 制造商构建.并放置在设备的 /vendor 分区中,这样一来,就可以在框架自己的分区中通过OTA替换框架,而无需重新编译 HAL.

3.客户端和服务器实现

HIDL 接口具有客户端和服务器实现:
HIDL 接口的客户端实现是指通过在该接口上调用方法来使用该接口的代码.
服务器实现是指 HIDL 接口的实现,它可接收来自客户端的调用并返回结果(如有必要).
在从 libhardware HAL转换为HIDL HAL的过程中,HAL 实现成为服务器,而调用 HAL 的进程则成为客户端.默认实现可提供直通和Binder化HAL.

4.HIDL demo编写

基于版本:
Android9.0

进入android根目录,创建demo目录:

mkdir -p vendor/heisenberg/interfaces/hidltest/1.0

HAL代码:

vendor/heisenberg/interfaces/hidltest/1.0$ touch IHidlTest.hal
package vendor.heisenberg.hidltest@1.0;

interface IHidlTest {
   
    //传入一个string,返回一个string
    //generates:生成,表示一个返回值给客户端的接口方法
    helloWorld(string name) generates (string result);
};

使用脚本update-makefiles.sh生成HAL代码对应的bp文件:

Heisenberg海森堡:~/code/android/vendor/heisenberg/interfaces$ ./update-makefiles.sh
Updating makefiles for vendor.heisenberg in /home/.../android/vendor/heisenberg/interfaces.
...
Updating vendor.heisenberg.hidltest@1.0
...

Android.bp文件:

// This file is autogenerated by hidl-gen -Landroidbp.
hidl_interface {
   
    name: "vendor.heisenberg.hidltest@1.0",
    root: "vendor.heisenberg",
    srcs: [
        "IHidlTest.hal",
    ],
    interfaces: [
        "android.hidl.base@1.0",
    ],
    gen_java: true,
}

注意:
生成的Android.bp中包含这个字段:gen_java: true,这个字段的使用,使得我们在框架层和应用层不需要添加任何JAVA类,即可直接使用.

编译推包:

make -j8 vendor.heisenberg.hidltest@1.0
adb root;adb remount
adb push out/target/product/heisenberg/vendor/lib64/vendor.heisenberg.hidltest@1.0.so /vendor/lib64/
adb shell sync

接着使用hidl-gen工具生成对应的.h .cpp文件:

//先编译hidl-gen工具
make -j64 hidl-gen
//c++-impl生成hal的c++,h的标准文件:
hidl-gen -o vendor/heisenberg/interfaces/hidltest/1.0/default/ -L c++-impl -r vendor.heisenberg:vendor/heisenberg/interfaces/ -r android.hidl:system/libhidl/transport vendor.heisenberg.hidltest@1.0

HidlTest.h文件:

#ifndef VENDOR_HEISENBERG_HIDLTEST_V1_0_HIDLTEST_H
#define VENDOR_HEISENBERG_HIDLTEST_V1_0_HIDLTEST_H

#include <vendor/heisenberg/hidltest/1.0/IHidlTest.h>
#include <hidl/MQDescriptor.h>
#include <hidl/Status.h>

namespace vendor {
   
namespace heisenberg{
   
namespace hidltest 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值