Fuchsia F29 版本说明

日期:2026 年 1 月 7 日

版本:F29

音频

我们针对智能显示屏中的音频进行了以下平台更新:

  • 扩展了 AudioCore 和 Driver Inspect 可观测性。检查数据现在包括 RoleManager 错误,以便更好地诊断过去的故障;跟踪每个环形缓冲区的最小/最大/总和/溢出/欠载指标;并保留最近的任务记录。

我们针对其他产品进行了以下平台更新:

  • 增强了音频设备注册表 (ADR) 的性能和可靠性。ADR 线程现在利用调度程序配置文件来提高负载下的流建立性能。此外,ADR 现在还支持没有环形缓冲区的拓扑、在环形缓冲区创建失败时进行重试,并正确考虑了环形缓冲区内存报告中的驱动程序过度分配。

  • 改进了 ffx audio 工具功能。ffx audio device play 命令现在使用调度程序配置文件和更大的环形缓冲区,以实现无故障播放验证。该工具现在还会在设备列表中显示 ADR token_id,并包含针对计算下溢的修复。

  • 更新了信号处理拓扑规则。SDK 现在允许 DAI_INTERCONNECT 元素在拓扑中进行自引用,从而支持独立 DAI 配置。

蓝牙

针对蓝牙进行了以下更新:

  • 扩展了免触摸操作配置文件 (HFP) 的功能并提升了稳定性。添加了对“查询当前通话”(AT+CLCC) 过程的支持,并添加了对 HF 发起的通话转移的处理。通过解析非标准 iOS 响应字段来提高互操作性,并通过 SCO 设置重试、断开连接跟踪修复和编解码器更新期间的竞态条件处理来增强连接稳定性。

  • 实现了 A2DP 分流支持和程序集配置。启用 A2DP 硬件分流功能(首选 44.1kHz),允许控制器或音频子系统处理音频编码。将 A2DP 配置迁移到平台组装,添加了针对特定产品替换供应商版本的功能,并清理了源代码构建器。

  • 添加了对 LE 音频同步 (ISO) 通道的支持。更新了 UART 驱动程序,以支持 ISO 数据通道,并实现了对已连接的同步组 (CIG) 和流 (CIS) 的核心主机支持。这为低能耗音频功能奠定了基础。

  • 引入了定期通告同步支持。添加了主机端支持,以同步到周期性广告序列,包括新的 FIDL 接口 (SyncToPeriodicAdvertising) 和内部管理类,用于处理同步请求和扫描。

  • 增强了蓝牙命令行工具。添加了 ffx bluetooth controller listshow 命令,以实现更好的设备管理。更新了 bt-le-central,以支持音量控制服务 (VCS) 和已发布的音频功能服务 (PACS),并引入了用于控制 LE 音频广播的新工具 bt-broadcast-assistant

  • 更新了 Broadcom 固件和初始化逻辑。将 SYN4381 固件升级到版本 1195.1225。添加了安全检查,以防止在无法读取 MAC 地址时进行驱动程序初始化,并修复了 Android 供应商扩展广告行为。

  • 优化了快速配对配置路由。改用专用的快速配对提供程序配置功能来确定可用性,替换了软件包解析逻辑,以减少错误并简化系统路由。

  • 扩展了 Pandora 测试界面功能。为 Pandora 测试框架添加了多项功能,包括 GATT 服务注册、配对事件排队、发现控制、连接设置,以及改进的广播超时处理。

构建

针对 build 进行了以下更新:

  • fx build 中的实验性 Bazel 支持。fx build 中添加了一项实验性功能,可直接为宿主目标调用 Bazel。此版本引入了三种 build 模式:GN(默认)、Bazel 和 Fint,并添加了实参验证和调用日志记录。

  • 移除了 macOS 主机 build 支持。已从 build 规则、IDK 和配置文件中移除对使用 macOS 作为宿主操作系统构建 Fuchsia 的支持。

  • 构建日志的新根位置。所有 build 日志现在都存储在 out/.build_logs 中,以改进组织和调试。添加了新命令 fx build-logs 来管理此目录结构。

  • 构建性能优化功能。针对 RBE 下载和本地操作实现了 xattr 哈希处理,以跳过不必要的重新哈希处理,并向 Ninja 添加了边缘权重提示,以优化长时间运行的操作的调度。

  • 按需生成 GSYM 符号。更新了 export_last_build_debug_symbols,以支持使用 --with-gsym-symbols 标志按需生成 GSYM 符号。

  • 自动构建资源分析。构建系统现在默认以 1 Hz 的间隔收集 CPU 使用情况和网络数据,以帮助调试缓慢的构建性能。

  • 针对 sdk_shared_library 强制执行了标头结构。定义为 sdk_shared_library 的目标现在必须将公共头文件放置在严格定义的目录结构中(通常在 include/ 下)。

钴蓝

Cobalt 进行了以下更新:

  • Java 指标 ID 类型更新 Java 源生成器现在将 uint32 指标 ID 声明为 int,而不是 long。这与 Cobalt 日志记录 API 保持一致,并消除了在客户端代码中进行显式转换的需要。

  • 事件记录器验证更新:事件记录器现在接受包含不可能的区间的零计数的直方图。这样可以防止拒绝由包含零计数的不可能区间的采样器生成的密集向量。

组件框架

