ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Flutter Engine 在 Fuchsia 上的 Dart AOT Runner 集成测试:从环境搭建到源码级原理

Flutter Engine 在 Fuchsia 上的 Dart AOT Runner 集成测试:从环境搭建到源码级原理 跨平台图形学前端【免费下载链接】engineThe Flutter engine项目地址https://gitcode.com/gh_mirrors/eng/engine点击查看免费下载导读dart_aot_runner是 Flutter Engine 仓库shell/platform/fuchsia/dart_runner/tests/startup_integration_test/dart_aot_runner中针对Dart AOTAhead-of-TimeRunner的启动集成测试Startup Integration Test。本文以该测试的 README.md 为主线完整讲解在 Fuchsia 模拟器上从环境准备、构建产物、发布软件包到执行测试的完整操作流程并深入解读测试源码与 Component Manifest帮助你理解 Flutter Engine 如何通过 Dart AOT Runner 启动非 Flutter 的 Dart 组件。读完本文你将能够独立搭建并运行该集成测试并掌握其背后的 Fuchsia Component Realm 机制。1. 背景什么是 Dart AOT Runner 集成测试在 Fuchsia 系统中组件Component由各种 Runner 负责启动。Flutter Engine 的 dart_runner 实现了fuchsia::component::runner::ComponentRunnerFIDL 接口用于启动和运行不使用 Flutter 的纯 Dart 应用程序。它分为两种形态Dart AOT Runner运行已预编译为 AOT 快照的 Dart 代码profile/release 模式启动快、无需 JIT 编译Dart JIT Runner运行 JIT 模式的 Dart 代码debug 模式。dart_aot_runner目录下的集成测试正是为了验证 Dart AOT Runner 能否在真实的 Fuchsia 组件环境中完成一次完整的创建组件 → 注册 Runner → 启动 Dart 组件 → 跨组件 FIDL 通信闭环。该测试由以下目录协同构成见 startup_integration_test目录职责dart_aot_runner/面向 AOT Runner 的集成测试主体本文主角dart_jit_runner/面向 JIT Runner 的对应集成测试dart_echo_server/供两类测试共用的 Dart Echo 服务器组件dart-aot-echo-server与dart-jit-echo-server两个产物startup_integration_test/BUILD.gn中的startup_integration_testgroup 同时依赖dart_aot_runner:tests与dart_jit_runner:tests二者共用同一套测试基础设施。2. 运行前准备模拟器与 PM Serve原 README 的第一步是建立 Fuchsia 开发环境假设你已有$FUCHSIA_DIR与$ENGINE_DIR两个环境变量分别指向 Fuchsia SDK 源码树与 Flutter Engine 源码树fx set terminal.qemu-x64 ffx emu start --headless fx serve三条命令的作用分别是fx set terminal.qemu-x64为 x64 QEMU 目标配置 Fuchsia 构建product 为terminal生成构建目录ffx emu start --headless以无头模式启动 Fuchsia 模拟器headless 意味着无图形界面适合 CI 环境fx serve启动 Fuchsia 软件包仓库服务Package Server使模拟器可以从开发机拉取.far格式的软件包。注意原 README 在此处留有 TODO 注释TODO(erkln): Replace steps once test runner script is updated to run Dart runner tests说明一旦测试脚本更新为统一运行 Dart runner 测试上述手工步骤可能会被脚本替代。当前仓库版本下仍按本文步骤手工执行。3. 构建 Engine 产物必须使用 profile 运行时3.1 GN 配置命令$ENGINE_DIR/flutter/tools/gn --fuchsia --no-lto --runtime-modeprofile这是 Flutter Engine 的 GN 配置脚本tools/gn的 Fuchsia 分支。关键参数参数含义--fuchsia启用 Fuchsia 平台目标--no-lto禁用链接时优化LTO保证调试信息与构建稳定性--runtime-modeprofile关键使用 profile 运行时模式见下文为什么必须是 profile3.2 Ninja 编译命令ninja -C $ENGINE_DIR/out/fuchsia_profile_x64 flutter/shell/platform/fuchsia fuchsia_tests输出目录out/fuchsia_profile_x64由 3.1 的配置生成目标flutter/shell/platform/fuchsia编译整个 Fuchsia 平台层目标fuchsia_tests编译测试相关产物其中包括下文要发布的三个.far包。3.3 为什么必须使用 profile 运行时原文档 Notes 详解原 README 的Notes一节明确警告Theprofileruntime should be used when running thedart_aot_runnerintegration test. Snapshots will fail to generate or generate incorrectly if the wrong runtime is used.即AOT 快照的生成依赖 profile 运行时。若误用其他 runtime如 debug 的 JIT 模式快照要么生成失败、要么生成结果不正确进而导致 Dart AOT Runner 无法加载组件。这是由 Dart AOT 快照与运行时模式强绑定决定的——AOT 快照必须由与之匹配的 VM 运行时加载。因此不要试图用--runtime-modedebug或--runtime-moderelease绕过只有profile是这条测试链路支持的模式。4. 将三个软件包发布到 PM 仓库构建完成后需要把三个.far软件包发布到 Fuchsia 的软件包仓库amber-files 目录模拟器中的组件管理器才能按 URL 拉取到它们$FUCHSIA_DIR/.jiri_root/bin/ffx repository publish $FUCHSIA_DIR/$(cat $FUCHSIA_DIR/.fx-build-dir)/amber-files --package-archive $ENGINE_DIR/out/fuchsia_profile_x64/dart-aot-runner-integration-test-0.far $FUCHSIA_DIR/.jiri_root/bin/ffx repository publish $FUCHSIA_DIR/$(cat $FUCHSIA_DIR/.fx-build-dir)/amber-files --package-archive $ENGINE_DIR/out/fuchsia_profile_x64/oot_dart_aot_runner-0.far $FUCHSIA_DIR/.jiri_root/bin/ffx repository publish $FUCHSIA_DIR/$(cat $FUCHSIA_DIR/.fx-build-dir)/amber-files --package-archive $ENGINE_DIR/out/fuchsia_profile_x64/gen/flutter/shell/platform/fuchsia/dart_runner/tests/startup_integration_test/dart_echo_server/dart_aot_echo_server/dart_aot_echo_server.far三个包各自的职责软件包内容来源dart-aot-runner-integration-test-0.far测试二进制本身gtest 可执行文件dart_aot_runner/BUILD.gn 中的fuchsia_test_archive(dart-aot-runner-integration-test)oot_dart_aot_runner-0.farDart AOT Runner 的OOTOut-Of-Tree副本dart_runner/BUILD.gn 中的oot_dart_aot_runner目标dart_aot_echo_server.farDart Echo 服务器组件AOT 版dart_echo_server/BUILD.gn 中的aot_echo_package其中$FUCHSIA_DIR/$(cat $FUCHSIA_DIR/.fx-build-dir)/amber-files是动态拼接的仓库目录路径.fx-build-dir文件记录了当前 Fuchsia 构建目录名。4.1 为什么叫 OOT 副本从 dart_echo_server/BUILD.gn 的注释可以看到设计动机# OOT copy of the runner used by tests, to avoid conflicting with the # runners in the base fuchsia image. # TODO(fxbug.dev/106575): Fix this with subpackages.基础 Fuchsia 镜像中已经内置了系统级的 Dart runner。测试使用oot_dart_aot_runnerEngine 构建出的副本是为了避免与基础镜像中的 runner 冲突确保测试的是当前 Engine 代码的 runner 实现而非系统预装版本。这也是测试组件 CML 中声明deprecated-allowed-packages包含oot_dart_aot_runner的原因见下文第 6 节。5. 执行测试三个包发布完成后通过ffx test run在模拟器中执行测试ffx test run fuchsia-pkg://fuchsia.com/dart-aot-runner-integration-test#meta/dart-aot-runner-integration-test.cmfuchsia-pkg://fuchsia.com/dart-aot-runner-integration-test是软件包 URL对应第 4 节发布的第一个.far#meta/dart-aot-runner-integration-test.cm指定包内组件清单Component Manifest的位置即 dart-aot-runner-integration-test.cml 编译后的.cm文件。测试通过即说明Dart AOT Runner 能在 Fuchsia 组件框架中成功注册、加载 AOT 快照并启动 Dart 组件。6. 测试原理从 Realm 构建到 FIDL 回环理解这条测试需要同时看三个层次测试主体源码、测试组件 Manifest、被测组件 Manifest。6.1 测试主体RealmBuilder 驱动的 gtest核心逻辑位于 dart-aot-runner-integration-test.cc它使用 Fuchsia 的RealmBuilder测试库动态构造一个组件 Realm测试用例为DartRunnerStartsUp添加 Dart AOT Runner 子组件通过RealmBuilder::AddChild(kDartAotRunner, kDartAotRunnerUrl)将fuchsia-pkg://fuchsia.com/oot_dart_aot_runner#meta/dart_aot_runner.cm加入 Realm注册 Runner 环境在 Realm 声明中创建名为dart_runner_env的环境Environment通过RunnerRegistration把dart_aot_runner注册为该环境下的 Runnersource_name与target_name均为dart_aot_runner添加 Echo 服务器子组件将fuchsia-pkg://fuchsia.com/dart_aot_echo_server#meta/dart_aot_echo_server.cm作为子组件加入 Realm并指定其运行在dart_runner_env环境中ChildOptions{.environment kDartRunnerEnvironment}——这正是让它被 Dart AOT Runner 接管启动的关键路由基础能力向 AOT Runner 与 Echo 服务器路由日志、tracing、socket、intl、vulkan loader、inspect 等协议及config-data目录暴露 Echo FIDL 协议将 Echo 服务器提供的dart.test.Echo协议路由到父级测试自身从而建立测试 ↔ Echo 服务器的通信通道发起调用并断言auto echo realm.component().ConnectSyncdart::test::Echo(); fidl::StringPtr response; echo-EchoString(hello, response); ASSERT_EQ(response, hello);测试向 Echo 服务器发送字符串hello并断言返回结果相同——这一来一回证明 AOT Runner 完整走通了启动 → 运行 Dart 代码 → 响应 FIDL 调用的全链路。dart.test.EchoFIDL 协议定义于 dart_runner/fidl/echo.fidl测试通过 BUILD 依赖//flutter/shell/platform/fuchsia/dart_runner/fidl:dart_test引用它见 dart_aot_runner/BUILD.gn。6.2 Echo 服务器极简的 Dart 侧实现Dart 侧实现只有十几行位于 dart_echo_server/main.dartimport dart:fuchsia.builtin; String? OnEchoString(String? str) { print(Got echo string: $str); return str; } void main(ListString args) { receiveEchoStringCallback OnEchoString; }它通过dart:fuchsia.builtin库注册回调receiveEchoStringCallback把收到的字符串原样返回并打印日志。注意它完全不含 Flutter 依赖这正是dart_runner非 Flutter Dart 应用 Runner的典型使用场景。该组件被构建成 AOT 形态在 dart_echo_server/BUILD.gn 中dart_component(aot_component)使用meta/dart-aot-echo-server.cml作为清单fuchsia_package(aot_echo_package)将其与oot_dart_aot_runner打包在一起。6.3 组件清单Runner 如何被声明与消费测试组件清单dart-aot-runner-integration-test.cml 的要点通过 include 引入gtest_runner.shard.cmlgtest 运行框架、realm_builder_absolute.shard.cmlRealmBuilder 支持与system-test.shard.cml注释说明由于测试同时需要vulkan facet和hermetic-tier-2 facet必须作为 system test 运行offer块把测试 Realm 需要的协议含fuchsia.sysmem.Allocator、fuchsia.vulkan.loader.Loader等从 parent 提供给#realm_builderfacets.fuchsia.test.deprecated-allowed-packages声明了dart_aot_echo_server、test_manager、oot_dart_aot_runner三个允许包并留有 TODOfxbug.dev/114584说明未来希望将其作为依赖引入而非手工声明。Echo 服务器清单dart-aot-echo-server.cml 是理解 Runner 消费方式的关键{ program: { data: data/dart-aot-echo-server, runner: dart_aot_runner }, ... }program.runner声明该组件由名为dart_aot_runner的 Runner 启动program.data指向 AOT 快照数据文件——这正好对应 6.1 中测试代码把 Echo 服务器放进注册了该 Runner 的环境dart_runner_env的操作。Runner 自身清单dart_aot_runner.cml 则声明了 Runner 能力的提供方式{ capabilities: [{ runner: dart_aot_runner, path: /svc/fuchsia.component.runner.ComponentRunner }], expose: [{ runner: dart_aot_runner, from: self }] }它通过fuchsia.component.runner.ComponentRunner协议向组件框架暴露名为dart_aot_runner的 Runner 能力供组件清单引用。7. 常见问题与排查要点快照生成失败或错误几乎都是运行时模式用错导致。务必确认 3.1 的 GN 命令使用了--runtime-modeprofile并核对输出目录名确实是out/fuchsia_profile_x64组件 URL 404 / 拉不到包三个.far必须全部发布到同一个 amber-files 仓库缺一不可——漏掉oot_dart_aot_runner-0.far会导致 Realm 无法实例化 Runner漏掉 echo server 包会导致 Realm 无法启动 Dart 组件与基础镜像 runner 冲突测试特意使用 OOT 副本oot_dart_aot_runner而非系统内置 runner若你自行修改 URL 指向系统包可能测到的是旧版本实现需要图形/vulkan 能力由于测试组件清单引入了 vulkan facet模拟器需具备对应的图形支持这也是它被设计为 system test 的原因。8. 延伸阅读测试目录总入口startup_integration_test/BUILD.gnJIT 版对应测试dart_jit_runner用于对照理解 AOT 与 JIT 两种运行时形态的差异Dart Runner 实现dart_runner.cc、dart_component_controller.cc可进一步阅读ComponentRunnerFIDL 接口的实际实现Engine 构建脚本tools/gn 中的 Fuchsia 目标配置。赞分享跨平台图形学前端【免费下载链接】engineThe Flutter engine项目地址https://gitcode.com/gh_mirrors/eng/engine点击查看免费下载相关推荐Flutter 引擎 Fuchsia Dart AOT Runner 集成测试实战指南从 gn 构建、PM 发布到 ffx 运行Flutter 引擎 Fuchsia Dart AOT Runner 集成测试实战指南从 gn 构建、PM 发布到 ffx 运行 本文以 Flutter 引擎跨平台移动开发前端UI组件桌面应用Flutter Dart JIT Runner 启动集成测试指南在 Fuchsia 上验证 Dart 运行时组件Flutter Dart JIT Runner 启动集成测试指南在 Fuchsia 上验证 Dart 运行时组件 本文面向 Fuchsia 平台与 Flutt跨平台移动开发前端UI组件桌面应用agno 集成 LiteLLM OpenAI 兼容代理环境搭建、集成测试与源码级原理解析agno 集成 LiteLLM OpenAI 兼容代理环境搭建、集成测试与源码级原理解析 本指南以 agno 仓库中的 LiteLLM 集成测试文档为核心完人工智能大模型AI AgentAgent 框架多智能体工具调用RAGAgent 工作流Agent 记忆上一篇LMCache 多模态模型 KV 缓存完全指南mm_hash 缓存键机制、Recipe 配方体系与 Qwen2.5-VL 端到端实践下一篇InternVL VisualPRM视觉过程奖励模型解析推理能力再提升8.4分的秘密创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表