android创建接口,创建 HAL 接口  |  Android 开源项目  |  Android Open Source Project

警告:Android 10 弃用了 ConfigStore HAL,并使用系统属性替换了该 HAL。如需了解详情,请参阅配置。

您必须使用 HIDL 来描述用于对框架进行条件式编译的所有构建标记。相关构建标记必须分组并包含在单个 .hal 文件中。使用 HIDL 指定配置项具有以下优势:

可实施版本控制(为了添加新配置项,供应商/OEM 必须明确扩展 HAL)

记录详尽

可使用 SELinux 实现访问控制

可通过供应商测试套件对配置项进行全面检查(范围检查、各项内容之间的相互依赖性检查等)

在 C++ 和 Java 中自动生成 API

确定框架使用的构建标记

首先,请确定用于对框架进行条件式编译的构建配置,然后舍弃过时的配置,缩小构建标记集的范围。例如,下列构建标记集已确定用于 surfaceflinger:

TARGET_USES_HWC2

TARGET_BOARD_PLATFORM

TARGET_DISABLE_TRIPLE_BUFFERING

TARGET_FORCE_HWC_FOR_VIRTUAL_DISPLAYS

NUM_FRAMEBUFFER_SURFACE_BUFFERS

TARGET_RUNNING_WITHOUT_SYNC_FRAMEWORK

VSYNC_EVENT_PHASE_OFFSET_NS

SF_VSYNC_EVENT_PHASE_OFFSET_NS

PRESENT_TIME_OFFSET_FROM_VSYNC_NS

MAX_VIRTUAL_DISPLAY_DIMENSION

创建 HAL 接口

子系统的构建配置是通过 HAL 接口访问的,而用于提供配置值的接口会在 HAL 软件包 android.hardware.configstore(目前为 1.0 版)中进行分组。例如,如需为 surfaceflinger 创建 HAL 接口文件,请在 hardware/interfaces/configstore/1.0/ISurfaceFlingerConfigs.hal 中运行以下命令:

package android.hardware.configstore@1.0;

interface ISurfaceFlingerConfigs {

// TO-BE-FILLED-BELOW

};

创建 .hal 文件后,请运行 hardware/interfaces/update-makefiles.sh,将新的 .hal 文件添加到 Android.bp 和 Android.mk 文件中。

为构建标记添加函数

对于每个构建标记,请向相应接口各添加一个新函数。例如,在 hardware/interfaces/configstore/1.0/ISurfaceFlingerConfigs.hal 中:

interface ISurfaceFlingerConfigs {

disableTripleBuffering() generates(OptionalBool ret);

forceHwcForVirtualDisplays() generates(OptionalBool ret);

enum NumBuffers: uint8_t {

USE_DEFAULT = 0,

TWO = 2,

THREE = 3,

};

numFramebufferSurfaceBuffers() generates(NumBuffers ret);

runWithoutSyncFramework() generates(OptionalBool ret);

vsyncEventPhaseOffsetNs generates (OptionalUInt64 ret);

presentTimeOffsetFromSyncNs generates (OptionalUInt64 ret);

maxVirtualDisplayDimension() generates(OptionalInt32 ret);

};

添加函数时,请注意以下事项:

采用简洁的名称。请避免将 makefile 变量名称转换为函数名称,并切记 TARGET_ 和 BOARD_ 前缀不再是必需的。

添加注释。帮助开发者了解配置项的用途,配置项如何改变框架行为、有效值以及其他相关信息。

函数返回类型可以是 Optional[Bool|String|Int32|UInt32|Int64|UInt64]。类型会在同一目录中的 types.hal 中进行定义,并使用字段(可表明原始值是否是由 HAL 指定)来封装原始值;如果原始值不是由 HAL 指定,则使用默认值。

struct OptionalString {

bool specified;

string value;

};

在适当的情况下,请定义最能代表配置项类型的枚举,并将该枚举用作返回类型。在上述示例中,NumBuffers 枚举会被定义为限制有效值的数量。在定义此类自定义数据类型时,请添加字段或枚举值(例如 USE_DEFAULT)来表示该值是否由 HAL 指定。

在 HIDL 中,单个构建标记并不一定要变成单个函数。模块所有者也可以将密切相关的构建标记汇总为一个结构体,并通过某个函数返回该结构体(这样做可以减少函数调用的次数)。

例如,用于在 hardware/interfaces/configstore/1.0/ISurfaceFlingerConfigs.hal 中将两个构建标记汇总到单个结构体的选项如下:

interface ISurfaceFlingerConfigs {

// other functions here

struct SyncConfigs {

OptionalInt64 vsyncEventPhaseoffsetNs;

OptionalInt64 presentTimeoffsetFromSyncNs;

};

getSyncConfigs() generates (SyncConfigs ret);

// other functions here

};

单个 HAL 函数的替代函数

作为针对所有构建标记使用单个 HAL 函数的替代函数,HAL 接口还提供了 getBoolean(string

key) 和 getInteger(string key) 等简单函数。实际的 key=value 对会存储在单独的文件中,而 HAL 服务会通过读取/解析这些文件来提供值。

虽然这种方法很容易定义,但它不具备 HIDL 提供的优势(强制实施版本控制、便于记录、实现访问控制),因此不推荐使用。

注意:在使用简单函数时,几乎不可能实现访问控制,因为 HAL 自身无法识别客户端。

单个接口与多个接口

面向配置项设计的 HAL 接口提供了以下两种选择:

单个接口;涵盖所有配置项

多个接口;每个接口分别涵盖一组相关配置项

单个接口更易于使用,但随着更多的配置项添加到单个文件中,单个接口可能会越来越难以维护。此外,由于访问控制不够精细,获得接口访问权限的进程可能会读取所有配置项(无法授予对部分配置项的访问权限)。此外,如果未授予访问权限,则无法读取任何配置项。

由于存在这些问题,Android 会针对一组相关配置项将多个接口与单个 HAL 接口搭配使用。例如,对 surfaceflinger 相关配置项使用 ISurfaceflingerConfigs,对蓝牙相关配置项使用 IBluetoothConfigs 等等。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值