针对组件框架进行了以下更新:

  • 重构了 Realm Builder 的字典 API,以使用 DictionaryRef这统一了字典的路由语法,使操作与 CML 模式保持一致,并提高了直观性。

  • Realm Builder 和 SDK 中新增了扩展存储空间功能。StorageAdmin 协议已升级为 fuchsia.component 以供 SDK 访问,并且向 Realm Builder 添加了新的 AddStorage 函数,以实现程序化存储路由和配置。

  • 增强了 ffx component explore 工具的发现功能。该工具现在利用 fuchsia.dash.launcher-tool-urls 分面在探索期间自动将特定于组件的工具加载到 PATH 中。

  • 改进了 cmc 错误报告功能。编译器现在会在失败时抑制内部回溯,并在合并的输出中包含源文件路径,以便更轻松地进行调试。

  • 修复了 fuchsia.component/Controller.Destroy 中的竞态条件。该操作现在可确保销毁任务拥有响应者,从而防止在组件完全销毁之前出现过早的成功响应。

  • 提高了服务连接可靠性。服务代理现在使用 wait_for_first_instance 处理临时实例,并正确地将服务目录转换为闲置状态。

  • 为 fidl_next_services 添加了 Rust 绑定。为 fuchsia_component 添加了函数,以便在使用 fuchsia_next 绑定时连接到服务并提供服务。

诊断

针对“诊断”功能进行了以下更新:

显示

以下是针对展示广告所做的更新:

驱动程序框架

针对驱动程序框架进行了以下更新:

  • 强化了 Rust 驱动程序 (fdf) 中的异步读取取消逻辑,以防出现竞态条件。该实现现在可以正确处理同步和非同步调度程序上的读取取消,并确保在注册了 await 时通道会延迟关闭,从而防止出现 use-after-free 或竞态条件。

  • 增强型 ffx driver node graph 更新了 ffx driver node graph,以支持过滤、服务路线可视化、驱动程序主机分组和交互式 HTML 图表生成。

  • NodeAddArgs 中的字典支持:向 NodeAddArgs 添加了 offers_dictionary,使驱动程序能够通过字典(而非父节点的传出目录)向子节点提供服务。

  • Rust 绑定中的安全异步取消:为调度程序上的渠道等待实现了安全异步取消,以防止在丢弃具有待处理回调的渠道时出现竞态条件。

  • DriverStartArgs 中添加了自定义 VMAR 支持:向 DriverStartArgs 添加了 vmar 以允许传递非根 VMAR,并向驱动程序组件添加了 VMAR 访问器。

  • 节点控制器中的 WaitForDriver 方法 向节点控制器添加了 WaitForDriver,允许客户端等待驱动程序在节点或复合父级上启动。

  • Rust 绑定中的驱动程序传输支持:在 Rust 绑定中为驱动程序传输实现了令牌转移协议和连接逻辑。

  • 更新了驱动程序管理器以使用临时集合。与组件框架的互动已重构为使用临时集合,同时进行了属性存储优化,以减少内存用量。

  • MetadataServer 库重构 重构了 MetadataServer 以简化初始化、弃用旧版 setter、支持有条件的元数据服务,并接受服务目录以进行测试。

  • 改进了驱动程序日志记录:为驱动程序管理器添加了基于 std::format 的日志记录 API,在 ffx driver (non-TTY) 中启用了 PID 打印,并改进了 sys_driver FIDL 错误日志记录。

  • 驱动程序运行时和传输更新:在 SDK C++ 绑定中添加了同步令牌转移接收器、强制执行调度程序关闭回调、优化了停滞轮询,并启用了早期句柄转移。

  • 移除已弃用的 API(级别 26 之前)从音频驱动程序接口和常规驱动程序 SDK 中移除了在 26 之前的 SDK 版本中已弃用的 API。

FIDL

针对 FIDL 进行了以下更新:

  • 为 FIDL 引入了 Bazel 构建规则。向 Bazel 构建系统添加了 fidl_libraryfidl_irfidl_summary 宏,以便直接在 Bazel 项目中定义 FIDL 库、生成 IR 和创建 API 摘要。

  • 改进了 Rust 绑定的工程学和功能。通过以下方式改进了开发者人机工程学:从协议定义派生默认传输,引入 RespondRespondErr 特征以简化响应处理,为数组启用 WireVector 编码,并添加 IntoNatural 以实现更好的类型转换。

  • 改进了 Rust 绑定验证和正确性。加强了运行时验证,以确保线格式正确性,包括检查结构体填充、字符串和向量限制以及信封标志。还改进了对未知互动和空结构的处理。

  • Rust 绑定中的专用句柄子类型。更新了 Rust 绑定,以生成特定的句柄子类型(例如,zx::Channel),而非泛型 zx::Handle 类型,从而提高 FIDL 协议的编译时类型安全性。

  • 重构了 Rust 绑定的异步和传输处理。通过引入 TwoWayFuture(用于可拆分 future)、简化连接关闭处理、将内部客户端/服务器概念重命名为调度程序,以及为端点生成添加执行器特征,对异步基础架构进行了全面改进。

  • C++ 绑定清理和功能检测。将 C++ 功能检测整合到 lib/fidl/cpp/features.h 中,并移除了对 std::aligned_storage 的依赖,以符合现代 C++ 标准。

  • 对 FIDL Rust 绑定进行了重大的人体工程学和类型安全改进。引入了 IntoNatural 特征,以实现更清晰的类型转换,并通过 RespondRespondErr 特征改进了响应人体工程学。现在可以更具体地处理 Fuchsia 句柄子类型。发送者和调度程序已重命名并重新整理,并且移除了 EncodableEncodeRef 特征,最终确定了向新的编码方法迁移。

