iis服务器助手广告广告
返回顶部
首页 > 资讯 > 移动开发 >Android 框架学习(4)—— HIDL
  • 955
分享到

Android 框架学习(4)—— HIDL

学习框架Android 2022-06-06 14:06:36 955人浏览 八月长安
摘要

一、HIDL定义         HIDL是用于指定HAL与其用户之间接口的一个接口描述语言(Interface Description Lan

一、HIDL定义

        HIDL是用于指定HAL与其用户之间接口的一个接口描述语言(Interface Description Language,发音为“hide-l”)。HIDL允许指定类型和方法调用(会汇集到接口和软件包中)。从更广泛的意义上来说,HIDL是用于在可以独立编译的代码库之间进行通信的系统。
        HIDL旨在用于进程间通信 (IPC)。进程之间的通信经过Binder化。对于必须与进程相关联的代码库,还可以使用直通模式(在 Java 中不受支持)。
        HIDL的设计目的:主要是将Framework和HAL隔离开,Framework可以单独覆盖、更新而不用对HAL做改动。引入HIDL,可以将HAL从

system.img
中移除出去,方便Android版本的升级。

二、HIDL架构模式

        HIDL的演化历程:
在这里插入图片描述

Passthrough模式 Binder化的Passthrough HALs

        什么是Binder化?
        一直以来,供应商进程都使用Binder进程间通信(IPC)技术进行通信。在Android O中,

/dev/binder
设备节点成为了框架进程的专属节点,这意味着供应商进程将无法再访问该节点。供应商进程可以访问
/dev/hwbinder
,但必须将其aiDL接口转为使用HIDL。

三、软件包
软件包前缀 位置
android.hardware.* hardware/interfaces}; // interface methods create(int32_t id) generates (MyStruct s); close(); };

        不含显式

extends
声明的接口会从
android.hidl.base@1.0::IBase
(类似于Java中的
java.lang.Object
)隐式扩展。

五、导入

        

import
语句是用于访问其他软件包中的软件包接口和类型的HIDL机制。
import
语句本身涉及两个实体:

导入实体:可以是软件包或接口。 被导入实体:也可以是软件包或接口。

        导入实体由

import
语句的位置决定。当该语句位于软件包的
types.hal
中时,导入的内容对整个软件包是可见的;这是软件包级导入。当该语句位于接口文件中时,导入实体是接口本身;这是接口级导入。
        被导入实体由
import
关键字后面的值决定。该值不必是完全限定名称;如果某个组成部分被删除了,系统会自动使用当前软件包中的信息填充该组成部分。
        对于完全限定值,支持的导入情形有以下几种:

完整软件包导入

        如果该值是一个软件包名称和版本(语法见下文),则系统会将整个软件包导入至导入实体。

import android.hardware.nfc@1.0;            // import a whole package
部分导入

        如果值为:

一个接口,则系统会将该软件包的
types.hal
和该接口导入至导入实体中。 在
types.hal
中定义的UDT,则系统仅会将该UDT导入至导入实体中(不导入
types.hal
中的其他类型)。 仅类型导入

        如果该值将上文所述的“部分导入”的语法与关键字types而不是接口名称配合使用,则系统仅会导入指定软件包的

types.hal
中的UDT。

import android.hardware.example@1.0::types; // import just types.hal
六、接口继承

        接口可以是之前定义的接口的扩展。扩展可以是以下三种类型中的一种:

接口可以向其他接口添加功能,并按原样纳入其api。 软件包可以向其他软件包添加功能,并按原样纳入其API。 接口可以从软件包或特定接口导入类型。

        接口只能扩展一个其他接口(不支持多重继承)。

七、接口哈希

        哈希是一种旨在防止意外更改接口并确保接口更改经过全面审查的机制。这种机制是必需的,因为HIDL接口带有版本编号,也就是说,接口一经发布便不得再更改,但不会影响应用二进制接口(ABI)的情况(例如更正备注)除外。
        每个软件包根目录(即映射到

hardware/interfaces
android.hardware
或映射到
vendor/foo/hardware/interfaces
vendor.foo
)都必须包含一个列出所有已发布HIDL接口文件的
current.txt
文件。

# current.txt files support comments starting with a ‘#' character
# this file, for instance, would be vendor/foo/hardware/interfaces/current.txt
# Each line has a SHA-256 hash followed by the name of an interface.
# They have been shortened in this doc for brevity but they are
# 64 characters in length in an actual current.txt file.
d4ed2f0e...995f9ec4 vendor.awesome.foo@1.0::IFoo # comments can also Go here
# types.hal files are also noted in types.hal files
c84da9f5...f8ea2648 vendor.awesome.foo@1.0::types
# Multiple hashes can be in the file for the same interface. This can be used
# to note how ABI sustaining changes were made to the interface.
# For instance, here is another hash for IFoo:
# Fixes type where "FooCallback" was misspelled in comment on "FooStruct"
822998d7...74d63b8c vendor.awesome.foo@1.0::IFoo

        

