add APK build time benchmarks (#35481)
diff --git a/dev/devicelab/bin/tasks/build_benchmark.dart b/dev/devicelab/bin/tasks/build_benchmark.dart
new file mode 100644
index 0000000..5d65fe6
--- /dev/null
+++ b/dev/devicelab/bin/tasks/build_benchmark.dart
@@ -0,0 +1,12 @@
+// Copyright 2019 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';
+
+import 'package:flutter_devicelab/framework/framework.dart';
+import 'package:flutter_devicelab/tasks/build_benchmarks.dart';
+
+Future<void> main() async {
+ await task(createBuildbenchmarkTask());
+}
diff --git a/dev/devicelab/lib/tasks/build_benchmarks.dart b/dev/devicelab/lib/tasks/build_benchmarks.dart
new file mode 100644
index 0000000..f6911ff
--- /dev/null
+++ b/dev/devicelab/lib/tasks/build_benchmarks.dart
@@ -0,0 +1,72 @@
+// Copyright 2017 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: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 device lab build benchmark.
+TaskFunction createBuildbenchmarkTask() {
+ return () async {
+ return inDirectory<TaskResult>(helloWorldDir, () async {
+ final Stopwatch stopwatch = Stopwatch()
+ ..start();
+ final Process initialBuild = await startProcess(
+ path.join(flutterDirectory.path, 'bin', 'flutter'),
+ <String>['build', 'apk', '--debug'],
+ environment: null,
+ );
+ int exitCode = await initialBuild.exitCode;
+ if (exitCode != 0) {
+ return TaskResult.failure('Failed to build debug APK');
+ }
+ final int initialBuildMilliseconds = stopwatch.elapsedMilliseconds;
+ stopwatch
+ ..reset()
+ ..start();
+ final Process secondBuild = await startProcess(
+ path.join(flutterDirectory.path, 'bin', 'flutter'),
+ <String>['build', 'apk', '--debug'],
+ environment: null,
+ );
+ exitCode = await secondBuild.exitCode;
+ if (exitCode != 0) {
+ return TaskResult.failure('Failed to build debug APK');
+ }
+ final int secondBuildMilliseconds = stopwatch.elapsedMilliseconds;
+ final Process newBuildConfig = await startProcess(
+ path.join(flutterDirectory.path, 'bin', 'flutter'),
+ <String>['build', 'apk', '--profile'],
+ environment: null,
+ );
+ exitCode = await newBuildConfig.exitCode;
+ if (exitCode != 0) {
+ return TaskResult.failure('Failed to build profile APK');
+ }
+ stopwatch
+ ..reset()
+ ..start();
+ final Process thirdBuild = await startProcess(
+ path.join(flutterDirectory.path, 'bin', 'flutter'),
+ <String>['build', 'apk', '--debug'],
+ environment: null,
+ );
+ exitCode = await thirdBuild.exitCode;
+ if (exitCode != 0) {
+ return TaskResult.failure('Failed to build debug APK');
+ }
+ 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());
+ });
+ };
+}
diff --git a/dev/devicelab/manifest.yaml b/dev/devicelab/manifest.yaml
index e715f72..8147fd5 100644
--- a/dev/devicelab/manifest.yaml
+++ b/dev/devicelab/manifest.yaml
@@ -358,6 +358,13 @@
required_agent_capabilities: ["linux/android"]
flaky: true
+ build_benchmark:
+ description: >
+ Measures APK build performance across config changes.
+ stage: devicelab
+ required_agent_capabilities: ["linux/android"]
+ flaky: true
+
# iOS on-device tests
flavors_test_ios: