Add Sliders to `macrobenchmarks` (#125296)

This adds a performance test for `Slider` and `RangeSlider` to run on Android.
This is to measure upcoming changes to these widgets and compare their performance. 

https://user-images.githubusercontent.com/48603081/233633349-0bcad3c3-04a9-42dd-acd0-46b76ce51178.mp4
diff --git a/dev/benchmarks/macrobenchmarks/lib/common.dart b/dev/benchmarks/macrobenchmarks/lib/common.dart
index 372e5b2..92b4729 100644
--- a/dev/benchmarks/macrobenchmarks/lib/common.dart
+++ b/dev/benchmarks/macrobenchmarks/lib/common.dart
@@ -34,6 +34,7 @@
 const String kAnimatedComplexImageFilteredPerfRouteName = '/animated_complex_image_filtered';
 const String kListTextLayoutRouteName = '/list_text_layout';
 const String kAnimatedBlurBackdropFilter = '/animated_blur_backdrop_filter';
+const String kSlidersRouteName = '/sliders';
 
 const String kOpacityPeepholeOneRectRouteName = '$kOpacityPeepholeRouteName/one_big_rect';
 const String kOpacityPeepholeColumnOfOpacityRouteName = '$kOpacityPeepholeRouteName/column_of_opacity';
diff --git a/dev/benchmarks/macrobenchmarks/lib/main.dart b/dev/benchmarks/macrobenchmarks/lib/main.dart
index 720125f..2479e39 100644
--- a/dev/benchmarks/macrobenchmarks/lib/main.dart
+++ b/dev/benchmarks/macrobenchmarks/lib/main.dart
@@ -34,6 +34,7 @@
 import 'src/shader_mask_cache.dart';
 import 'src/simple_animation.dart';
 import 'src/simple_scroll.dart';
+import 'src/sliders.dart';
 import 'src/stack_size.dart';
 import 'src/text.dart';
 
@@ -85,6 +86,7 @@
         kListTextLayoutRouteName: (BuildContext context) => const ColumnOfText(),
         kAnimatedComplexImageFilteredPerfRouteName: (BuildContext context) => const AnimatedComplexImageFiltered(),
         kAnimatedBlurBackdropFilter: (BuildContext context) => const AnimatedBlurBackdropFilter(),
+        kSlidersRouteName: (BuildContext context) => const SlidersPage(),
       },
     );
   }
@@ -319,6 +321,13 @@
               Navigator.pushNamed(context, kAnimatedBlurBackdropFilter);
             },
           ),
+          ElevatedButton(
+            key: const Key(kSlidersRouteName),
+            child: const Text('Sliders'),
+            onPressed: () {
+              Navigator.pushNamed(context, kSlidersRouteName);
+            },
+          ),
         ],
       ),
     );
diff --git a/dev/benchmarks/macrobenchmarks/lib/src/sliders.dart b/dev/benchmarks/macrobenchmarks/lib/src/sliders.dart
new file mode 100644
index 0000000..8ea0a45
--- /dev/null
+++ b/dev/benchmarks/macrobenchmarks/lib/src/sliders.dart
@@ -0,0 +1,65 @@
+// 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:ui';
+
+import 'package:flutter/material.dart';
+
+class SlidersPage extends StatefulWidget {
+  const SlidersPage({super.key});
+
+  @override
+  State<SlidersPage> createState() => _SlidersPageState();
+}
+
+class _SlidersPageState extends State<SlidersPage> with TickerProviderStateMixin {
+ late AnimationController _sliderController;
+  late Animation<double> _sliderAnimation;
+  double _sliderValue = 0.0;
+  RangeValues _rangeSliderValues = const RangeValues(0.0, 1.0);
+
+  @override
+  void initState() {
+    super.initState();
+    _sliderController = AnimationController(
+      duration: const Duration(seconds: 1),
+      vsync: this,
+    )..repeat();
+    _sliderAnimation = Tween<double>(begin: 0, end: 1).animate(_sliderController)
+      ..addListener(() {
+        setState(() {
+          _sliderValue = _sliderAnimation.value;
+          _rangeSliderValues = RangeValues(
+            clampDouble(_sliderAnimation.value, 0, 0.45),
+            1.0 - clampDouble(_sliderAnimation.value, 0, 0.45),
+          );
+        });
+      });
+  }
+
+  @override
+  void dispose() {
+    _sliderController.dispose();
+    super.dispose();
+  }
+
+  @override
+  Widget build(BuildContext context) {
+    return Material(
+      child: Column(
+        mainAxisAlignment: MainAxisAlignment.center,
+        children: <Widget>[
+          Slider(
+            value: _sliderValue,
+            onChanged: (double value) { },
+          ),
+          RangeSlider(
+            values: _rangeSliderValues,
+            onChanged: (RangeValues values) { },
+          ),
+        ],
+      ),
+    );
+  }
+}
diff --git a/dev/benchmarks/macrobenchmarks/test_driver/sliders_perf_test.dart b/dev/benchmarks/macrobenchmarks/test_driver/sliders_perf_test.dart
new file mode 100644
index 0000000..b46a632
--- /dev/null
+++ b/dev/benchmarks/macrobenchmarks/test_driver/sliders_perf_test.dart
@@ -0,0 +1,16 @@
+// 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 'package:macrobenchmarks/common.dart';
+
+import 'util.dart';
+
+void main() {
+  macroPerfTest(
+    'sliders_perf',
+    kSlidersRouteName,
+    pageDelay: const Duration(seconds: 1),
+    duration: const Duration(seconds: 10),
+  );
+}
diff --git a/dev/devicelab/bin/tasks/slider_perf_android.dart b/dev/devicelab/bin/tasks/slider_perf_android.dart
new file mode 100644
index 0000000..a7c2481
--- /dev/null
+++ b/dev/devicelab/bin/tasks/slider_perf_android.dart
@@ -0,0 +1,14 @@
+// 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:async';
+
+import 'package:flutter_devicelab/framework/devices.dart';
+import 'package:flutter_devicelab/framework/framework.dart';
+import 'package:flutter_devicelab/tasks/perf_tests.dart';
+
+Future<void> main() async {
+  deviceOperatingSystem = DeviceOperatingSystem.android;
+  await task(createSlidersPerfTest());
+}
diff --git a/dev/devicelab/lib/tasks/perf_tests.dart b/dev/devicelab/lib/tasks/perf_tests.dart
index b3bdfb1..a495114 100644
--- a/dev/devicelab/lib/tasks/perf_tests.dart
+++ b/dev/devicelab/lib/tasks/perf_tests.dart
@@ -308,6 +308,15 @@
   ).run;
 }
 
+TaskFunction createSlidersPerfTest() {
+  return PerfTest(
+    '${flutterDirectory.path}/dev/benchmarks/macrobenchmarks',
+    'test_driver/run_app.dart',
+    'sliders_perf',
+    testDriver: 'test_driver/sliders_perf_test.dart',
+  ).run;
+}
+
 TaskFunction createStackSizeTest() {
   final String testDirectory =
       '${flutterDirectory.path}/dev/benchmarks/macrobenchmarks';