Fuchsia 组件检查概览

Fuchsia 中的组件可能会公开关于自身的结构化信息 符合 Inspect API 的要求。本文档介绍了 组件检查、接口、C++ 语言实现 以及与组件交互的面向用户的工具 来呈现信息

不知从何下手?

  • 快速入门 - 组件检查入门指南。
  • ffx inspect - 用于检查组件的 ffx 命令。
  • Codelab - 一个使用 C++ 和 Rust 编写的完整的 Codelab。
  • 适用于 C++ 的 API 参考文档, Rust

  • 健康检查 - 描述健康检查子系统。

概念

组件可能会公开 Nodes 树,其中每个节点都有一组 属性

图:节点树

节点

节点是组件中导出的实体, 儿童。每个节点都有一个名称 节点的每个子节点都有一个名称 在子元素中必须具有唯一的名称。

图:节点

属性

节点可以具有任意数量的属性。属性具有字符串键和值 可以是多种类型中的任意一种:

数字类型

  • UintProperty - 64 位无符号整数。
  • IntProperty - 64 位有符号整数。
  • DoubleProperty - 64 位浮点值。
  • BoolProperty - 布尔值。

字符串类型

  • StringProperty - UTF-8 字符串。
  • ByteVectorProperty - 字节矢量。

数组类型

  • UintArrayIntArrayDoubleArray - 相应数字类型的数组。

直方图类型

  • LinearUintHistogramLinearIntHistogramLinearDoubleHistogram

包含存储在数组中的固定大小分区的直方图。

  • ExponentialUintHistogramExponentialIntHistogramExponentialDoubleHistogram

直方图,其中包含存储在数组中的指数大小的分区。

检查文件格式

检查文件格式是一种二进制格式 支持高效插入、修改和删除节点以及 运行时的属性。读者可对内容进行一致的快照 而无需与写手交流

文件系统接口

顶级节点作为组件的传出目录中的 VmoFile 公开 以扩展名 .inspect 结尾。通常,组件会公开 其主树或根树为 out/diagnostics/root.inspect

语言库

C++

C++ Inspect 库提供了完整的编写和 针对检查文件格式提供读取支持。

写入检查数据的组件应避免读取该数据。 读取需要遍历整个缓冲区,成本非常高。

Inspector 类提供了一个用于创建新缓冲区的封装容器 具有一个可添加到的根节点。节点和属性已指定 封装容器,用于从环境中自动删除底层数据 缓冲区空间。

inspect_component 库提供了一个简单的 ComponentInspector 单例接口,有助于解决公开一个单一实例 层次结构。

health 功能支持公开结构化健康信息 采用健康检查工具已知的格式

测试匹配器库提供 GMock 匹配器,用于验证 从测试中的 Inspect 层次结构中读取的数据。

阅读支持

读取库支持解析检查文件 划分到一个层次结构中。Hierarchy 包含 NodeValuePropertyValues,它们是 NodeProperty

HierarchyNodeValuenode() 和子级返回。 children() 会在矢量中返回 HierarchyGetByPath 函数支持按路径读取特定的子级层次结构。

特定 NodeValue 的属性可通过 properties() 访问器。您可以确定房源是否包含 特定类型,方法是将相应的 PropertyValue 类型作为 向 Contains<T>() 方法添加模板参数:

  // Returns true if the first property of the hierarchy's node is an INT value.
  if (hierarchy.node().properties()[0].Contains<IntPropertyValue>()) {
    // ...
  }

使用 Get<T>() 方法获取该属性:

  // Get the IntPropertyValue of the first property on the node.
  // Note: This causes a runtime exception if the property does not contain
  // the given type, crashing the program.
  hierarchy.node().properties()[0].Get<IntPropertyValue>();

您还可以根据不同的可能格式类型进行切换:

  const auto& property = hierarchy.node().properties()[0];
  switch (property.format()) {
    case FormatType::INT:
      const auto& value = property.Get<IntPropertyValue>();
      /* ... */
      break;
    /* ... */
  }

数组类型可以采用特殊的格式来包含直方图。通过 GetBuckets() 方法支持返回直方图分区的数组 从 {Int,Uint,Double}ArrayValue 类型中进行选择。如果存在以下情况,则数组为空: 底层数组不是特殊格式的直方图。

Rust

Rust 检查库提供完整的编写和 针对检查文件格式提供读取支持。

写入检查数据的组件应避免读取该数据。 读取需要遍历整个缓冲区,成本非常高。

Inspector 类提供了一个用于创建新缓冲区的封装容器 具有一个可添加到的根节点。节点和属性已指定 封装容器,用于从环境中自动删除底层数据 缓冲区空间。

component 模块支持简单的 inspector 函数, 处理公开组件中的单个层次结构的常见用法。

health 模块支持公开结构化健康信息 采用健康检查工具已知的格式

testing 模块支持 assert_data_tree! 宏 与“检查数据”匹配,以便进行测试。

测试

验证器架构描述了 Inspect 的集成测试框架 语言库

用户空间工具

要检查组件的检查层次结构,您可以使用 ffx inspect show 命令:

  • 输出所有检查层次结构:

    ffx inspect show
  • 输出特定组件的检查层次结构(例如, core/font_provider):

    ffx inspect show core/font_provider

或运行 ffx target snapshot 来生成包含系统诊断信息的 ZIP 压缩文件, 包含检查:

ffx target snapshot