Flutter模拟器管理插件emulators的使用

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

Flutter模拟器管理插件emulators的使用

emulators 是一个用于自动化移动设备模拟器的工具库。它可以用来在多个设备上自动生成截图。

示例项目

您可以参考这个示例项目来了解如何使用该包为Flutter项目生成截图: flutter-emulators-screenshots-demo

该项目展示了如何使用此包生成Flutter项目的截图。

常见问题 (FAQ)

iOS状态栏不美观

确保您在模拟器中使用的iOS版本是16或更低版本(不是16.1或更高版本),如果您希望默认状态栏(时间、电池等)在所有截图中保持一致。

对于有运营商名称显示在状态栏中的手机(例如iPhone 8 Plus),请确保模拟器使用的是iOS 15.5或更低版本,以便插件可以移除运营商名称并添加蜂窝信号条。

更多信息可参阅:Xcrun simctl status bar not working on Xcode 14.1

Android模拟器随机错误或挂起

您可能会遇到adb的bug。一个症状是当模拟器正在运行时,命令adb -s emulator-5554 emu avd name的输出为空(其中emulator-5554是您的模拟器名称)。

如果文件~/.emulator_console_auth_token存在且为空,请停止模拟器并删除该文件。

更多信息可参阅:dart_emulators issue #4

示例代码

以下是一个完整的示例代码,展示如何使用emulators插件:

import 'dart:io';

import 'package:emulators/emulators.dart';

Future<void> main() async {
  final emu = await Emulators.build();

  // 关闭所有正在运行的设备
  await emu.shutdownAll();

  // 使用adb / avdmanager / emulator / simctl助手
  await emu.toolchain.emulator(['-list-avds']).string();

  await emu.toolchain.avdmanager([
    'create',
    'avd',
    '-n',
    'Nexus_5X',
    '-k',
    'system-images;android-25;google_apis;x86',
    '-f',
  ]).string();

  // 尝试依次启动给定设备,并在每个设备上运行给定函数
  await emu.forEach([
    'iPhone 8 Plus',
    'iPhone 12 Pro',
    'Nexus_5X',
  ])((device) async {
    // 创建截图助手
    final screenshot = emu.screenshotHelper(
      device: device,
      androidPath: 'directory/for/android/screenshots',
      iosPath: 'directory/for/ios/screenshots',
    );

    // 捕获截图并写入文件
    await screenshot.capture('home_screen');

    // 或者运行flutter drive,并将输出发送到stdout
    final process = await emu.drive(device, 'test_driver/main.dart');
    await stdout.addStream(process.stdout);
  });
}

通过以上代码,您可以实现对多个设备的自动管理与操作,包括创建AVD、捕获屏幕截图以及运行Flutter驱动测试。


更多关于Flutter模拟器管理插件emulators的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter模拟器管理插件emulators的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter开发中,使用模拟器管理插件 emulators 可以极大地方便我们在不同设备和配置上进行测试。emulators 插件允许你列出、启动和停止Android模拟器。以下是如何在Flutter项目中使用 emulators 插件的相关代码案例。

安装 emulators 插件

首先,确保你的Flutter开发环境中已经安装了 dart:cli 包,因为 emulators 插件是通过命令行工具来管理模拟器的。然后,你可以通过pubspec.yaml文件或者直接使用命令行来添加依赖(尽管 emulators 不是一个Flutter插件,而是一个Dart包,用于命令行操作)。

实际上,emulators 作为一个命令行工具,并不直接作为Flutter插件使用,而是通过Flutter的工具链来调用。不过,我们可以通过Dart代码调用系统命令行来实现类似功能。以下是如何通过Dart代码来管理模拟器的一个示例。

使用Dart代码调用 emulators 命令

以下是一个简单的Dart脚本示例,展示如何通过 process_run 包来调用Android SDK中的 emulator 命令。注意,这并非直接使用 emulators 插件(因为实际上没有这样一个Flutter插件),而是展示如何通过Dart代码来管理模拟器。

  1. 添加 process_run 依赖

在你的 pubspec.yaml 文件中添加以下依赖:

dependencies:
  process_run: ^0.17.10
  1. 创建Dart脚本

创建一个新的Dart脚本文件,例如 manage_emulators.dart,并添加以下代码:

import 'package:process_run/cmd_run.dart';

void main() async {
  // 列出所有可用的模拟器
  print("Listing available emulators...");
  var result = await runCmd(ProcessCmd(['emulator', '-list-avds']));
  print(result.stdout);

  // 启动一个特定的模拟器(例如:Pixel_3a_API_30)
  String emulatorName = 'Pixel_3a_API_30';
  print("\nStarting emulator: $emulatorName...");
  var startResult = await runCmd(ProcessCmd(['emulator', '-avd', emulatorName]));
  print(startResult.stdout);

  // 注意:停止模拟器通常不是通过命令行直接完成的,
  // 而是通过Android Studio的AVD Manager或者手动关闭模拟器窗口。
  // 但你可以通过发送特定的ADB命令来尝试停止一个正在运行的模拟器实例。
  // 例如,获取模拟器设备ID然后发送关机命令(这通常不会真正关闭模拟器进程)。
  // 这里仅作为示例,不保证在所有情况下都有效。
  print("\nStopping emulator (note: this may not actually stop the emulator process)...");
  var devicesResult = await runCmd(ProcessCmd(['adb', 'devices']));
  var deviceLine = devicesResult.stdout.split('\n').skipWhile((line) => !line.contains(emulatorName)).first;
  var deviceId = deviceLine.split('\t')[0].replaceAll('device', '');
  if (deviceId.isNotEmpty) {
    var stopResult = await runCmd(ProcessCmd(['adb', '-s', deviceId, 'shell', 'am', 'force-stop', 'com.android.launcher3']));
    // 注意:这仅仅停止了启动器应用,并不等同于停止模拟器。
    print(stopResult.stdout);
  } else {
    print("No running emulator found with name containing $emulatorName");
  }
}

注意事项

  • 上述代码中的停止模拟器部分只是一个示例,实际上并不能真正停止模拟器进程。停止模拟器通常需要通过Android Studio的AVD Manager或者手动操作。
  • 在实际开发中,你可能需要根据具体需求调整脚本,比如处理错误情况、等待模拟器完全启动等。
  • 确保你的环境变量中包含了Android SDK的路径,以便 emulatoradb 命令可以正确执行。

通过上述代码,你可以在Flutter项目中集成模拟器管理功能,从而更方便地进行跨设备测试。

回到顶部