反馈

我们针对反馈功能进行了以下更新:

  • 添加了对关机操作的跟踪。LastRebootInfoProvider 协议现在包含一个 action 字段,用于区分特定的关机类型(例如,“REBOOT”与“POWEROFF”),通过迁移到 JSON 存储和 ShutdownWatcher 持久性来支持。
  • 优化了内存使用情况。通过缩短 JSON 序列化对象的生命周期,并在日志流式传输停止且组件处于空闲状态时强制清除 Scudo 内存,减少了内存占用。
  • 移除了已弃用的 API。移除了 GetScreenshot 协议(已在 F26 中弃用),并将 annotations 字段替换为 annotations2,从而为客户端强制实施更高的限制。
  • 改进了崩溃报告上传逻辑。成功的急切上传现在会发出网络可达性信号,从而立即尝试上传之前缓存的报告。
  • 重构了配置和程序集。flash_ts_feedback_id_component_url 迁移到 feedback_id_component_url,添加了缺少的 i18n/取证路由,并移除了 DisableWaitForInitialInterest 解决方法。

固件

固件进行了以下更新:

  • 启动测试产品软件包现在包含并正确配置了恢复(R slot)映像。现在,R slot 映像已明确包含在启动测试软件包中,以支持需要它们的主板。此外,这些映像现在使用正确的恢复主板配置,而不是标准配置,从而确保生成有效的映像。

  • 更正了恢复出厂设置 TEE 协议的路由逻辑。factory_reset 使用的 tee 协议现在会在 tee_manager 未公开这些协议的 build 上路由到 void,从而防止在组件初始化期间出现路由错误。

图形和 GPU

针对图形和 GPU 进行了以下更新:

  • 将 Goldfish Pipe 驱动程序迁移到了驱动程序框架 v2 (DFv2)。此次大规模更新包括将 ddk::IoBuffer 替换为 dma_bufferfzl::OwnedVmoMapper、将总线协议处理移至父 PipeDevice 以更好地反映硬件拓扑,以及强制执行更严格的 PipeChildDevice 角色分离。
  • 将编译时 PAGE_SIZE 常量替换为运行时确定。 为了与 RFC 0016 保持一致并支持启动时页面大小配置,ZX_PAGE_SIZEPAGE_SIZE 常量已从 SDK、图形和界面组件中移除,这要求客户端在运行时查询页面大小。
  • 向界面堆栈添加了 PowerModeVsyncSource 协议。PowerMode API 使用精细的 Doze 状态信息取代了二进制开/关开关,而 VsyncSource 使客户端能够直接订阅显示硬件的垂直同步信号。
  • 在 x64 上从 Intel Vulkan ICD 过渡到 Lavapipe。为了简化维护,Intel Vulkan ICD 已被移除,现在由 Lavapipe 软件光栅化器处理 x64 配置上的 Vulkan 工作负载。
  • virtio-gpu 中启用了 blob 资源支持。此增强功能使驱动程序能够使用 blob 资源直接从 guest 内存执行扫描输出,从而在使用 Lavapipe 帧缓冲区时消除不必要的复制操作。
  • 将 ARM Mali 驱动程序更新到了版本 r54。此驱动程序更新带来了对 Vulkan 1.4 的支持。
  • 改进了 msd-vsi-vip 的稳定性和重置逻辑。修复包括在重置期间停用脉冲吞噬器、确保适当的等待时间,以及解决在测试周期内观察到的硬件挂起问题。

本地化

针对 I18n 进行了以下更新:

  • 为 ICU 77.1 添加了 Rust 绑定。更新了 rust_icu_sys,以支持 ICU 版本 77.1 的集成和发布。

IoT、Matter 和 Thread

我们针对 IOT、Matter 和 Thread 进行了以下更新:

  • Thread 遥测增强功能:扩展了 telemetry.fidl 和 Inspect,以包含 extended_pan_id(用于网络识别)和 multi_ail_detected(用于报告与多个相邻基础设施链路的连接)。

  • OpenThread 堆栈升级:将 OpenThread 库、RCP 映像和 Rust-C 绑定更新为 2025 年 10 月 1 日版本,并实现了 otPlatDnsIsUpstreamQueryAvailable 以改进 DNS 解析器状态跟踪。

  • 广告代理和服务发现修复:解决了 mDNS 发布结果未报告的问题,修复了服务删除的 UpdateId 处理,并更正了边框代理 TXT 记录格式。

  • TREL 和 MeshCoP 优先级 修改了 TREL 地址选择,以优先选择唯一链路本地地址而非全球单播地址 (GUA),并更新了 MeshCoP 以优先处理供应商 TXT 条目。

Netstack

