Dart SDK 内置 vm_snapshot_analysis 变更日志全解:0.1.0 至 0.7.6 版本演进与源码印证
发布时间:2026/9/25 6:48:15 锦皓数字建站

编程语言编译器语言运行时标准库开发工具【免费下载链接】sdkThe Dart SDK, including the VM, JS and Wasm compilers, analysis, core libraries, and more.项目地址https://gitcode.com/gh_mirrors/sdk1/sdk点击查看免费下载本文基于 Dart SDK 仓库中的 CHANGELOG.md 完整梳理vm_snapshot_analysis包从 0.1.0 到 0.7.6 的全部版本变更记录,并结合当前仓库源码验证每一处关键 API 与 CLI 参数的落地形态。读完本文,你将掌握这个 AOT 快照体积分析工具的能力演进脉络、每个里程碑引入的核心功能(依赖树深度参数、支配树、compareProgramInfo等)的来历,以及如何在当前版本中复现这些能力。包的定位与当前版本vm_snapshot_analysis是 Dart SDK 仓库pkg/目录下的一个工具包,提供解析 Dart VM AOT 快照体积与内容的能力,其数据来源于 AOT 编译器的--print-instructions-sizes-to、--write-v8-snapshot-profile-to与--trace-precompiler-to三类输出(见 README.md)。从 pubspec.yaml 可以确认,当前仓库中的包版本与 CHANGELOG 的最新条目一致:version: 0.7.6,与 CHANGELOG 中最新的## 0.7.6条目对应;environment: sdk: ^3.5.0,即 0.7.6 条目中等待提升 SDK 下界所指的正是这个 Dart 3.5 下界;executables: snapshot_analysis: analyse,CLI 入口指向 bin/analyse.dart。版本演进总览CHANGELOG 共记录了 0.1.0 到 0.7.6 的 15 个版本条目,按时间顺序(从新到旧)可以归纳为五个阶段:阶段版本主题最新0.7.4 / 0.7.5 / 0.7.6稳定性修复与PatchClass字段兼容null-safety0.7.0 / 0.7.1 / 0.7.2 / 0.7.3-dev空安全迁移、dominator可空化、lints 升级功能完善0.5.x / 0.6.0compareProgramInfo、依赖树深度参数、调用图支配树生成能力扩张0.4.0 / 0.3.0对比 treemap、precompiler trace、explain dynamic-calls起步0.2.0 / 0.1.0归属(ownership)计算修复、初始发布起步阶段:0.1.0 与 0.2.0 的归属修复CHANGELOG 记述 0.1.0 为Initial release,而 0.2.0 立即修复了一个影响数据正确性的核心问题:Fix owner computation code for V8 profiles: the size of a snapshot node which corresponds to aProgramInfoNodeshould be attributed to thatProgramInfoNodeand not to its parent.即:V8 快照 profile 中某个快照节点(例如Function节点)对应的ProgramInfoNode的体积,此前被错误地归到其父节点,修复后才归到节点自身。这条修复之所以重要,是因为整个包的输出(summary 表格、compare 差异、treemap)都建立在字节归属这一抽象之上,归属错误会直接污染所有下游报表。0.2.0 还更新了 CLI 帮助文案(避免把 pub 生成的快照当作脚本名)以及 ProgramInfoNode.size 的文档说明,明确了该成员的含义。功能扩张:0.3.0 与 0.4.00.3.0 完成了两件架构层面的事:treemap 构建代码抽取为独立库,使其可复用;引入--format折叠粒度控制,通过TreemapFormat format参数(编程接口)或--format标志(CLI)从四种模式中选择:collapsed:基本按ProgramInfo结构渲染 treemap,忽略单个快照节点;simplified:在collapsed基础上把嵌套函数的体积折叠进最外层函数(顶层函数或方法);data-and-code:按节点代表数据还是可执行代码折叠快照节点;object-type(默认):仅按节点类型折叠。同版本还改变了Code节点的归属方式:由函数持有的Code节点不再单独建ProgramInfoNode,而是把该Code及其保留(retained)节点直接记到函数本身的ProgramInfoNode名下;stub(包括分配 stub)则创建一个人工的functionNode;NodeType.other自此仅用于字段(field)。0.4.0 是功能上最重要的一版,CHANGELOG 记录了四项新增:buildComparisonTreemap:构造表示两个体积 profile 之间 diff 的 treemap;支持从 AOT 编译器 trace(--trace-precompiler-to标志,解析代码见 precompiler_trace.dart)提取调用图信息;新增explain dynamic-calls子命令:结合体积 dump(如 V8 snapshot profile)与 AOT 编译器 trace,估算不同动态调用对最终 AOT 快照大小的影响;summary命令可结合 AOT 编译器 trace 把包/库与其依赖归组,给出某个包/库究竟为快照带来多少体积的更精确估算。对应的实现分别落在 commands/explain.dart 与 commands/summary.dart 中,explain dynamic-calls的近似保留体积正是通过对调用图支配树的遍历累加得到的。API 化阶段:0.5.x 系列0.5.x 系列把包从CLI 工具推向可嵌入的库,CHANGELOG 中的每条记录都能在现有代码中找到对应物:0.5.01:修复包损坏问题,把不可执行文件移出bin/目录(当前bin/下确实只剩 analyse.dart 一个入口);0.5.0:把dart:io依赖从lib中移除、commands迁到bin;loadProgramInfo工具方法被loadProgramInfoFromJson取代,后者接收Object参数而非File;buildComparisonTreemap的oldJson/newJson两个参数也从File改为Object;compare命令在信息可用时会按节点类型输出差异分解。这一改动的意义在于让库层不再绑定文件系统,便于在 CI、Web 或内存管道中复用;0.5.2:支持形如package:foo.bar.baz/src/foobar.dart的包路径(含点号的多段包名);0.5.4:修复Type类名的冲突;0.5.3:新增compareProgramInfo,接收两个 program info 对象并输出包含 diff 数据的Map。当前 utils.dart 中仍可看到loadProgramInfoFromJson(L12)与compareProgramInfo(L36)两个 API,签名与 0.5.0/0.5.3 的变更记录完全吻合;0.5.5(CLI 参数设计的重要节点):新增summary命令的deps-display-depth(-d)标志,使输出的依赖树展示深度可配置;将原deps-collapse-depth(曾用-d)更名为deps-start-depth(现-s);新增generateCallGraphWithDominators方法,可从 precompiler trace 生成带支配树的CallGraph对象。当前 summary.dart 中的参数定义印证了这一设计:--deps-start-depth/-s默认值为2(该深度及更浅的节点会被折叠),--deps-display-depth/-d默认值为4(更深的节点以汇总形式展示),且两者均注明仅在同时传入--precompiler-trace时生效。0.6.0:依赖升级0.6.0 是一条纯维护性记录:升级到最新的args、path、meta依赖。这为后续 0.7.0 的空安全迁移扫清了依赖障碍——空安全迁移要求所有传递依赖都已完成 null-safety,0.6.0 正是这一步准备。null-safety 迁移:0.7.0 及其后续0.7.0:整体迁移到 null-safety。这是 Dart 生态的普遍性版本,但对一个输出结构化数据的库而言,可空性的设计直接影响 API 语义,下一版就体现了这一点;0.7.1:将CallGraphNode.dominator改为可空(Nullable)。在 precompiler_trace.dart 中可以看到当前实现:CallGraphNode? dominator;,注释说明该字段由CallGraph.computeDominators计算。可空化的合理之处在于:支配树只有在调用computeDominators之后才有意义,空安全类型让尚未计算这一状态从约定变成了类型层面的事实;0.7.2:升级到package:lints2.0,并填充 pubspec 的repository字段(当前 pubspec.yaml 第 4 行的repository即由此而来);0.7.3-dev:更新 README,记录当时生成 Dart AOT 快照的方式;修正 dartdoc 注释中的拼写错误。稳定性修复:0.7.4、0.7.5 与 0.7.6CHANGELOG 中最后三个版本都是缺陷修复,体现了该包在真实工作负载(尤其是 Flutter 场景)下的打磨过程:0.7.4 / 0.7.5(对应 flutter/flutter#128402 与 flutter/flutter#130009):修复尝试查询 type testing stubs 的 owner info 节点时触发 null check error的问题。两条记录描述同一类根因,0.7.5 是对 0.7.4 同类问题的再次修补,说明 stub 归属路径上的边界条件不止一处;0.7.6(当前版本):Allow the oldpatched_class_field forPatchClassuntil we change the SDK lower bound for this package to a version that does not have it.即:在PatchClass节点解析中,暂时同时接受新旧两个字段名,直到本包的 SDK 下界提升到不再产出旧字段的版本。这条变更记录在现有源码中有精确对应,见 v8_profile.dart:case PatchClass: // Allow the old patched_class_ field if the wrapped_class_ field does // ... final wrappedClass node[wrapped_class_] ?? node[patched_class_]!;wrapped_class_(新字段)优先,patched_class_(旧字段)作为回退——这正是 CHANGELOG 所述双字段兼容窗口的实现形态,而兼容窗口的关闭条件(提升 pubspec.yaml 中的sdk: ^3.5.0下界)也已在条目中写明。从源码结构看:版本记录与实现的对应关系把 CHANGELOG 的关键条目映射回当前仓库,可以确认记录与实现保持一致,这也说明了这份变更日志作为演进地图的可信度:CHANGELOG 条目版本当前源码位置-s/-d依赖树深度参数0.5.5summary.dart,默认 2 / 4compareProgramInfo0.5.3utils.dartloadProgramInfoFromJson(Object 参数)0.5.0utils.dartprecompiler trace 解析与generateCallGraphWithDominators系列能力0.4.0 / 0.5.5precompiler_trace.dart,CallGraph.collapse等CallGraphNode.dominator可空0.7.1precompiler_trace.dartpatched_class_旧字段兼容0.7.6v8_profile.dartrepository字段0.7.2pubspec.yaml需要注意的适用前提:上述版本与行为均以当前仓库pkg/vm_snapshot_analysis目录的实际内容为准,包版本锁定为 0.7.6;若通过 pub 全局安装(如pub global activate vm_snapshot_analysis)获取,实际行为可能随 pub 上发布的版本而变化,与仓库主干不一定一致。如何复现变更日志中描述的用法结合 CHANGELOG 与 README.md,当前版本下可复现的完整工作流为:# 1. 编译时同时产出 profile 与 trace $ dart compile exe --extra-gen-snapshot-options--write-v8-snapshot-profile-toprofile.json --extra-gen-snapshot-options--trace-precompiler-totrace.json -o binary input.dart # 2. 按包统计快照体积,并展示依赖树(0.5.5 引入的 -s/-d 参数) $ dart run pkg/vm_snapshot_analysis/bin/analyse.dart summary -b package -s 1 -d 3 --precompiler-tracetrace.json profile.json # 3. 对比新旧两份 profile 的差异(0.5.0 起按节点类型分解差异) $ dart run pkg/vm_snapshot_analysis/bin/analyse.dart compare -b class old.json new.json # 4. 估算动态调用的体积影响(0.4.0 引入) $ dart run pkg/vm_snapshot_analysis/bin/analyse.dart explain dynamic-calls profile.json trace.json # 5. 生成 treemap(0.3.0 引入的 --format 四种折叠模式) $ dart run pkg/vm_snapshot_analysis/bin/analyse.dart treemap --format simplified profile.json out/以上命令形态与 README 中snapshot_analysis全局安装后的用法一一对应,差异仅在于此处直接以仓库内 bin/analyse.dart 作为入口运行,便于在 SDK 源码树中验证各版本引入的能力。赞分享编程语言编译器语言运行时标准库开发工具【免费下载链接】sdkThe Dart SDK, including the VM, JS and Wasm compilers, analysis, core libraries, and more.项目地址https://gitcode.com/gh_mirrors/sdk1/sdk点击查看免费下载相关推荐openai-agents-python 版本机制与破坏性变更演进全指南0.1.0 至 0.22.0 变更日志深度解读openai agents python 版本机制与破坏性变更演进全指南0.1.0 至 0.22.0 变更日志深度解读 本指南以 openai agents人工智能AI AgentAgent 框架多智能体工具调用MCP ClientsSeaTunnel MaxCompute 连接器变更日志全解析2.3.0 至 2.3.12 的关键演进与源码印证SeaTunnel MaxCompute 连接器变更日志全解析2.3.0 至 2.3.12 的关键演进与源码印证 本文以仓库中的 MaxCompute 连接器数据集成ETL大数据批处理流处理变更数据捕获Hyperledger Fabric 版本演进史从 v0.6 到 v2.0 的变更日志解读与源码印证Hyperledger Fabric 版本演进史从 v0.6 到 v2.0 的变更日志解读与源码印证 导读 本篇文章以仓库根目录 CHANGELOG.md h区块链密码学上一篇JNativeHook项目架构分析从Java到C的跨语言调用深度剖析下一篇Go语言终极队列解决方案dque嵌入式持久化队列完全指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。