diff --git a/dev/devicelab/bin/tasks/flutter_gallery__back_button_memory.dart b/dev/devicelab/bin/tasks/flutter_gallery__back_button_memory.dart new file mode 100644 index 00000000000..a7880307a8f --- /dev/null +++ b/dev/devicelab/bin/tasks/flutter_gallery__back_button_memory.dart @@ -0,0 +1,12 @@ +// Copyright 2016 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/tasks/perf_tests.dart'; +import 'package:flutter_devicelab/framework/framework.dart'; + +Future main() async { + await task(createGalleryBackButtonMemoryTest()); +} diff --git a/dev/devicelab/lib/tasks/perf_tests.dart b/dev/devicelab/lib/tasks/perf_tests.dart index 77788604b61..e3cc5b35929 100644 --- a/dev/devicelab/lib/tasks/perf_tests.dart +++ b/dev/devicelab/lib/tasks/perf_tests.dart @@ -60,6 +60,13 @@ TaskFunction createGalleryNavigationMemoryTest() { ); } +TaskFunction createGalleryBackButtonMemoryTest() { + return new AndroidBackButtonMemoryTest( + '${flutterDirectory.path}/examples/flutter_gallery', + 'io.flutter.examples.gallery', + ); +} + /// Measure application startup performance. class StartupTest { static const Duration _startupTimeout = const Duration(minutes: 2); @@ -256,3 +263,55 @@ class MemoryTest { }); } } + +/// Measure application memory usage after pausing and resuming the app +/// with the Android back button. +class AndroidBackButtonMemoryTest { + final String testDirectory; + final String packageName; + + AndroidBackButtonMemoryTest(this.testDirectory, this.packageName); + + Future call() { + return inDirectory(testDirectory, () async { + if (deviceOperatingSystem != DeviceOperatingSystem.android) { + throw 'This test is only supported on Android'; + } + + AndroidDevice device = await devices.workingDevice; + await device.unlock(); + String deviceId = device.deviceId; + await flutter('packages', options: ['get']); + + await flutter('run', options: [ + '-v', + '--profile', + '--trace-startup', // wait for the first frame to render + '-d', + deviceId, + ]); + + Map startData = await device.getMemoryStats(packageName); + + Map data = { + 'start_total_kb': startData['total_kb'], + }; + + // Perform a series of back button suspend and resume cycles. + for (int i = 0; i < 10; i++) { + device.shellExec('input', ['keyevent', 'KEYCODE_BACK']); + await new Future.delayed(new Duration(milliseconds: 1000)); + device.shellExec('am', ['start', '-n', 'io.flutter.examples.gallery/org.domokit.sky.shell.SkyActivity']); + await new Future.delayed(new Duration(milliseconds: 1000)); + } + + Map endData = await device.getMemoryStats(packageName); + data['end_total_kb'] = endData['total_kb']; + data['diff_total_kb'] = endData['total_kb'] - startData['total_kb']; + + await device.stop(packageName); + + return new TaskResult.success(data, benchmarkScoreKeys: data.keys.toList()); + }); + } +} diff --git a/dev/devicelab/manifest.yaml b/dev/devicelab/manifest.yaml index 3d9b80d0e38..b6f5a169142 100644 --- a/dev/devicelab/manifest.yaml +++ b/dev/devicelab/manifest.yaml @@ -127,6 +127,12 @@ tasks: stage: devicelab required_agent_capabilities: ["has-android-device"] + flutter_gallery__back_button_memory: + description: > + Measures memory usage after Android app suspend and resume. + stage: devicelab + required_agent_capabilities: ["has-android-device"] + # iOS on-device tests