返回

跳过 Binder,直达 HIDL

Android

如果您对 Binder 一无所知,那么是时候掌握 HIDL(HAL 接口定义语言)了。在 Android 8.0 及更高版本中,HAL 已基本全部使用 HIDL 重新实现。

HIDL 的崛起

Binder 是 Android 中用于进程间通信(IPC)的传统机制。虽然 Binder 功能强大且可靠,但它也存在一些缺点:

  • 复杂性:Binder 的接口定义使用 AIDL(Android 接口定义语言)编写,这是一种复杂的语言,学习和使用起来都很有挑战性。
  • 性能开销:Binder 通信涉及大量的内存复制和上下文切换,这可能会对性能造成影响。
  • 可移植性:Binder 紧密耦合到 Android 系统中,这使得将其移植到其他平台变得困难。

HIDL 应运而生,旨在解决 Binder 的这些缺点。HIDL 是一种简单、高效且可移植的语言,用于定义 HAL 接口。与 AIDL 不同,HIDL 基于 C++,这使其易于学习和使用。此外,HIDL 使用零拷贝机制进行通信,从而消除了 Binder 中常见的性能开销。最后,HIDL 被设计为跨平台的,使其易于在其他嵌入式系统中使用。

HIDL 的优势

与 Binder 相比,HIDL 具有以下主要优势:

  • 简单性: HIDL 基于 C++,这使其易于学习和使用。
  • 效率: HIDL 使用零拷贝机制进行通信,从而消除了 Binder 中常见的性能开销。
  • 可移植性: HIDL 被设计为跨平台的,使其易于在其他嵌入式系统中使用。
  • 安全性: HIDL 提供了额外的安全功能,例如类型安全和内存保护。
  • 可扩展性: HIDL 允许轻松扩展接口,而无需更改现有代码。

使用 HIDL

要使用 HIDL,您需要遵循以下步骤:

  1. 定义接口: 使用 HIDL 语法定义 HAL 接口。
  2. 编译接口: 使用 hidl-gen 工具编译接口定义,生成头文件和存根文件。
  3. 实现接口: 使用头文件和存根文件实现 HAL 接口。
  4. 测试接口: 使用 hidl-test 工具测试 HAL 接口。

示例代码

以下是一个简单的 HIDL 接口示例:

interface IMyInterface {
    void myMethod(int32_t arg1, String arg2);
};

要编译此接口,您可以使用以下命令:

hidl-gen -o . IMyInterface.hal

这将生成以下头文件和存根文件:

IMyInterface.h
IMyInterface.cpp

您可以在自己的 HAL 实现中包含这些文件,如下所示:

#include <IMyInterface.h>

class MyInterface : public IMyInterface {
public:
    Return<void> myMethod(int32_t arg1, const String& arg2) override;
};

结论

HIDL 是一个强大而灵活的语言,用于定义 Android HAL 接口。它比传统的 Binder 机制提供了许多优势,包括简单性、效率、可移植性和安全性。如果您正在开发 Android 系统组件,那么了解 HIDL 至关重要。通过遵循本文中概述的步骤,您可以开始使用 HIDL 并体验它的众多好处。