集成商开发套件 (IDK) 标准

本文档介绍了关于我们在平台源代码树中开发 Fuchsia IDK 的标准。本文档中的某些信息可能让 Fuchsia SDK 的客户感兴趣,但本文档的重点是 Fuchsia 项目如何开发 SDK。

治理

Fuchsia IDK 的内容受 Fuchsia API 委员会约束。IDK 不包含在 Fuchsia 项目之外开发的元素(库、工具、映像等),因为这些库不受 Fuchsia API Council 的管理。

除非外部库已获得 Fuchsia API Council 批准,否则 IDK 中的客户端库不依赖于 IDK 之外的库。通常,委员会不会批准某个依赖项,除非该依赖项具有严格的演变标准(例如,各种受支持语言的标准库)。

示例:Google 测试

Fuchsia IDK 不包含 Google Test 库,因为 Google Test 库的管理由 Google(而非 Fuchsia API Council)提供。

Fuchsia IDK 不依赖于 Google Test 库,因为 Google Test 库的管理机构做出的承诺与 Fuchsia IDK 使用的模型不兼容。

Fuchsia 系统界面

Fuchsia 系统接口在 Fuchsia 系统接口中定义。一般来说,系统的二进制接口只是程序与系统通信所用的 FIDL 有线格式以及 libzircon 中公开的系统调用。

FIDL 协议定义

二进制文件稳定性

FIDL 协议在 SDK 中包含的 .fidl 文件中定义。所有已在 IDK 中发布的 FIDL 定义都应被视为系统的公共 ABI。系统还可能包含尚未在 IDK 中发布的其他 FIDL 定义。这些定义随时可能更改,恕不另行通知;而且依赖其 ABI 的程序在系统的未来版本中可能无法正常运行。

源代码稳定性

IDK 中的 FIDL 定义可能会以与源代码不兼容的方式改进。例如,我们可能会重命名协议中的某个方法,同时保留其序数和语义(可以通过添加设为原始名称的 Selector 属性来维护序数)。此类更改会保留 ABI,但会破坏源代码兼容性。

目前,我们尚无关于何时应破坏源代码兼容性的任何标准。

命名

公共 FIDL 定义位于源代码树的 //sdk/fidl/$LIBRARY_NAME 下。目标名称应为库的名称。

风格

IDK 中的 FIDL 定义应遵循 FIDL API 样式评分准则

客户端库

Fuchsia IDK 包含许多“客户端库”(集成了 IDK 的 SDK 的客户端可以链接到其程序)。所有这些客户端库都是可选的,提供是为了方便客户端,而不是为了方便系统。 系统不得依赖于使用任何特定客户端库的程序。 请注意,libc 是一个客户端库(而不是系统库)。

稳定性和包装

只有 Fuchsia 系统接口能够保持 ABI 稳定。客户端库在 API 和 ABI 上均不稳定。二进制文件和库必须基于与其关联的客户端库相同的 IDK 版本进行构建。

程序在 Fuchsia 系统接口之外链接的所有库(包括客户端库)都必须包含在该程序的软件包中。动态库应放置在程序软件包的 lib 目录中。

软件包是软件移动、交付和关联的单元。不同的软件包可以包含同一库的不同版本。在运行程序时,系统会为该程序提供自己的软件包中的库,从而防止不同软件包使用的不同库在同一程序中发生冲突。

预编译库

Fuchsia IDK 不要求客户端使用特定的工具链。因此,预编译的客户端库必须进行 C 关联。例如,预编译的客户端库无法导出 C++ 符号,因为 C++ 没有跨工具链(甚至工具链版本)的标准 ABI。

依赖项

依赖于某个客户端库的客户端也必须依赖于该库的所有依赖项。因此,客户端库的依赖项应尽可能少。例如,客户端库应避免依赖于 FBL、FXL、FSL 或 SDK 中未包含的其他“基础”库。

需要执行异步操作的客户端库应依赖于 libasync.alibasync-default.so。但是,这些库不应假设客户端正在使用 async_dispatcher_t* 的任何特定实现。例如,这些库不应假设 async_dispatcher_t* 实际上是由 libasync-loop.a 实现的。需要填充 async_get_default_dispatcher 的库应在其文档中说明此要求。

如果预编译的库在其客户端中隐藏,则可以具有更广泛的依赖项。例如,预编译的共享库不应从这些依赖项导出符号,也不应该包含以传递方式包含这些依赖项中的头文件的头文件。

命名

客户端库应根据预期客户端使用的语言进行命名。 例如,$NAME 库的 C++ 变体应位于源代码树中的 //sdk/lib/$NAME/cpp 下。C 变体应位于 //sdk/lib/$NAME 以下。

风格

客户端库应遵循相应语言的 Fuchsia 样式指南。

日志记录

客户端库应避免记录消息。相反,客户端库应将错误返回给客户端,客户端可以决定是否记录错误。

断言

C 和 C++ 客户端库应使用 <zircon/assert.h> 中定义的 ZX_DEBUG_ASSERTZX_ASSERT 来断言不变量。当断言失败时,客户端库还可以使用 _MSG 变体来提供消息。

有关客户端代码的建议

C

Fuchsia 系统接口使用带有 zx_fuchsia_ 前缀的符号,以及带有 ZX_FUCHSIA_ 前缀的预处理器宏。为避免冲突,系统会预留这些前缀,以供 Fuchsia IDK 使用。Fuchsia IDK 的客户端不应声明带有这些前缀的符号或预处理器宏。

C++

Fuchsia 系统接口中包含的 FIDL 协议位于顶级 fuchsia 命名空间中。为避免冲突,此命名空间预留给 Fuchsia IDK 使用。Fuchsia IDK 的客户端不应在顶级 fuchsia 命名空间中声明名称。