| // 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. |
| |
| /// Measure application memory usage after pausing and resuming the app |
| /// with the Android back button. |
| |
| import 'package:flutter_devicelab/framework/devices.dart'; |
| import 'package:flutter_devicelab/framework/framework.dart'; |
| import 'package:flutter_devicelab/framework/utils.dart'; |
| import 'package:flutter_devicelab/tasks/perf_tests.dart'; |
| |
| const String packageName = 'io.flutter.demo.gallery'; |
| const String activityName = 'io.flutter.demo.gallery.MainActivity'; |
| |
| class BackButtonMemoryTest extends MemoryTest { |
| BackButtonMemoryTest() : super('${flutterDirectory.path}/dev/integration_tests/flutter_gallery', 'test_memory/back_button.dart', packageName); |
| |
| @override |
| AndroidDevice? get device => super.device as AndroidDevice?; |
| |
| @override |
| int get iterationCount => 5; |
| |
| /// Perform a series of back button suspend and resume cycles. |
| @override |
| Future<void> useMemory() async { |
| await launchApp(); |
| await recordStart(); |
| for (int iteration = 0; iteration < 8; iteration += 1) { |
| print('back/forward iteration $iteration'); |
| |
| // Push back button, wait for it to be seen by the Flutter app. |
| prepareForNextMessage('AppLifecycleState.paused'); |
| await device!.shellExec('input', <String>['keyevent', 'KEYCODE_BACK']); |
| await receivedNextMessage; |
| |
| // Give Android time to settle (e.g. run GCs) after closing the app. |
| await Future<void>.delayed(const Duration(milliseconds: 100)); |
| |
| // Relaunch the app, wait for it to launch. |
| prepareForNextMessage('READY'); |
| final String output = await device!.shellEval('am', <String>['start', '-n', '$packageName/$activityName']); |
| print('adb shell am start: $output'); |
| if (output.contains('Error')) { |
| fail('unable to launch activity'); |
| } |
| await receivedNextMessage; |
| |
| // Wait for the Flutter app to settle (e.g. run GCs). |
| await Future<void>.delayed(const Duration(milliseconds: 100)); |
| } |
| await recordEnd(); |
| } |
| } |
| |
| Future<void> main() async { |
| deviceOperatingSystem = DeviceOperatingSystem.android; |
| await task(BackButtonMemoryTest().run); |
| } |