Flutter虚拟机快照分析插件vm_snapshot_analysis的使用

发布于 1周前 作者 ionicwang 来自 Flutter

Flutter虚拟机快照分析插件vm_snapshot_analysis的使用

vm_snapshot_analysis 是一个用于分析 Dart VM AOT 快照大小和内容的工具。它基于 --print-instructions-sizes-to, --write-v8-snapshot-profile-to--trace-precompiler-to VM 标志的输出进行分析。

AOT Snapshot 基础

Dart VM AOT 快照是 Dart VM 堆图的序列化表示,由数据(如字符串、const 实例、类、库、函数和运行时元数据)和可执行代码(从 Dart 源生成的机器代码)两部分组成。

关键标志

  • --print-instructions-sizes-to: 将可执行代码归因于特定的 Dart 函数。
  • --write-v8-snapshot-profile-to: 生成快照的图形表示,涵盖数据和代码部分。
  • --trace-precompiler-to: 提供关于编译函数之间依赖关系的信息。

传递标志给 AOT 编译器

在 Flutter 或 dart compile exe 中可以使用 --extra-gen-snapshot-options 来传递标志:

$ flutter build aot --release --extra-gen-snapshot-options=--write-v8-snapshot-profile-to=profile.json
$ dart compile exe --extra-gen-snapshot-options=--write-v8-snapshot-profile-to=profile.json -o binary input.dart

CLI 工具

vm_snapshot_analysis 提供了一个命令行接口来分析快照文件。

安装

$ pub global activate vm_snapshot_analysis

子命令

summary

显示快照字节的细分,支持按粒度(如 method, class, library 或 package)和过滤器进行筛选。

示例:

$ snapshot_analysis summary -b class -w dart:core profile.json

compare

比较两个大小配置文件,了解程序的哪些部分对整体快照大小的变化贡献最大。

示例:

$ snapshot_analysis compare -b class old.json new.json

treemap

生成树形图表示信息并存储到指定目录,可以在浏览器中查看。

示例:

$ snapshot_analysis treemap --format simplified profile.json output_dir
$ google-chrome output_dir/index.html

explain

生成动态调用选择器及其对代码大小影响的报告。

示例:

$ snapshot_analysis explain dynamic-calls profile.json trace.json

API 使用

该包还可以作为其他想要分析 VM AOT 快照的包的构建块。

示例代码

以下是一个完整的示例,展示如何使用 vm_snapshot_analysis 分析快照:

import 'package:vm_snapshot_analysis/instruction_sizes.dart';
import 'package:vm_snapshot_analysis/v8_profile.dart';
import 'package:vm_snapshot_analysis/utils.dart';

void main() async {
  // 加载快照分析信息
  final programInfo = await loadProgramInfo('path/to/profile.json');

  // 打印分析结果
  print(programInfo.summary());

  // 对比两个快照文件
  final oldSnapshot = await loadProgramInfo('path/to/old_profile.json');
  final newSnapshot = await loadProgramInfo('path/to/new_profile.json');
  final comparison = compareSnapshots(oldSnapshot, newSnapshot);
  print(comparison.toString());
}

总结

vm_snapshot_analysis 是一个强大的工具,可以帮助开发者深入了解和优化 Dart 应用程序的快照大小。通过命令行工具和 API 接口,开发者可以方便地进行快照分析和比较,从而提高应用程序的性能和效率。更多详细信息和功能请求,请访问 GitHub issue tracker


更多关于Flutter虚拟机快照分析插件vm_snapshot_analysis的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter虚拟机快照分析插件vm_snapshot_analysis的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中使用vm_snapshot_analysis插件来分析虚拟机快照的一个基本示例。vm_snapshot_analysis插件通常用于对Dart虚拟机(VM)的快照文件进行分析,以获取关于编译后的Dart代码的信息。这个插件不直接提供在Flutter项目中的UI交互,但可以用于调试和性能分析。

首先,需要确保你的Flutter环境已经设置好,并且你的项目已经创建。然后,你需要添加vm_snapshot_analysis依赖到你的pubspec.yaml文件中(注意:这个包可能是一个假设的包名,实际使用时需要查找具体的包名或依赖)。

由于vm_snapshot_analysis并不是一个广泛认知的Flutter插件(它更像是一个底层工具),这里我将展示一个假设的使用场景,即如何通过Dart VM Service Protocol来分析快照。

1. 添加依赖

虽然vm_snapshot_analysis不是标准Flutter插件,但假设有一个类似的库可以用于Dart VM的分析,你可以这样添加依赖(这里用dart_vm_service作为示例,它实际上提供了与Dart VM交互的API):

dependencies:
  flutter:
    sdk: flutter
  dart_vm_service: ^x.y.z  # 替换为实际版本号

2. 使用Dart VM Service Protocol进行快照分析

下面是一个简单的示例,展示如何使用dart_vm_service库连接到Dart VM并获取一些基本信息。请注意,这只是一个基础示例,并不直接涉及快照分析,但展示了如何与Dart VM交互。

import 'dart:io';
import 'dart:convert';
import 'package:dart_vm_service/dart_vm_service.dart';
import 'package:http/http.dart' as http;

Future<void> main() async {
  // Dart VM默认监听在127.0.0.1:8181端口上(需要你在运行Dart应用时指定--observe选项)
  final client = http.Client();
  final vmService = VmService(client, 'http://127.0.0.1:8181');

  try {
    // 获取VM的版本信息
    final versionResponse = await vmService.getVersion();
    print('Dart VM version: ${versionResponse.version}!');

    // 获取隔离区(Isolate)列表
    final isolateRef = await vmService.getVM().then((vm) => vm.isolates.first);
    final isolate = await vmService.getIsolate(isolateRef.id!);
    print('Isolate name: ${isolate.name}!');

    // 获取内存使用情况
    final memoryUsage = await vmService.getMemoryUsage(isolateRef.id!);
    print('Memory usage: ${jsonEncode(memoryUsage)}');

    // 假设这里你会添加代码来加载和分析快照文件...

  } catch (e) {
    print('Error: $e');
  } finally {
    client.close();
  }
}

3. 运行并观察

在运行这个示例之前,你需要确保你的Dart应用或Flutter应用以观察模式运行,即添加--observe标志。例如:

flutter run --observe

或者对于纯Dart应用:

dart run --observe your_dart_file.dart

然后运行你上面的Dart脚本,它将连接到Dart VM并输出一些基本信息。

注意

  • 实际上,vm_snapshot_analysis可能不是一个真实存在的Flutter插件或Dart包。如果这是一个特定的内部工具或第三方库,你需要查阅相应的文档来了解如何使用它。
  • Dart VM Service Protocol提供了丰富的API来与Dart VM进行交互,包括调试、性能分析和内存管理等。
  • 对于Flutter应用,通常使用DevTools或Performance Overlay来进行性能分析,而不是直接操作Dart VM Service Protocol。

希望这个示例能帮助你理解如何在Flutter或Dart项目中与Dart VM进行交互,并为你进一步使用类似vm_snapshot_analysis的工具打下基础。

回到顶部