针对 Netstack 进行了以下更新:

  • 套接字诊断 API 和 fuchsia.net.matchers 添加了 fuchsia.net.sockets FIDL 库,以提供套接字诊断功能,并引入了 fuchsia.net.matchers 来统一数据包过滤和诊断 API 中的匹配器类型。

  • Netstack3 TCP 性能和 RFC 合规性改进:为 TCP 缓冲区实现了延迟分配,以减少内存占用。通过以下方式增强了 RFC 合规性:强制执行 216 的最小 MSS、随机化 TCP 时间戳偏移量、在空间允许的情况下无条件发送 TCP 选项,以及修复窗口更新期间的 SACK 块处理。

  • Netlink 稳定性和安全性增强 通过针对 NETLINK_ROUTE 操作强制执行 CAP_NET_ADMIN 并验证 IFA_CACHEINFO 等属性的缓冲区大小,增强了 Netlink 安全性。通过延迟消息解析并修复由未知消息或路由移除竞态条件引起的 panic,提高了稳定性和兼容性。

  • 路由和接口管理增强功能 更新了 netcfg,以通过 Netlink 支持接口本地路由表,并为本地配置的设备安装规则。移除了 copy_routes_to_main_table 解决方法,修复了 Netlink 中的 default_metric 填充问题,并调整了 WLAN 接口行为,使其在断开连接时保持管理上的启用状态。

  • DHCP 客户端和邻居发现改进:通过允许重复选项并防止在 DHCPRELEASE 数据包格式错误时出现 panic,提高了 DHCP 客户端的稳健性。通过以下方式增强了邻居发现功能:舍弃无效的征求消息、处理缺少链路层地址的通告,以及正确管理通告和 ARP 回复的 Override 标志。

  • 可达性计算更新:改进了可达性计算,以便正确区分网关和默认路由检测的 IPv4 和 IPv6 协议专用路由。在移除接口后,防止了虚假的状态更新。

  • 安全性和可靠性修复 针对 SO_REUSEPORT 强制执行 user_id 验证,以将端口重用限制为同一用户拥有的套接字。在以太网设备上启用了 MAC 多播过滤,以尽早丢弃不需要的帧,并修复了 ICMP 回显错误处理程序中的崩溃问题。

平台驱动程序

针对平台驱动程序进行了以下更新:

  • SDHCI 驱动程序已迁移到 FIDL SDMMC 协议。此现代化更新会更新驱动程序以使用当前的 FIDL 标准,从而替换旧版接口。请注意,此模式目前不支持带内中断。

  • 改进了 SDHCI 驱动程序在停止序列和中断方面的稳定性。 驱动程序现在通过在 PrepareStop 期间等待待处理的请求完成来防止 BTI 错误,并通过优先处理传输完成中断而不是数据超时来避免出现竞态条件。

  • 修复了 USB CDC 功能驱动程序中的数据停滞问题。现在,当端点被停用时,待传输的交易会正确取消,从而防止交易无限期地停留在待处理列表中。

  • 针对多个生产者和数据包标头,改进了 usb_vsock 的可靠性。修复包括:在多生产者场景中正确唤醒所有感兴趣的唤醒器,从而解决挂起的连接;以及更正暂停数据包中的载荷长度,以防止标头损坏。

  • DWC3 USB 驱动程序现在可以可靠地处理 VBUS 信号和核心重置。 驱动程序在支持的平台上主动管理 VBUS 有效信号,并在开机期间切换核心重置,以确保正确初始化。

  • 添加了新的复合 USB 外围设备配置。现在,我们推出了支持 CDC、ADB 和 Fastboot 功能的新复合设备配置文件。

  • GPIO 和 I2C 核心驱动程序现在会转发 PowerTokenService此更新通过将服务从父实现驱动程序转发到子节点,有助于更好地集成电源管理。

电源管理

针对电源管理进行了以下更新:

  • 电池管理器重新架构和工具 电池管理器已恢复,可通过 FIDL 连接驱动程序,为电池信息提供集中式点。此更新引入了 batteryutil CLI 工具、用于充电控制的新 FIDL API,以及 BatteryInfo 中的 average_current 字段。行为变更包括在设备充电时阻止挂起,以及根据关机偏移量调整电池电量。

  • Power Broker API 合并 LevelControl API 已从系统和 ElementSchema 中移除,要求所有集成迁移到 ElementRunner。这简化了电源元素管理的 API surface。此外,还解决了相关声明的声明排序方面的竞态条件。

  • 可观测性和状态记录器 SDK:新的状态记录器库(C++ 和 Rust)已移至 SDK,以标准化数字和离散电源状态记录。通过以下方式,系统挂起调试功能得到了显著改进:将唤醒原因(包括 Koid)向上传播到调用堆栈,向 fuchsia.hardware.power.suspend 添加唤醒源报告,以及在检查数据中跟踪长时间持有的唤醒租约。

  • API 弃用和移除ActivityGovernorListener 接口已移除,完成了向 SuspendBlocker 的迁移。此外,fuchsia.power.systemmode FIDL 库已正式弃用。

  • 新的温度传感器管理 APIpower-manager 中实现了 fuchsia.thermal.SensorManager API,允许客户端发现温度传感器并注入替换温度以进行政策测试。还向热 sysfs 目录添加了对 emul_temp 的支持。

  • 内核和驱动程序电源功能:为运行时处理器电源管理 (RPPM) 添加了配置功能,并将其路由到基本驱动程序。更新了通用闪存 (UFS) 驱动程序,以使用标准挂起/恢复注册,从而移除了旧版唤醒请求行为。

  • 关闭原因传播shutdown-shimAdmin 协议中添加了 Shutdown 方法,使客户端能够指定不同的关闭原因和操作(例如,重新启动与关机)。还部署了针对在关停序列期间过早停止 critical-services 的修复。

  • Power CLI 和平台配置 引入了新的 powerutil CLI 工具,并将 ffx power 迁移为使用该工具的实现。为 fuchsia.power.cpu.BoostEnabled 和 Android 电源提示添加了新的平台配置,同时重构了存储电源管理启用,使其特定于主板。

  • 电源管理更新:在检查数据中添加了对长唤醒租用阈值的支持,为时钟/PMIC 和 CPU OPP 定义了 pdev 接口,并改进了挂起阻止程序逻辑。

