Added a benchmark for ImageCache (#33814)

* Add an image cache benchmark for a monochrome image

diff --git a/dev/benchmarks/complex_layout/pubspec.yaml b/dev/benchmarks/complex_layout/pubspec.yaml
index 3b0c7e4..5cd007c 100644
--- a/dev/benchmarks/complex_layout/pubspec.yaml
+++ b/dev/benchmarks/complex_layout/pubspec.yaml
@@ -15,7 +15,7 @@
   #   //packages/flutter_tools/lib/src/commands/update_packages.dart
   # and run
   #   flutter update-packages --force-upgrade
-  flutter_gallery_assets: 0.1.8
+  flutter_gallery_assets: 0.1.9+2
 
   async: 2.2.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
   charcode: 1.1.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
@@ -82,4 +82,4 @@
     - packages/flutter_gallery_assets/people/square/ali.png
     - packages/flutter_gallery_assets/places/india_chettinad_silk_maker.png
 
-# PUBSPEC CHECKSUM: f69a
+# PUBSPEC CHECKSUM: e4f8
diff --git a/dev/benchmarks/macrobenchmarks/pubspec.yaml b/dev/benchmarks/macrobenchmarks/pubspec.yaml
index f7f56ec..8118b4a 100644
--- a/dev/benchmarks/macrobenchmarks/pubspec.yaml
+++ b/dev/benchmarks/macrobenchmarks/pubspec.yaml
@@ -15,7 +15,7 @@
   #   //packages/flutter_tools/lib/src/commands/update_packages.dart
   # and run
   #   flutter update-packages --force-upgrade
-  flutter_gallery_assets: 0.1.8
+  flutter_gallery_assets: 0.1.9+2
 
   async: 2.2.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
   charcode: 1.1.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
@@ -79,4 +79,4 @@
 flutter:
   uses-material-design: true
 
-# PUBSPEC CHECKSUM: f69a
+# PUBSPEC CHECKSUM: e4f8
diff --git a/dev/devicelab/bin/tasks/flutter_gallery__image_cache_memory.dart b/dev/devicelab/bin/tasks/flutter_gallery__image_cache_memory.dart
new file mode 100644
index 0000000..c3bc789
--- /dev/null
+++ b/dev/devicelab/bin/tasks/flutter_gallery__image_cache_memory.dart
@@ -0,0 +1,17 @@
+// 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/framework/framework.dart';
+import 'package:flutter_devicelab/framework/utils.dart';
+import 'package:flutter_devicelab/tasks/perf_tests.dart';
+
+Future<void> main() async {
+  await task(MemoryTest(
+    '${flutterDirectory.path}/examples/flutter_gallery',
+    'test_memory/image_cache_memory.dart',
+    'io.flutter.demo.gallery',
+  ).run);
+}
diff --git a/dev/devicelab/manifest.yaml b/dev/devicelab/manifest.yaml
index 9392670..02b57ce 100644
--- a/dev/devicelab/manifest.yaml
+++ b/dev/devicelab/manifest.yaml
@@ -527,6 +527,13 @@
     stage: devicelab
     required_agent_capabilities: ["linux/android"]
 
+  flutter_gallery__image_cache_memory:
+    description: >
+      Measures memory usage for a list of large red squares in smaller containers.
+    stage: devicelab
+    required_agent_capabilities: ["linux/android"]
+    flaky: true
+
   analyzer_benchmark:
     description: >
       Measures the speed of Dart analyzer.
diff --git a/examples/flutter_gallery/pubspec.yaml b/examples/flutter_gallery/pubspec.yaml
index c5aab9f..3d9e139 100644
--- a/examples/flutter_gallery/pubspec.yaml
+++ b/examples/flutter_gallery/pubspec.yaml
@@ -19,7 +19,7 @@
   shrine_images: 1.1.2
 
   # Also update dev/benchmarks/complex_layout/pubspec.yaml
-  flutter_gallery_assets: 0.1.8
+  flutter_gallery_assets: 0.1.9+2
 
   charcode: 1.1.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
   meta: 1.1.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
@@ -88,6 +88,7 @@
   assets:
     - lib/gallery/example_code.dart
     - packages/flutter_gallery_assets/people/ali_landscape.png
+    - packages/flutter_gallery_assets/monochrome/red-square-1024x1024.png
     - packages/flutter_gallery_assets/logos/flutter_white/logo.png
     - packages/flutter_gallery_assets/logos/fortnightly/fortnightly_logo.png
     - packages/flutter_gallery_assets/videos/bee.mp4
@@ -253,4 +254,4 @@
       - asset: packages/flutter_gallery_assets/fonts/merriweather/Merriweather-Regular.ttf
       - asset: packages/flutter_gallery_assets/fonts/merriweather/Merriweather-Light.ttf
 
-# PUBSPEC CHECKSUM: 7863
+# PUBSPEC CHECKSUM: 35c1
diff --git a/examples/flutter_gallery/test_memory/image_cache_memory.dart b/examples/flutter_gallery/test_memory/image_cache_memory.dart
new file mode 100644
index 0000000..6632fd7
--- /dev/null
+++ b/examples/flutter_gallery/test_memory/image_cache_memory.dart
@@ -0,0 +1,63 @@
+// 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.
+
+// See //dev/devicelab/bin/tasks/flutter_gallery__image_cache_memory.dart
+
+import 'dart:async';
+
+import 'package:flutter/widgets.dart';
+import 'package:flutter/scheduler.dart';
+import 'package:flutter_test/flutter_test.dart';
+
+// Once we provide an option for images to be resized to
+// fit the container, we should see a significant drop in
+// the amount of memory consumed by this benchmark.
+Future<void> main() async {
+  const int numItems = 10;
+
+  runApp(Directionality(
+    textDirection: TextDirection.ltr,
+    child: ListView.builder(
+      key: const Key('ImageList'),
+      itemCount: numItems,
+      itemBuilder: (BuildContext context, int position) {
+        return Container(
+          width: 200,
+          height: 200,
+          child: Center(
+            child: Image.asset(
+              'monochrome/red-square-1024x1024.png',
+              package: 'flutter_gallery_assets',
+              width: 100,
+              height: 100,
+              fit: BoxFit.contain,
+              key: Key('image_$position'),
+            ),
+          ),
+        );
+      },
+    ),
+  ));
+
+  await SchedulerBinding.instance.endOfFrame;
+
+  // We are waiting for the GPU to rasterize a frame here. This makes this flaky,
+  // we can rely on a more deterministic such as `Window.onReportTimings` once
+  // https://github.com/flutter/flutter/issues/26154 is addressed.
+  await Future<void>.delayed(const Duration(milliseconds: 50));
+  debugPrint('==== MEMORY BENCHMARK ==== READY ====');
+
+  final WidgetController controller =
+      LiveWidgetController(WidgetsBinding.instance);
+
+  debugPrint('Scrolling...');
+  final Finder list = find.byKey(const Key('ImageList'));
+  final Finder lastItem = find.byKey(const Key('image_${numItems - 1}'));
+  do {
+    await controller.drag(list, const Offset(0.0, -30.0));
+    await Future<void>.delayed(const Duration(milliseconds: 20));
+  } while (!lastItem.precache());
+
+  debugPrint('==== MEMORY BENCHMARK ==== DONE ====');
+}
diff --git a/packages/flutter_tools/lib/src/commands/update_packages.dart b/packages/flutter_tools/lib/src/commands/update_packages.dart
index 9c80937..18fdebf 100644
--- a/packages/flutter_tools/lib/src/commands/update_packages.dart
+++ b/packages/flutter_tools/lib/src/commands/update_packages.dart
@@ -21,7 +21,7 @@
 /// package version in cases when upgrading to the latest breaks Flutter.
 const Map<String, String> _kManuallyPinnedDependencies = <String, String>{
   // Add pinned packages here.
-  'flutter_gallery_assets': '0.1.8', // See //examples/flutter_gallery/pubspec.yaml
+  'flutter_gallery_assets': '0.1.9+2', // See //examples/flutter_gallery/pubspec.yaml
   'build_daemon': '0.6.1', // Crashes at 1.0
   'test': '1.6.3',     //  | Tests are timing out at 1.6.4 https://github.com/flutter/flutter/issues/33823
   'test_api': '0.2.5', //  |
diff --git a/packages/flutter_tools/pubspec.yaml b/packages/flutter_tools/pubspec.yaml
index a4cca93..55753db 100644
--- a/packages/flutter_tools/pubspec.yaml
+++ b/packages/flutter_tools/pubspec.yaml
@@ -19,7 +19,7 @@
   http: 0.12.0+2
   intl: 0.15.8
   json_rpc_2: 2.1.0
-  linter: 0.1.90
+  linter: 0.1.91
   meta: 1.1.6
   multicast_dns: 0.1.1
   mustache: 1.1.1
@@ -119,4 +119,4 @@
   # Exclude this package from the hosted API docs.
   nodoc: true
 
-# PUBSPEC CHECKSUM: ef94
+# PUBSPEC CHECKSUM: bf95