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