Rust

针对 Rust 进行了以下更新:

  • fuchsia-async 添加了插桩钩子并优化了内存使用情况。 支持在宏和 AtomicFuture 上使用可插拔的插桩钩子,从而在停用时实现更好的诊断,而不会产生开销。此外,该库还使用自定义实现替换了基于 crossbeam epoch 的延迟执行,以显著减少内存用量。

  • 旧版 fuchsia-async 任务创建方法已被移除或内部化。此变更完成了任务创建和执行 API 向构建器模式的迁移,需要更新仍在使用旧方法的代码。

  • Rust 构建工作流已更改,移除了 fx rustfmt/fx rustdoc 并启用了发布符号。已移除废弃的 fx 命令,以支持标准工具链工作流。现在,默认情况下,调试符号会保留在发布二进制文件中,以便更好地对发布 build 进行符号化和调试。

软件交付

我们针对软件交付进行了以下更新:

  • 增强了 Android 恢复和旁加载功能。恢复系统现在支持直接从 ADB 旁加载读取清单签名和更新网址、处理相对 blob 基本网址,以及在更新期间正确装载系统 blob。

  • 改进了系统更新安全性和配置。系统更新程序现在使用通过程序集配置的公钥验证 OTA 清单签名,并支持用于无软件包更新的可选签名参数。

  • 针对软件包解析器的优化和诊断。现在,pkg-cache 中允许为基本软件包固定解析,以减少内存用量。此外,为了减少垃圾信息,成功的解析现在会记录在检查中,而不是系统日志中,并且 system-updater 检查现在包含正在进行的更新尝试 ID。

  • 更新了对 Paver 和 Moonflower 板的支持。添加了对合并“super”和“userdata”分区的支持,在 Moonflower 上铺设任意分区,并修复了严重的 A/B/R GUID 同步 bug。移除了对 Moonflower 的旧版 A/B 支持,并改进了分区表重置的错误处理。

  • 可配置的 Blob 网络超时。现在可以通过配置功能替换 pkg-resolver 中的 Blob 网络标头和正文超时,并且增加了恢复中的默认超时时间,以提高可靠性。

  • 更新通知程序现已可供发现。fuchsia.update/Notifier 标记为可发现,以便与可托管的组件搭配使用,从而在退出时方便地转移到组件管理器。

  • 改进了软件包清单工具。软件包清单现在以美观的 JSON 格式编写,以便更轻松地进行比较,并且向 fuchsia-pkg 添加了 set_name API,以允许动态更改名称。

  • 支持锚定软件包。已向软件包管理库和程序集工具添加对锚定软件包的初始支持,并使用 BTreeMaps 来确保确定性序列化。

Starnix

针对 Starnix 进行了以下更新:

  • 在 SELinux 强制执行方面取得了显著进展,实现了对 Binder、Netlink 和文件系统权限的检查。这包括强制执行 binder(调用、转移、模拟)、netlink 扩展权限 (nlmsg)、ptracegetcap/setcap 的权限,以及各种文件/套接字访问检查(file_receivesocket_acceptgetattr)。

  • 已实现 SELinux 审核框架,包括对 audit_access 伪权限的支持。这样就可以通过 dontaudit 规则抑制审核日志垃圾信息、对日志中的特殊字符进行十六进制编码,以及通过内核命令行进行配置。

  • 改进了 ARM 解栈。添加了对 ARM EHABI、ARM.extabARM.exidx 和 sigreturn 解开的支持。实现了对 32 位/64 位过渡帧的处理,以支持 Starnix 配置文件。

  • 现在支持 PTRACE_POKEDATAPTRACE_POKETEXT,允许跟踪器修改被跟踪进程的内存。这样,Linux 调试器(如 LLDB)便可在 Starnix 内运行的程序中设置软件断点。

  • 通过 recvmsg 缓冲区选择和其他设置标志,io_uring 支持已得到扩展。IORING_OP_RECVMSG 现在支持 IOSQE_BUFFER_SELECT,并为 IORING_SETUP_DEFER_TASKRUNIORING_SETUP_SINGLE_ISSUERIORING_REGISTER_RING_FDS 添加了桩或实现。

  • clone()/clone3() 实现了 CLONE_PIDFD,并改进了 pidfd_open 行为。此更改添加了在创建时接收表示子进程的文件描述符的功能,并修复了 pidfd_open 处理僵尸进程的问题。

  • 添加了 ffx starnix kill 命令。此工具允许用户从宿主机终止 Starnix 容器内的进程。

  • 已向 timerfd 添加对 TFD_TIMER_CANCEL_ON_SET 的支持。此标志允许监控 UTC 时间轴的间断性变化(例如,通过 clock_settime)。

  • 文件描述符表 (FdTable) 已迁移为使用 Read-Copy-Update (RCU)。这样一来,多个线程可以同时读取文件描述符,而不会发生阻塞,从而提高并发性。

  • 通过直接引用 MemoryManager,改进了 /proc/<pid>/mem 的安全性。这样可确保文件描述符在打开时与特定地址空间相关联,从而防止在 exec() 调用更改任务的内存布局和凭据后发生未经授权的访问。

  • eBPF 现在支持 LPM(最长前缀匹配)Trie 映射。这会添加 BPF_MAP_TYPE_LPM_TRIE 地图类型,该类型通常用于网络任务。

  • 通过 SO_BINDTODEVICE 检查和运行时通用 Netlink 支持,扩展了网络功能。此版本添加了套接字设备绑定的功能检查,并允许在运行时添加 Genetlink 系列。

  • KGSL 驱动程序现在支持 32 位应用。此更新可提高 32 位 Android 图形工作负载的兼容性。

  • Starnix 支持功能:计时器现在支持 TFD_TIMER_CANCEL_ON_SET 来监控 UTC 时间轴变化。通过以下方式增强了调试功能:在 ARM 架构的信号堆栈帧中填充故障地址,以及在调试/平衡 build 中添加用于跟踪信号来源的逻辑。

  • Starnix VFS 性能和内存用量已得到优化。文件描述符表 (FdTable) 现在使用 Read-Copy-Update (RCU) 同步进行并发读取,并且挂载元数据字符串现在使用 FlyByteString 来减少繁重的挂载工作负载的内存开销。

