没有合适的资源?快使用搜索试试~ 我知道了~
AndroidQ 打通应用层到HAL层—(HIDL服务实现)
104 下载量 197 浏览量
2021-01-03
15:54:21
上传
评论 1
收藏 503KB PDF 举报
温馨提示
试读
5页
AndroidQ 打通应用层到HAL层—(HAL模块实现)这篇文章中我们已经实现了自己的HAL,本篇我们实现一个HIDL服务,通过这个服务来调用HAL模块的函数 什么是HIDL HIDL 全称为HAL interface definition language(发音为“hide-l”)是用于指定 HAL 和其用户之间的接口的一种接口描述语言 (IDL),Android O开始引入了HIDL这个概念,HIDL和应用层AIDL差不多,AIDL常用于连接App和Framework,HIDL则是用来连接Framework和HAL,AIDL使用Binder通信,HIDL则使用HwBinder通信,他们都
资源推荐
资源详情
资源评论
AndroidQ 打通应用层到打通应用层到HAL层层—(HIDL服务实现服务实现)
AndroidQ 打通应用层到HAL层—(HAL模块实现)这篇文章中我们已经实现了自己的HAL,本篇我们实现一个HIDL服务,通过这个服务来调用HAL模块的函数
什么是什么是HIDL
HIDL 全称为HAL interface definition language(发音为“hide-l”)是用于指定 HAL 和其用户之间的接口的一种接口描述语言 (IDL),Android O开始引入了HIDL这个概念,HIDL和应用
层AIDL差不多,AIDL常用于连接App和Framework,HIDL则是用来连接Framework和HAL,AIDL使用Binder通信,HIDL则使用HwBinder通信,他们都是通过Binder驱动完成通信,
只不过两个Binder域不一样
为什么需要为什么需要HIDL
目前Android系统生态是几乎每年google都会出一个Android大版本,而普通手机用户一部手机一般要用两三年,所以你会发现尽管Android系统已经升级到了10,马上11出来了,然
后还是有很多用户依然使用的是Android 5,6,7等版本,对普通用户来说如果不更换手机就很难跟上Android版本,这是因为OEM厂商在同一设备上进行系统升级需要花费时间金钱
成本很高,导致他们不愿意升级,成本高的原因是Android O之前Android Framework的升级需要OEM将HAL也进行对应升级,Framework和HAL是一起被编译成system.img,它们存
在高耦合,针对这种情况google在Android O中引入了Treble计划,Treble的目的就是解耦Framework和HAL,就是通过HIDL来实现,Framework不再直接调用HAL,而是通过HIDL来
间接使用HAL模块,每个HAL模块都可以对应一个HIDL服务,Framework层通过HwBinder创建HIDL服务,通过HIDL服务来获取HAL相关模块继而打开HAL下的设备,而最终HAL也
从system.img中分离,被编进一个单独的分区vendor.img,从而简化了Android系统升级的影响与难度
HIDL的使用的使用
HIDL可以分为:HIDL C++(C++实现)、HIDL Java(Java 实现),并且还主要分为直通式和绑定式,本篇文章使用的C++和直通式的HIDL,HIDL用起来非常简单,AOSP的
hardware/interfaces/目录下有很多的HIDL,我们仿照其他HIDL创建自己的HIDL目录:hardware/interfaces/hello_hidl/1.0
并在此目录下创建一个IHello.hal文件:
package android.hardware.hello_hidl@1.0;
interface IHello {
addition_hidl(uint32_t a,uint32_t b) generates (uint32_t total);
};
这个文件定义了一个addition_hidl函数,这个函数用来调用HAL的加法函数
然后就可以使用Android提供的工具hidl-gen来生成HIDL框架,执行如下命令:
PACKAGE=android.hardware.hello_hidl@1.0
LOC=hardware/interfaces/hello_hidl/1.0/default/
hidl-gen -o $LOC -Lc++-impl -randroid.hardware:hardware/interfaces -randroid.hidl:system/libhidl/transport $PACKAGE
hidl-gen -o $LOC -Landroidbp-impl -randroid.hardware:hardware/interfaces -randroid.hidl:system/libhidl/transport $PACKAGE
执行命令成功之后我们会发现hardware/interfaces/hello_hidl/1.0下多了一个default目录,进入default目录,里面有三个文件Android.bp,Hello.cpp,Hello.h
之后再在执行./hardware/interfaces/update-makefiles.sh这个命令,update-makefiles.sh这个脚本目的是为HIDL生成对应Android.bp文件
最后目录结构为:
接着我们还需要在default目录下增加一个空文件service.cpp,用作注册HIDL服务,我们采用直通式的HIDL,所以service.cpp的内容为:
#include
#include
// Generated HIDL files
using android::hardware::hello_hidl::V1_0::IHello;
using android::hardware::defaultPassthroughServiceImplementation;
int main() {
return defaultPassthroughServiceImplementation();
}
defaultPassthroughServiceImplementation函数最终会向HwServiceManager注册HIDL服务
接着我们来看看之前生成的文件,首先看Hello.h
// FIXME: your file license if you have one
#pragma once
#include
#include
#include
namespace android {
namespace hardware {
namespace hello_hidl {
namespace V1_0 {
namespace implementation {
using ::android::hardware::hidl_array;
using ::android::hardware::hidl_memory;
资源评论
weixin_38713450
- 粉丝: 7
- 资源: 925
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功