trace.dart 2.33 KB
Newer Older
1 2 3 4 5 6
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import 'dart:async';

7
import '../android/android_device.dart';
8
import '../application_package.dart';
9
import '../globals.dart';
10
import '../runner/flutter_command.dart';
11

12
class TraceCommand extends FlutterCommand {
13
  @override
14
  final String name = 'trace';
15 16

  @override
Devon Carew's avatar
Devon Carew committed
17
  final String description = 'Start and stop tracing for a running Flutter app (Android only).';
18 19

  @override
Devon Carew's avatar
Devon Carew committed
20 21 22 23
  final String usageFooter =
    '\`trace\` called with no arguments will automatically start tracing, delay a set amount of\n'
    'time (controlled by --duration), and stop tracing. To explicitly control tracing, call trace\n'
    'with --start and later with --stop.';
24

25
  TraceCommand() {
26 27
    argParser.addFlag('start', negatable: false, help: 'Start tracing.');
    argParser.addFlag('stop', negatable: false, help: 'Stop tracing.');
28
    argParser.addOption('out', help: 'Specify the path of the saved trace file.');
29 30 31 32
    argParser.addOption('duration',
        defaultsTo: '10', abbr: 'd', help: 'Duration in seconds to trace.');
  }

33
  @override
34 35
  bool get androidOnly => true;

36
  @override
37 38
  bool get requiresDevice => true;

39
  @override
40
  Future<int> runInProject() async {
41
    await downloadApplicationPackages();
42 43

    ApplicationPackage androidApp = applicationPackages.android;
44
    AndroidDevice device = deviceForCommand;
45 46 47 48 49

    if ((!argResults['start'] && !argResults['stop']) ||
        (argResults['start'] && argResults['stop'])) {
      // Setting neither flags or both flags means do both commands and wait
      // duration seconds in between.
50
      device.startTracing(androidApp);
Ian Hickson's avatar
Ian Hickson committed
51
      await new Future<Null>.delayed(
52 53
        new Duration(seconds: int.parse(argResults['duration'])),
        () => _stopTracing(device, androidApp)
54
      );
55
    } else if (argResults['stop']) {
56
      await _stopTracing(device, androidApp);
57
    } else {
58
      device.startTracing(androidApp);
59 60 61 62
    }
    return 0;
  }

Ian Hickson's avatar
Ian Hickson committed
63
  Future<Null> _stopTracing(AndroidDevice android, AndroidApk androidApp) async {
64
    String tracePath = await android.stopTracing(androidApp, outPath: argResults['out']);
65
    if (tracePath == null) {
66
      printError('No trace file saved.');
67
    } else {
68
      printStatus('Trace file saved to $tracePath');
69 70 71
    }
  }
}