hidl-gen
是安卓架构HIDL编译工具。它的源码目录为
system/tools/hidl
,编译生成的可执行文件路径为
out/host/linux-x86/bin/hidl-gen
,可以手动将哈希添加到
current.txt
文件中,也可以使用
hidl-gen
添加。以下代码段提供了可与
hidl-gen
搭配使用来管理
current.txt
文件的命令示例(哈希已缩短):

$ hidl-gen -L hash -r vendor.awesome:vendor/awesome/hardware/interfaces -r android.hardware:hardware/interfaces -r android.hidl:system/libhidl/transport vendor.awesome.nfc@1.0::types
9626fd18...f9d298a6 vendor.awesome.nfc@1.0::types
$ hidl-gen -L hash -r vendor.awesome:vendor/awesome/hardware/interfaces -r android.hardware:hardware/interfaces -r android.hidl:system/libhidl/transport vendor.awesome.nfc@1.0::INfc
07ac2dc9...11e3cf57 vendor.awesome.nfc@1.0::INfc
$ hidl-gen -L hash -r vendor.awesome:vendor/awesome/hardware/interfaces -r android.hardware:hardware/interfaces -r android.hidl:system/libhidl/transport vendor.awesome.nfc@1.0
9626fd18...f9d298a6 vendor.awesome.nfc@1.0::types
07ac2dc9...11e3cf57 vendor.awesome.nfc@1.0::INfc
f2fe5442...72655de6 vendor.awesome.nfc@1.0::INfcClientCallback
$ hidl-gen -L hash -r vendor.awesome:vendor/awesome/hardware/interfaces -r android.hardware:hardware/interfaces -r android.hidl:system/libhidl/transport vendor.awesome.nfc@1.0 >> vendor/awesome/hardware/interfaces/current.txt

        

hidl-gen
生成的每个接口定义库都包含哈希,通过调用
IBase::getHashChain
可检索这些哈希。

八、注册服务

        HIDL接口服务器(实现接口的对象)可注册为已命名的服务。注册的名称不需要与接口或软件包名称相关。如果没有指定名称,则使用名称“默认”;这应该用于不需要注册同一接口的两个实现的 HAL。例如,在每个接口中定义的服务注册的c++调用是:

status_t status = myFoo->reGISterAsService();
status_t anotherStatus = anotherFoo->registerAsService("another_foo_service");  // if need

        HIDL接口的版本包含在接口本身中。版本自动与服务注册关联,并可通过每个HIDL接口上的方法调用

android::hardware::IInterface::getInterfaceVersion()
)进行检索。服务器对象不需要注册,并可通过HIDL方法参数传递到其他进程,相应的接收进程会向服务器发送HIDL方法调用。

九、发现服务

        客户端代码按名称和版本请求指定的接口,并对所需的HAL类调用

getService

// C++
sp service = V1_1::IFooService::getService();
sp alternateService = 1_1::IFooService::getService("another_foo_service");
// Java
V1_1.IFooService; service = V1_1.IFooService.getService(true );
V1_1.IFooService; alternateService = 1_1.IFooService.getService("another", true );

        每个版本的HIDL接口都会被视为单独的接口。因此,IFooService版本1.1和IFooService版本2.2都可以注册为

foo_service
,并且两个接口上的
getService("foo_service")
都可获取该接口的已注册服务。因此,在大多数情况下,注册或发现服务均无需提供名称参数(也就是说名称为“默认”)。

十、服务终止通知

        想要在Service终止时收到通知的客户端会接收到框架传送的终止通知。要接收通知,客户端必须:

将HIDL类/接口
hidl_death_recipient
(位于C++代码中,而非HIDL中)归入子类。 替换其
serviceDied()
方法。 实例化
hidl_death_recipient
子类的对象。 在要监控的服务上调用
linkToDeath()
方法,并传入
ideathRecipient
的接口对象。请注意,此方法并不具备在其上调用它的终止接收方或代理的所有权。

        伪代码示例:

class IMyDeathReceiver : hidl_death_recipient {
  virtual void serviceDied(uint64_t cookie,
                           wp& service) override {
    log("RIP service %d!", cookie);  // Cookie should be 42
  }
};
....
IMyDeathReceiver deathReceiver = new IMyDeathReceiver();
m_importantService->linkToDeath(deathReceiver, 42);

作者:jaronho


--结束END--

本文标题: Android 框架学习(4)—— HIDL