存储

存储空间方面进行了以下更新:

  • 块服务器现在支持驱动程序端解压缩,并由 Blobfs 使用。这样可以避免使用外部解压缩器,从而提高性能,并为将来基于驱动程序的网页请求处理提供可能。

  • 现在,在内存压力下,Fxfs 脏页清理更加高效。 Fxfs 现在仅选择性地刷新具有脏页的文件,而不是在关键内存压力期间阻塞 ZX_PAGER_VMO_DIRTY 请求时检查所有文件的元数据。

  • Fxfs 现在支持通过新的 VolumeInstaller 协议进行原子卷安装。这有助于在文件系统级别安装新的系统映像,并允许以原子方式替换现有卷。

  • 只读 Ext4 文件系统现在会公开扩展属性。用于列出和查询扩展属性的 API 已移至 Directory 接口,以支持 ext4readonly 中的相应实现。

  • 添加了对数据卷加密的 Keymint 支持。新的 keymint 政策允许 fshost 使用 Keymint 密封数据卷的密钥并将其持久保存到密钥库,从而在可用时实现 TEE 支持的密钥管理。

  • 对 UFS 驱动程序进行了重大改进。这包括实现 fuchsia_hardware_ufs::Ufs 协议、添加对向 UFS 设备发送 SCSI 命令的支持,以及通过移除唤醒请求行为来优化电源管理,转而使用标准挂起/恢复钩子。

  • Fxfs 安全性和加密功能已得到增强。更改包括:在打开时验证 fsverity merkle 树根哈希以防止未经授权的修改;在硬件允许的情况下支持内嵌加密;以及支持 lblk32 密钥。

  • Blobfs 已迁移到版本 10,以支持混合 merkle 布局。这引入了 inode 和超级块标志来确定 Merkle 格式,从而有助于在格式之间进行迁移,而无需立即更改磁盘布局。

  • 提高了 SDMMC 和 RPMB 驱动程序的可靠性。现在,大型 RPMB 写入操作会根据设备支持情况分成多个块,并且如果调谐失败,eMMC 初始化现在会回退到高速或 DDR52 模式,从而防止在有问题的硬件上出现启动失败。

  • 多个存储驱动程序已迁移到驱动程序框架 v2 (DFv2)。此现代化包括 nandram-nandnandpartbootpart 驱动程序。

测试

针对测试进行了以下更新:

  • 扩展了 fx test 标志和开发者功能。添加了 --[no-]fail-by-group 以切换测试组的重试、--previous failed-tests 以生成用于重新运行失败测试的命令,以及 test_filters 标志。该工具现在会在列出测试时自动启动软件包服务器,支持搜索远程 build 测试,使用 --use-existing-debugger 有条件地生成调试器,并刷新设备测试的软件包列表。

  • 添加了实验性 ResultStore 集成。通过 fx resultstore 启用了向 ResultStore 的流式构建结果,添加了 Ninja 封装容器 (rsninja.sh) 和客户端工具 (rsclient),以改进构建数据可视化。

  • 将 Antlion 迁移到了 fuchsia.git将 Antlion 代码库从 //third_party/antlion 移至 //src/testing/end_to_end/antlion,以简化开发者工作流程并提高测试编写速度。

  • 更新了 Honeydew (Lacewing) API。wlan affordance 重命名为 wlan_core,以将其与政策 API 区分开来;添加了对 PowerBAT 挂起/恢复的 USB 支持;引入了系统接口查询;并为本地主机-目标互动启用了目标名称。

  • 重构了测试输出解析基础架构。从常规解析器中移除了网络一致性测试解析,将 Rust 和 Go 测试解析逻辑分离到不同的工具中,并更新了测试运行程序,使其严格要求输出摘要架构中包含 TestResult

  • 为宿主-目标测试实现了 mDNS 解析器。添加了一个设备解析器,该解析器利用 botanist 的 mDNS 数据包检查器来跟踪目标,而无需依赖 ffx 进行解析。

  • 更新了 sockscripter 实用程序。添加了 log-error 命令以读取 SO_ERROR 套接字选项,并启用了发送缓冲区长度的配置。

  • 扩展了 tefmocheck 日志分析功能。添加了以下支持:根据日志行的邻近程度检测失败模式;在附近的检查中跳过测试;检测 ADB 服务器重启。

  • fxtest 中移除了 get-ssh-address已弃用并移除了 get-ssh-address 子命令;用户现在必须使用 ffx -t target target list --format addresses

  • 引入了边沿触发的音频捕获支持。audio_recording 组件中实现了一种新的捕获方法,允许客户端对未来的捕获进行排队,并在检测到静音时立即停止录制,从而提高了可靠性和速度,优于固定时长的录制。

