| // Copyright 2014 The Flutter 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:io'; |
| |
| import 'package:flutter_devicelab/framework/framework.dart'; |
| import 'package:flutter_devicelab/framework/utils.dart'; |
| import 'package:path/path.dart' as path; |
| |
| final Directory helloWorldDir = dir(path.join(flutterDirectory.path, 'examples', 'hello_world')); |
| |
| /// Creates a devicelab build benchmark for Android. |
| TaskFunction createAndroidBuildBenchmarkTask() { |
| return () async { |
| return createBuildCommand('apk'); |
| }; |
| } |
| |
| /// Creates a devicelab build benchmark for iOS. |
| TaskFunction createIosBuildBenchmarkTask() { |
| return () async { |
| return createBuildCommand('ios'); |
| }; |
| } |
| |
| Future<TaskResult> createBuildCommand(String buildKind) { |
| return inDirectory<TaskResult>(helloWorldDir, () async { |
| final Stopwatch stopwatch = Stopwatch() |
| ..start(); |
| final Process initialBuild = await startProcess( |
| path.join(flutterDirectory.path, 'bin', 'flutter'), |
| <String>['build', buildKind, '--debug'], |
| environment: null, |
| ); |
| int exitCode = await initialBuild.exitCode; |
| if (exitCode != 0) { |
| return TaskResult.failure('Failed to build debug app'); |
| } |
| final int initialBuildMilliseconds = stopwatch.elapsedMilliseconds; |
| stopwatch |
| ..reset() |
| ..start(); |
| final Process secondBuild = await startProcess( |
| path.join(flutterDirectory.path, 'bin', 'flutter'), |
| <String>['build', buildKind, '--debug'], |
| environment: null, |
| ); |
| exitCode = await secondBuild.exitCode; |
| if (exitCode != 0) { |
| return TaskResult.failure('Failed to build debug app'); |
| } |
| final int secondBuildMilliseconds = stopwatch.elapsedMilliseconds; |
| final Process newBuildConfig = await startProcess( |
| path.join(flutterDirectory.path, 'bin', 'flutter'), |
| <String>['build', buildKind, '--profile'], |
| environment: null, |
| ); |
| exitCode = await newBuildConfig.exitCode; |
| if (exitCode != 0) { |
| return TaskResult.failure('Failed to build profile app'); |
| } |
| stopwatch |
| ..reset() |
| ..start(); |
| final Process thirdBuild = await startProcess( |
| path.join(flutterDirectory.path, 'bin', 'flutter'), |
| <String>['build', buildKind, '--debug'], |
| environment: null, |
| ); |
| exitCode = await thirdBuild.exitCode; |
| if (exitCode != 0) { |
| return TaskResult.failure('Failed to build debug app'); |
| } |
| final int thirdBuildMilliseconds = stopwatch.elapsedMilliseconds; |
| stopwatch.stop(); |
| final Map<String, double> allResults = <String, double>{}; |
| allResults['first_build_debug_millis'] = initialBuildMilliseconds.toDouble(); |
| allResults['second_build_debug_millis'] = secondBuildMilliseconds.toDouble(); |
| allResults['after_config_change_build_debug_millis'] = thirdBuildMilliseconds.toDouble(); |
| return TaskResult.success(allResults, benchmarkScoreKeys: allResults.keys.toList()); |
| }); |
| } |