本文链接: https://www.lsjlt.com/news/29689.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Python Behave框架学习
    behave是python语言的行为驱动开发,全称:Behavior-driven development,简称BDD。 BDD框架 BDD即行为驱动开发(Behavior Driv...
    99+
    2024-04-02
  • spring框架学习总结
    目录Spring 框架概述Spring优点Spring体系结构Spring拓展Spring Boot与Spring CloudSpring IoC 容器 (IoC 也称为依赖项注入(...
    99+
    2024-04-02
  • 如何学习Ajax 框架
    本篇文章为大家展示了如何学习Ajax 框架,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一.XMLHttpRequest 对象的三个重要的属性。onreadysta...
    99+
    2024-04-02
  • Python Web框架Django学习
    python web框架Django学习(二)目录: 三、Django创建APP 四、创建登录页面,实现用户交互,后台管理用户(非数据库方式)=================================================...
    99+
    2023-01-31
    框架 Python Web
  • 学习笔记-TP5框架学习笔记\(路由\)
    TP5框架简单理解 (PS:只做粗略、关键知识的记录,TP程序的开始。详情请阅读官方手册) 1. 架构总览 TP程序的开始 PHP >=5.3.0, PHP7 ThinkPHP5.0应用基于MVC(模型-视图-控制器)的方...
    99+
    2023-10-25
    学习 php 开发语言
  • Python爬虫框架Scrapy 学习
    开发环境PyCharm目标网站和上一次一样,可参考:http://dingbo.blog.51cto.com/8808323/1597695 但是这次不是在单个文件中运行,而是创建一个scrapy项目1.使用命令行工具创建scrapy项目的...
    99+
    2023-01-31
    爬虫 框架 Python
  • 学习canvas框架 详解常用的canvas框架
    探索Canvas框架:了解常用的Canvas框架有哪些,需要具体代码示例 引言:Canvas是HTML5中提供的一个绘图API,通过它我们可以实现丰富的图形和动画效果。为了提高绘图的效率和便捷性,许多开发者开发了不同的Canva...
    99+
    2024-01-17
    Canvas 框架 常用
  • web开发框架Flask学习一
    flask框架 用Python做Web开发的三大框架特点 Django 主要特点是大而全,集成了很多的组件,例如:Admin Form Model等,不管你用不用的到,他都会为 ...
    99+
    2023-01-30
    框架 web Flask
  • Android Studio 学习记录-下拉框
    目录 下拉框控件 Spinner  数组适配器ArrayAdapter  简单适配器 SimpleAdapter         本节介绍下拉框的用法以及适配器的基本概念,结合对下拉框Spinner的使用说明分别阐述数 组适配器Array...
    99+
    2023-09-16
    android studio
  • python 学习总结4
    数字类型及操作 一、整数类型   (1)python中的整数与数学中的概念是一致的,可以正也可以负,没有取值范围。        pow(x,y)函数是计算x的y次幂,想计算多大就多大。   (2)在整数类型中有四种进制形式      十...
    99+
    2023-01-30
    python
  • web开发框架Flask学习二
    jinja2模板规范 在当前项目中创建一个文件为templates的文件夹,将其设置为模板文件夹,新建的html为模板页面, 在视图函数中使用render_template(".html的文件", my_...
    99+
    2023-01-30
    框架 web Flask
  • Spring框架学习之AOP详解
    目录一、概念二、底层原理:动态代理2.1 有接口, JDK 动态代理2.2 无接口, CGLIB 动态代理三、术语四、操作4.1 Spring 框架一般都是基于 AspectJ 实现...
    99+
    2024-04-02
  • PHP之CI框架学习讲解
    一、前言 CodeIgniter 是一个简单快速的PHP MVC框架。EllisLab 的工作人员发布了 CodeIgniter。CodeIgniter 是一套小巧但功能强大的、给 ...
    99+
    2024-04-02
  • 生命在于学习——框架-中间件的学习(一)
    声明:本篇文章仅用于学习笔记记录,不得用于其他用途。 一、什么是框架 Web框架(Web framework)或者叫做Web应用框架(Web application framework),是用于进行...
    99+
    2023-09-28
    学习 中间件 php
  • 学习LeetCode,GO语言框架有哪些值得学习的?
    近年来,随着人工智能、大数据等技术的不断发展,算法和数据结构也成为了程序员不可或缺的技能之一。LeetCode作为目前最为流行的在线编程平台之一,给广大程序员提供了一个练习算法和数据结构的好平台。而在LeetCode中,GO语言框架也是一种...
    99+
    2023-10-03
    leetcode 框架 索引
  • PHP怎么学习新的PHP框架
    这篇文章主要介绍PHP怎么学习新的PHP框架,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1、你好世界(hello world) 这里练习的必要性我就不多作说明了。在一个新的框架上构建一个应用,在页面中显示“&...
    99+
    2023-06-17
  • python学习-4 python基础-
    条件语句的原理:     2.举个例子:比大小   #!/usr/bin/env python # -*- coding:utf8 -*- a=input("请输入a:") b=input("请输入b:") if a >...
    99+
    2023-01-31
    基础 python
  • Django框架HttpResponse和HttpRequest对象学习
    目录HttpRequest对象1.我们可以打印这个request对象2.我们可以打印观察一下它具备哪些方法常用属性和方法功能讲解: HttpResponse对象HttpRespons...
    99+
    2024-04-02
  • Android资源管理框架(Asset Manager)简要介绍和学习计划
    Android资源管理框架(Asset Manager)是Android系统中的一个重要组件,用于管理应用程序中的资源文件。它可以用...
    99+
    2023-09-28
    Android
  • Python的哪个Web框架学习周期短,学习成本低?
    知乎上有人问,Python的哪个Web框架学习周期短,学习成本低?很多人推荐Flask,老牌轻量级web框架,确实是初学者的首选。这几天我在Github上看到FastApi,觉得比Flask更轻量。FastApi是这两年异军突起的网红web...
    99+
    2023-05-14
    Python web 框架
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作