计时

针对时间管理功能进行了以下更新:

  • 新增了对基于世界协调时间 (UTC) 的唤醒闹钟的支持。时间管理子系统和唤醒闹钟管理器现在支持在 UTC 时间线上安排闹钟,从而为 Starnix 启用实时时钟功能。此更改引入了 SetAndWaitUtc,这是一种使用挂起获取模式的 FIDL 方法,可满足容器电源管理要求。

  • 强化了闹钟调度和时长逻辑。修复了闹钟管理中的多个极端情况,以确保可靠性:零 tick 唤醒闹钟现在填充为 1 tick,以保证协议执行;负持续时间默认设置为最小时间单位;重新安排逻辑现在可以正确取消过时的计时器;并修正了 TimerNode 比较逻辑。

  • 防止了在截止日期附近出现错误的 UTC 更新。系统现在会根据 build 截止时间验证 UTC 更新,拒绝截止时间前一小时内的任何值,以防止因实时时钟 (RTC) 硬件故障而导致系统时间无效。

  • 在 Zircon 时钟转换中强制执行非零速率。transform_clock 函数和 ClockTransformation 方法现在会在提供零速率时进行断言和 panic,确保立即捕获无效的时钟速率配置。

  • 已命名的 UTC 时钟句柄。现在,UTC 时钟句柄被分配了名称 utc-clock(和 utc-clock-vendor),以帮助进行句柄来源跟踪和调试。

工具

我们针对工具进行了以下更新:

ffx

针对 ffx 进行了以下更新:

  • ffx trace 已重新设计,以移除跟踪守护程序协议。 该工具现在直接连接到目标(通过 SessionManagerProxyProvisionerProxy),而不是通过守护程序进行路由。此外,还添加了对启动时跟踪配置和解码 FIDL 消息正文的支持。

  • 引入了新的 ffx target discover 命令和缓存机制。这会填充发现缓存,以避免在每次调用命令时进行完整的网络扫描,从而使 ffx 在缓存有效时几乎可以立即解析目标。

  • 已在 ffx 中实现主机端 USB 驱动程序支持。新的 usb_driver 命令和关联的守护程序逻辑现在可以处理主机端 USB 连接,从而改进长时间运行的连接的进程隔离。

  • 已从 ffx 和 Zircon build 规则中移除对 macOS 的支持。 MacOS 不再是这些工具支持的主机平台。

  • 添加了新的 ffx target log-message 命令。用户现在可以向设备的日志写入任意消息,这对于在手动测试期间标记事件非常有用。

  • ffx driver 现在支持生成包含主机/驱动程序分组的图表。 ffx driver node graph 现在可以按驱动程序主机和组件对节点进行分组,还可以选择性地显示服务路由。

  • ffx target get-ssh-address 已被弃用。用户应迁移到 ffx target list --format addresses

  • 增强了“遥控器”服务。该服务现在通过端口 9797 提供 authorized_keys,并支持通过 VSOCK 提供 FDomain。

fx

针对 fx 进行了以下更新:

  • fx build 现在支持直接构建 Bazel 目标。一种新的实验模式允许使用 --config=NAME 为主机目标调用 Bazel,与现有的 GN build 并行运行。

  • zxdb 修复了 unwinder 回调中的释放后使用崩溃问题。这解决了在并发 stackTrace 请求期间导致 DAP 服务器中出现间歇性 SIGSEGV 崩溃的竞态条件。

zxdb

针对 zxdb 进行了以下更新:

  • zxdb 现在支持递归作业专用过滤条件。这使调试器能够附加到组件 realm(例如测试 realm)中的所有进程,从而在发生超时或失败时检索所有组件的回溯。

  • zxdb 符号加载应用了显著的内存优化。 调试器现在会在索引编制后清除 LLVM DWARF 库缓存,从而将大型调试符号的常驻内存使用量减少约 50%。

  • 改进了 zxdb 和 DAP 中的堆栈轨迹显示。调试器现在会省略不太相关的堆栈帧(例如 Rust 测试断言和异步执行器内部),以便专注于用户代码,并向 VS Code 等 DAP 客户端正确报告帧计数。

跟踪记录

