创建 FIDL 库

前提条件

本教程要求您已经完成 新手指南,能够构建和运行 Fuchsia。您 应该熟悉 Fuchsia 上的运行组件,这在运行中有所介绍 示例组件

概览

在本教程中,您将定义和构建 FIDL 库 examples.keyvaluestore.baseline。完成后,您将了解如何创作 FIDL 文件,设置必要的 GN 规则,并构建 FIDL 绑定。

此教程的完整源代码可在以下位置找到: //examples/fidl/new/key_value_store/baseline/fidl/

定义 FIDL 库

首先,运行以下命令为本教程创建一个目录 在紫红色结账过程中进行查看:

mkdir -p vendor/fidl-tutorials/building-fidl

创建一个新文件 key_value_store.test.fidl

touch vendor/fidl-tutorials/building-fidl/key_value_store.test.fidl

FIDL 文件名使用 .fidl 扩展名。与 C 头文件类似,FIDL 文件 定义数据类型并声明功能接口。这些声明用于 与特定于 FIDL 的数据类型结合使用,以在 FIDL 端点之间进行通信。

将以下 FIDL 代码添加到 key_value_store.test.fidl

// Copyright 2022 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
library examples.keyvaluestore.baseline;

/// An item in the store. The key must match the regex `^[A-z][A-z0-9_\.\/]{2,62}[A-z0-9]$`. That
/// is, it must start with a letter, end with a letter or number, contain only letters, numbers,
/// periods, and slashes, and be between 4 and 64 characters long.
type Item = struct {
    key string:128;
    value vector<byte>:64000;
};

/// An enumeration of things that may go wrong when trying to write a value to our store.
type WriteError = flexible enum {
    UNKNOWN = 0;
    INVALID_KEY = 1;
    INVALID_VALUE = 2;
    ALREADY_EXISTS = 3;
};

/// A very basic key-value store - so basic, in fact, that one may only write to it, never read!
@discoverable
open protocol Store {
    /// Writes an item to the store.
    flexible WriteItem(struct {
        attempt Item;
    }) -> () error WriteError;
};

此 FIDL 定义了一个 Item 类型,用于表示商店中的商品,即 WriteError 用于列出已知写入错误的枚举,以及包含一个方法的 Store 协议: WriteItem。正如所定义,此库只能将值写入存储区,但 键值存储示例系列,您将扩充此库以支持 嵌套存储、读取值和其他功能。

为 FIDL 库创建 GN 目标

现在您已经定义了 FIDL,接下来需要创建一个 gn 目标, 代码可能依赖的方面。

创建一个新文件 BUILD.gn

touch vendor/fidl-tutorials/building-fidl/BUILD.gn

并添加以下构建规则:

# Copyright 2022 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import("//build/fidl/fidl.gni")

# Builds the FIDL library into a set of language specific bindings. Bindings for a given language
# may be imported by depending on this target, followed by a language-specific underscore:
#
#   ":examples.keyvaluestore.baseline_rust"
#   ":examples.keyvaluestore.baseline_cpp"
#   ...and so on
#
fidl("examples.keyvaluestore.baseline") {
  sources = [ "key_value_store.test.fidl" ]
  excluded_checks = [ "wrong-prefix-for-platform-source-library" ]
}

gn 模板 fidl("examples.keyvaluestore.baseline") 创建必要的目标,以便从其他代码中使用此库。

编译 FIDL 库

如需构建新的 FIDL 库,请运行以下 fx set 命令:

fx set core.x64\
  --with //vendor/fidl-tutorials/building-fidl:examples.keyvaluestore.baseline_rust\
  --with //vendor/fidl-tutorials/building-fidl:examples.keyvaluestore.baseline_cpp

此命令会配置 fx build 以生成 Rust 和 cpp 绑定。

接下来,构建代码:

fx build

探索生成的绑定

现在代码已构建完毕,您可以浏览为 绑定。如需查看生成的代码,请浏览以下目录:

绑定类型 目录
铁锈色 //out/default/fidling/gen/vendor/fidl-tutorials/building-fidl/examples.keyvaluestore.baseline/rust/
新 C++ //out/default/fidling/gen/vendor/fidl-tutorials/building-fidl/examples.keyvaluestore.baseline/cpp/fidl/examples.keyvaluestore.baseline/cpp/

如需了解详情,请参阅生成的代码

后续步骤

现在您已经学完了本教程,接下来可以探索 键值对存储区示例系列