针对跟踪功能进行了以下更新:

  • 架构更新:直接设备连接和守护程序移除。ffx trace 现在通过 TraceManagerSessionManager 直接连接到目标设备,绕过 ffx 守护程序。此架构变更实现了“真正空闲”的跟踪,从而允许会话在不保持有效主机连接的情况下持续存在。

  • 添加了启动时跟踪功能。新命令支持将轨迹配置写入设备,从而允许 trace_session_manager 在组件启动时自动启动轨迹记录。数据通过 ffx trace stop 命令检索。

  • 扩展了内核 IPC 跟踪和 FIDL 解码。内核现在会在 kernel:ipc 类别下记录初始渠道消息数据(字节和句柄)。此外,ffx trace 已更新,可对这些 FIDL 消息正文进行解码以进行更深入的检查。

  • 为转化跟踪工具添加了事件过滤功能。trace2json 工具和库现在支持通过 --pattern 进行基于正则表达式的事件过滤。此更新可确保即使过滤掉特定事件,线程和内核对象元数据也能保持完整。

  • 为分析器专用记录类型添加了 FXT 支持。Fuchsia 轨迹格式 (FXT) 读取器和序列化器现在支持 ModuleMmapBacktrace 记录,从而可以高效存储分析器数据。

  • 改进了 ffx trace 易用性和输入验证。增强功能包括下载进度指示器、自动从实参中去除弯引号,以及防止 --background--output 之间发生冲突。该工具现在还会在跟踪记录数据中缺少所请求的类别时发出警告。

  • 使内核锁争用跟踪功能可供所有用户使用。kernel:contention 类别现已在所有配置中提供,不再受 build 标志限制,因此只要启用跟踪,即可访问锁争用数据。

  • 提升了跟踪性能和指标收集。TraceFs 现在使用直接内存映射来写入事件,从而减少复制开销。新指标包括 GPU 利用率,并且 Starnix 线程 ID 现在已正确映射到 Fuchsia koid,以便在 Perfetto 中实现更好的可视化效果。

界面

界面方面进行了以下更新:

  • 引入了 display::CoordinatorProxy 以优化显示配置。这个新的代理层通过缓存结果和过滤冗余状态更新,最大限度地减少了对显示协调器的 FIDL 调用,从而减少了 Flatland 和 Scenic 中的开销并提高了性能。
  • 在 Flatland 中实现了 BlendMode::STRAIGHT_ALPHA此添加项可在 Flatland 渲染引擎中为非预乘像素格式实现正确的颜色合成。
  • 引入了 TrustedFlatlandFactory 协议。此新接口允许授权客户端绕过标准 Scenic 开销,为特定的可信用例提供优化的性能路径。

视频

视频功能进行了以下更新:

  • 运行时页面大小确定。媒体和相机驱动程序现在会在运行时查询内存页大小,而不是依赖于 ZX_PAGE_SIZE 编译时常量,从而根据 RFC 0016 提高了不同系统配置之间的兼容性。

  • 迁移到 C++ MMIO SDK。媒体和相机驱动程序现在使用 //sdk/lib/driver/mmio/cpp 进行内存映射 I/O,从而实现代码库现代化并替换旧版实现。

  • 所有视频解码器内部缓冲区现在都通过 sysmem 分配。这有助于缓解物理内存碎片化问题,并降低了zx_vmo_create_contiguous找不到足够长的物理内存运行时的概率。

WLAN 和连接

针对 WLAN 和连接进行了以下更新:

  • SAR 和传输功率控制 API 的实现。在 WLAN 堆栈中添加了对特定吸收率 (SAR) 和传输功率场景的支持,以确保符合监管要求并安全运行。这包括 WlanPhyImplDeviceMonitor 上的新 FIDL API、wlanix 中用于动态控制 WifiChip 功率等级的实现,以及关联的遥测日志记录。

  • 增强型安全协议支持 (WPA3/SAE 和 WEP)。扩展了安全功能,可同时支持现代标准和旧版标准。添加了相关功能,以支持 SAE 密码设置和 RSNXE 解析,从而实现 WPA3 Hash-to-Element 身份验证。此外,wlanix 现在支持保存 WEP 凭据和设置 WEP 密钥索引。

  • WLAN 恢复和可靠性改进。提升了系统稳定性和自我修复能力。系统现在会在典型操作失败时重新启用 PHY 重置恢复,并通过接口名称为请求方提供服务,以允许进程重启。此外,芯片现在会在启动失败时明确断电,并且会针对非 DFS 设备停用主动 5GHz 扫描,以提高连接稳定性。

  • 漫游逻辑和指标增强功能。优化了漫游行为和可观测性。漫游逻辑现在会惩罚具有极高 RSSI(>-30 dBm)的 BSS,以防止无线电饱和。修复了漫游成功率指标方面的问题以及缺少失败漫游日志的问题,以提供准确的性能数据。

  • API 和协议更新。引入了新的 API 并更新了协议定义,以更好地符合标准并进行控制。添加了 GetSignalReport API,并将 ieee80211::StatusCode 更新为灵活类型,以支持 802.11-2020。此外,SetScanModeSetBtCoexistenceMode API 已通过堆栈连接。

  • 固件、遥测和维护更新。一系列硬件支持和内部改进。Broadcom SYN4381 固件已升级到 1195.1225,并添加了对“00”(全球)国家/地区代码的支持。内部变更包括:根据 RFC 0016 移除了 ZX_PAGE_SIZE 的运行时使用情况;修复了 PHY 重置期间的溢出错误;以及添加了电池充电状态和时序信号报告的遥测。

  • 网络政策死锁解决。解决了网络管理中的竞态条件和死锁问题。DefaultNetwork 依赖项的方向性已反转,使 netcfgsocket-proxy 之间的连接成为单向连接,以确保可靠的状态转换。

  • 重构了 Windowed Stats 特征。我们重构了 TimeMatrixStatistic 特征(将 Interpolator 重命名为 TimeMatrixTick,将 MatrixSampler 重命名为 TimeMatrixFold),以简化类型边界、提高语义清晰度,并支持新的插值类型(例如 NoSample)。