Declare locals as final where not reassigned (dev) (#8574)

diff --git a/dev/benchmarks/complex_layout/lib/main.dart b/dev/benchmarks/complex_layout/lib/main.dart
index 3157029..1d74418 100644
--- a/dev/benchmarks/complex_layout/lib/main.dart
+++ b/dev/benchmarks/complex_layout/lib/main.dart
@@ -449,7 +449,7 @@
 
   @override
   Widget build(BuildContext context) {
-    List<String> tabNames = <String>[
+    final List<String> tabNames = <String>[
       'A', 'B', 'C', 'D'
     ];
 
diff --git a/dev/benchmarks/complex_layout/test_driver/scroll_perf_test.dart b/dev/benchmarks/complex_layout/test_driver/scroll_perf_test.dart
index f33a356..29e97d6 100644
--- a/dev/benchmarks/complex_layout/test_driver/scroll_perf_test.dart
+++ b/dev/benchmarks/complex_layout/test_driver/scroll_perf_test.dart
@@ -20,9 +20,9 @@
     });
 
     test('measure', () async {
-      Timeline timeline = await driver.traceAction(() async {
+      final Timeline timeline = await driver.traceAction(() async {
         // Find the scrollable stock list
-        SerializableFinder stockList = find.byValueKey('main-scroll');
+        final SerializableFinder stockList = find.byValueKey('main-scroll');
         expect(stockList, isNotNull);
 
         // Scroll down
@@ -38,7 +38,7 @@
         }
       });
 
-      TimelineSummary summary = new TimelineSummary.summarize(timeline);
+      final TimelineSummary summary = new TimelineSummary.summarize(timeline);
       summary.writeSummaryToFile('complex_layout_scroll_perf', pretty: true);
       summary.writeTimelineToFile('complex_layout_scroll_perf', pretty: true);
     });
diff --git a/dev/benchmarks/microbenchmarks/lib/common.dart b/dev/benchmarks/microbenchmarks/lib/common.dart
index 5100fe3..cb695f1 100644
--- a/dev/benchmarks/microbenchmarks/lib/common.dart
+++ b/dev/benchmarks/microbenchmarks/lib/common.dart
@@ -54,7 +54,7 @@
   }
 
   String _printPlainText() {
-    StringBuffer buf = new StringBuffer();
+    final StringBuffer buf = new StringBuffer();
     for (_BenchmarkResult result in _results) {
       buf.writeln('${result.description}: ${result.value.toStringAsFixed(1)} ${result.unit}');
     }
diff --git a/dev/benchmarks/microbenchmarks/lib/gestures/velocity_tracker_bench.dart b/dev/benchmarks/microbenchmarks/lib/gestures/velocity_tracker_bench.dart
index 6c9beed..6c9cf68 100644
--- a/dev/benchmarks/microbenchmarks/lib/gestures/velocity_tracker_bench.dart
+++ b/dev/benchmarks/microbenchmarks/lib/gestures/velocity_tracker_bench.dart
@@ -24,7 +24,7 @@
   }
   watch.stop();
 
-  BenchmarkResultPrinter printer = new BenchmarkResultPrinter();
+  final BenchmarkResultPrinter printer = new BenchmarkResultPrinter();
   printer.addResult(
     description: 'Velocity tracker',
     value: watch.elapsedMicroseconds / _kNumIters,
diff --git a/dev/benchmarks/microbenchmarks/lib/stocks/animation_bench.dart b/dev/benchmarks/microbenchmarks/lib/stocks/animation_bench.dart
index 5312bed..7918fa9 100644
--- a/dev/benchmarks/microbenchmarks/lib/stocks/animation_bench.dart
+++ b/dev/benchmarks/microbenchmarks/lib/stocks/animation_bench.dart
@@ -75,7 +75,7 @@
     }
   });
 
-  BenchmarkResultPrinter printer = new BenchmarkResultPrinter();
+  final BenchmarkResultPrinter printer = new BenchmarkResultPrinter();
   printer.addResult(
     description: 'Stock animation',
     value: wallClockWatch.elapsedMicroseconds / (1000 * 1000),
diff --git a/dev/benchmarks/microbenchmarks/lib/stocks/build_bench.dart b/dev/benchmarks/microbenchmarks/lib/stocks/build_bench.dart
index 9edc02c..37f6474 100644
--- a/dev/benchmarks/microbenchmarks/lib/stocks/build_bench.dart
+++ b/dev/benchmarks/microbenchmarks/lib/stocks/build_bench.dart
@@ -21,7 +21,7 @@
 
   // This allows us to call onBeginFrame even when the engine didn't request it,
   // and have it actually do something:
-  LiveTestWidgetsFlutterBinding binding = TestWidgetsFlutterBinding.ensureInitialized();
+  final LiveTestWidgetsFlutterBinding binding = TestWidgetsFlutterBinding.ensureInitialized();
   binding.allowAllFrames = true;
 
   final Stopwatch watch = new Stopwatch();
@@ -50,7 +50,7 @@
     watch.stop();
   });
 
-  BenchmarkResultPrinter printer = new BenchmarkResultPrinter();
+  final BenchmarkResultPrinter printer = new BenchmarkResultPrinter();
   printer.addResult(
     description: 'Stock build',
     value: watch.elapsedMicroseconds / iterations,
diff --git a/dev/benchmarks/microbenchmarks/lib/stocks/layout_bench.dart b/dev/benchmarks/microbenchmarks/lib/stocks/layout_bench.dart
index d2d83c8..b317210 100644
--- a/dev/benchmarks/microbenchmarks/lib/stocks/layout_bench.dart
+++ b/dev/benchmarks/microbenchmarks/lib/stocks/layout_bench.dart
@@ -20,7 +20,7 @@
 
   // This allows us to call onBeginFrame even when the engine didn't request it,
   // and have it actually do something:
-  LiveTestWidgetsFlutterBinding binding = TestWidgetsFlutterBinding.ensureInitialized();
+  final LiveTestWidgetsFlutterBinding binding = TestWidgetsFlutterBinding.ensureInitialized();
   binding.allowAllFrames = true;
 
   final Stopwatch watch = new Stopwatch();
@@ -51,7 +51,7 @@
     watch.stop();
   });
 
-  BenchmarkResultPrinter printer = new BenchmarkResultPrinter();
+  final BenchmarkResultPrinter printer = new BenchmarkResultPrinter();
   printer.addResult(
     description: 'Stock layout',
     value: watch.elapsedMicroseconds / iterations,
diff --git a/dev/bots/test.dart b/dev/bots/test.dart
index 737c54a..5c2a505 100644
--- a/dev/bots/test.dart
+++ b/dev/bots/test.dart
@@ -31,7 +31,7 @@
     print('\x1B[32mDONE: Analysis successful.\x1B[0m');
   } else {
     // Verify that the tests actually return failure on failure and success on success.
-    String automatedTests = p.join(flutterRoot, 'dev', 'automated_tests');
+    final String automatedTests = p.join(flutterRoot, 'dev', 'automated_tests');
     await _runFlutterTest(automatedTests,
       script: p.join('test_smoke_test', 'fail_test.dart'),
       expectFailure: true,
@@ -67,7 +67,7 @@
       printOutput: false,
     );
 
-    List<String> coverageFlags = <String>[];
+    final List<String> coverageFlags = <String>[];
     if (Platform.environment['TRAVIS'] != null && Platform.environment['TRAVIS_PULL_REQUEST'] == 'false')
       coverageFlags.add('--coverage');
 
@@ -100,15 +100,15 @@
   bool printOutput: true,
   bool skip: false,
 }) async {
-  String cmd = '${p.relative(executable)} ${arguments.join(' ')}';
-  String relativeWorkingDir = p.relative(workingDirectory);
+  final String cmd = '${p.relative(executable)} ${arguments.join(' ')}';
+  final String relativeWorkingDir = p.relative(workingDirectory);
   if (skip) {
     _printProgress('SKIPPING', relativeWorkingDir, cmd);
     return null;
   }
   _printProgress('RUNNING', relativeWorkingDir, cmd);
 
-  Process process = await Process.start(executable, arguments,
+  final Process process = await Process.start(executable, arguments,
     workingDirectory: workingDirectory,
     environment: environment,
   );
@@ -118,7 +118,7 @@
     stderr.addStream(process.stderr);
   }
 
-  int exitCode = await process.exitCode;
+  final int exitCode = await process.exitCode;
   if ((exitCode == 0) == expectFailure) {
     print(
       '\x1B[31m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\x1B[0m\n'
@@ -136,7 +136,7 @@
     List<String> options: const <String>[],
     bool skip: false,
 }) {
-  List<String> args = <String>['test']..addAll(options);
+  final List<String> args = <String>['test']..addAll(options);
   if (flutterTestArgs != null)
     args.add(flutterTestArgs);
   if (script != null)
@@ -152,7 +152,7 @@
 Future<Null> _runAllDartTests(String workingDirectory, {
   Map<String, String> environment,
 }) {
-  List<String> args = <String>['--checked', p.join('test', 'all.dart')];
+  final List<String> args = <String>['--checked', p.join('test', 'all.dart')];
   return _runCmd(dart, args,
     workingDirectory: workingDirectory,
     environment: environment,
diff --git a/dev/devicelab/bin/run.dart b/dev/devicelab/bin/run.dart
index 0f68388..9400b1f 100644
--- a/dev/devicelab/bin/run.dart
+++ b/dev/devicelab/bin/run.dart
@@ -33,14 +33,14 @@
 
   if (!args.wasParsed('task')) {
     if (args.wasParsed('stage')) {
-      String stageName = args['stage'];
-      List<ManifestTask> tasks = loadTaskManifest().tasks;
+      final String stageName = args['stage'];
+      final List<ManifestTask> tasks = loadTaskManifest().tasks;
       for (ManifestTask task in tasks) {
         if (task.stage == stageName)
           _taskNames.add(task.name);
       }
     } else if (args.wasParsed('all')) {
-      List<ManifestTask> tasks = loadTaskManifest().tasks;
+      final List<ManifestTask> tasks = loadTaskManifest().tasks;
       for (ManifestTask task in tasks) {
         _taskNames.add(task.name);
       }
@@ -53,11 +53,11 @@
     return null;
   }
 
-  bool silent = args['silent'];
+  final bool silent = args['silent'];
 
   for (String taskName in _taskNames) {
     section('Running task "$taskName"');
-    Map<String, dynamic> result = await runTask(taskName, silent: silent);
+    final Map<String, dynamic> result = await runTask(taskName, silent: silent);
 
     if (!result['success'])
       exitCode = 1;
@@ -82,8 +82,8 @@
         'This option may be repeated to specify multiple tasks.',
     callback: (List<String> value) {
       for (String nameOrPath in value) {
-        List<String> fragments = path.split(nameOrPath);
-        bool isDartFile = fragments.last.endsWith('.dart');
+        final List<String> fragments = path.split(nameOrPath);
+        final bool isDartFile = fragments.last.endsWith('.dart');
 
         if (fragments.length == 1 && !isDartFile) {
           // Not a path
diff --git a/dev/devicelab/bin/tasks/analyzer_cli__analysis_time.dart b/dev/devicelab/bin/tasks/analyzer_cli__analysis_time.dart
index 7b0ebca..50ee992 100644
--- a/dev/devicelab/bin/tasks/analyzer_cli__analysis_time.dart
+++ b/dev/devicelab/bin/tasks/analyzer_cli__analysis_time.dart
@@ -9,9 +9,9 @@
 import 'package:flutter_devicelab/framework/utils.dart';
 
 Future<Null> main() async {
-  String revision = await getCurrentFlutterRepoCommit();
-  DateTime revisionTimestamp = await getFlutterRepoCommitTimestamp(revision);
-  String dartSdkVersion = await getDartVersion();
+  final String revision = await getCurrentFlutterRepoCommit();
+  final DateTime revisionTimestamp = await getFlutterRepoCommitTimestamp(revision);
+  final String dartSdkVersion = await getDartVersion();
   await task(createAnalyzerCliTest(
     sdk: dartSdkVersion,
     commit: revision,
diff --git a/dev/devicelab/bin/tasks/analyzer_server__analysis_time.dart b/dev/devicelab/bin/tasks/analyzer_server__analysis_time.dart
index c02b537..922c8ce 100644
--- a/dev/devicelab/bin/tasks/analyzer_server__analysis_time.dart
+++ b/dev/devicelab/bin/tasks/analyzer_server__analysis_time.dart
@@ -9,9 +9,9 @@
 import 'package:flutter_devicelab/framework/utils.dart';
 
 Future<Null> main() async {
-  String revision = await getCurrentFlutterRepoCommit();
-  DateTime revisionTimestamp = await getFlutterRepoCommitTimestamp(revision);
-  String dartSdkVersion = await getDartVersion();
+  final String revision = await getCurrentFlutterRepoCommit();
+  final DateTime revisionTimestamp = await getFlutterRepoCommitTimestamp(revision);
+  final String dartSdkVersion = await getDartVersion();
   await task(createAnalyzerServerTest(
     sdk: dartSdkVersion,
     commit: revision,
diff --git a/dev/devicelab/bin/tasks/hot_mode_dev_cycle__benchmark.dart b/dev/devicelab/bin/tasks/hot_mode_dev_cycle__benchmark.dart
index 9eeb3bd..1b56bf9 100644
--- a/dev/devicelab/bin/tasks/hot_mode_dev_cycle__benchmark.dart
+++ b/dev/devicelab/bin/tasks/hot_mode_dev_cycle__benchmark.dart
@@ -12,11 +12,11 @@
 
 void main() {
   task(() async {
-    Device device = await devices.workingDevice;
+    final Device device = await devices.workingDevice;
     await device.unlock();
-    Directory appDir =
+    final Directory appDir =
         dir(path.join(flutterDirectory.path, 'examples/flutter_gallery'));
-    File benchmarkFile = file(path.join(appDir.path, 'hot_benchmark.json'));
+    final File benchmarkFile = file(path.join(appDir.path, 'hot_benchmark.json'));
     rm(benchmarkFile);
     await inDirectory(appDir, () async {
       return await flutter('run',
diff --git a/dev/devicelab/bin/tasks/technical_debt__cost.dart b/dev/devicelab/bin/tasks/technical_debt__cost.dart
index b80aae0..14af901 100644
--- a/dev/devicelab/bin/tasks/technical_debt__cost.dart
+++ b/dev/devicelab/bin/tasks/technical_debt__cost.dart
@@ -39,7 +39,7 @@
 
 Future<Null> main() async {
   await task(() async {
-    Process git = await startProcess(
+    final Process git = await startProcess(
       'git',
       <String>['ls-files', '--full-name', flutterDirectory.path],
       workingDirectory: flutterDirectory.path,
@@ -47,7 +47,7 @@
     double total = 0.0;
     await for (String entry in git.stdout.transform(UTF8.decoder).transform(const LineSplitter()))
       total += await findCostsForFile(new File(path.join(flutterDirectory.path, entry)));
-    int gitExitCode = await git.exitCode;
+    final int gitExitCode = await git.exitCode;
     if (gitExitCode != 0)
       throw new Exception('git exit with unexpected error code $gitExitCode');
     return new TaskResult.success(
diff --git a/dev/devicelab/lib/framework/adb.dart b/dev/devicelab/lib/framework/adb.dart
index 6b707eb..ebaaf5c 100644
--- a/dev/devicelab/lib/framework/adb.dart
+++ b/dev/devicelab/lib/framework/adb.dart
@@ -118,7 +118,7 @@
   /// [workingDevice].
   @override
   Future<Null> chooseWorkingDevice() async {
-    List<Device> allDevices = (await discoverDevices())
+    final List<Device> allDevices = (await discoverDevices())
       .map((String id) => new AndroidDevice(deviceId: id))
       .toList();
 
@@ -131,9 +131,9 @@
 
   @override
   Future<List<String>> discoverDevices() async {
-    List<String> output = (await eval(adbPath, <String>['devices', '-l'], canFail: false))
+    final List<String> output = (await eval(adbPath, <String>['devices', '-l'], canFail: false))
         .trim().split('\n');
-    List<String> results = <String>[];
+    final List<String> results = <String>[];
     for (String line in output) {
       // Skip lines like: * daemon started successfully *
       if (line.startsWith('* daemon '))
@@ -143,10 +143,10 @@
         continue;
 
       if (_kDeviceRegex.hasMatch(line)) {
-        Match match = _kDeviceRegex.firstMatch(line);
+        final Match match = _kDeviceRegex.firstMatch(line);
 
-        String deviceID = match[1];
-        String deviceState = match[2];
+        final String deviceID = match[1];
+        final String deviceState = match[2];
 
         if (!const <String>['unauthorized', 'offline'].contains(deviceState)) {
           results.add(deviceID);
@@ -161,10 +161,10 @@
 
   @override
   Future<Map<String, HealthCheckResult>> checkDevices() async {
-    Map<String, HealthCheckResult> results = <String, HealthCheckResult>{};
+    final Map<String, HealthCheckResult> results = <String, HealthCheckResult>{};
     for (String deviceId in await discoverDevices()) {
       try {
-        AndroidDevice device = new AndroidDevice(deviceId: deviceId);
+        final AndroidDevice device = new AndroidDevice(deviceId: deviceId);
         // Just a smoke test that we can read wakefulness state
         // TODO(yjbanov): check battery level
         await device._getWakefulness();
@@ -240,8 +240,8 @@
   ///
   /// See: https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/os/PowerManagerInternal.java
   Future<String> _getWakefulness() async {
-    String powerInfo = await shellEval('dumpsys', <String>['power']);
-    String wakefulness = grep('mWakefulness=', from: powerInfo).single.split('=')[1].trim();
+    final String powerInfo = await shellEval('dumpsys', <String>['power']);
+    final String wakefulness = grep('mWakefulness=', from: powerInfo).single.split('=')[1].trim();
     return wakefulness;
   }
 
@@ -257,8 +257,8 @@
 
   @override
   Future<Map<String, dynamic>> getMemoryStats(String packageName) async {
-    String meminfo = await shellEval('dumpsys', <String>['meminfo', packageName]);
-    Match match = new RegExp(r'TOTAL\s+(\d+)').firstMatch(meminfo);
+    final String meminfo = await shellEval('dumpsys', <String>['meminfo', packageName]);
+    final Match match = new RegExp(r'TOTAL\s+(\d+)').firstMatch(meminfo);
     return <String, dynamic>{
       'total_kb': int.parse(match.group(1)),
     };
@@ -295,7 +295,7 @@
   /// [workingDevice].
   @override
   Future<Null> chooseWorkingDevice() async {
-    List<IosDevice> allDevices = (await discoverDevices())
+    final List<IosDevice> allDevices = (await discoverDevices())
       .map((String id) => new IosDevice(deviceId: id))
       .toList();
 
@@ -309,7 +309,7 @@
   @override
   Future<List<String>> discoverDevices() async {
     // TODO: use the -k UniqueDeviceID option, which requires much less parsing.
-    List<String> iosDeviceIds = grep('UniqueDeviceID', from: await eval('ideviceinfo', <String>[]))
+    final List<String> iosDeviceIds = grep('UniqueDeviceID', from: await eval('ideviceinfo', <String>[]))
       .map((String line) => line.split(' ').last).toList();
 
     if (iosDeviceIds.isEmpty)
@@ -320,7 +320,7 @@
 
   @override
   Future<Map<String, HealthCheckResult>> checkDevices() async {
-    Map<String, HealthCheckResult> results = <String, HealthCheckResult>{};
+    final Map<String, HealthCheckResult> results = <String, HealthCheckResult>{};
     for (String deviceId in await discoverDevices()) {
       // TODO: do a more meaningful connectivity check than just recording the ID
       results['ios-device-$deviceId'] = new HealthCheckResult.success();
@@ -376,13 +376,13 @@
 
 /// Path to the `adb` executable.
 String get adbPath {
-  String androidHome = Platform.environment['ANDROID_HOME'];
+  final String androidHome = Platform.environment['ANDROID_HOME'];
 
   if (androidHome == null)
     throw 'ANDROID_HOME environment variable missing. This variable must '
         'point to the Android SDK directory containing platform-tools.';
 
-  File adbPath = file(path.join(androidHome, 'platform-tools/adb'));
+  final File adbPath = file(path.join(androidHome, 'platform-tools/adb'));
 
   if (!adbPath.existsSync()) throw 'adb not found at: $adbPath';
 
diff --git a/dev/devicelab/lib/framework/benchmarks.dart b/dev/devicelab/lib/framework/benchmarks.dart
index 7eccabe..b4bddfc 100644
--- a/dev/devicelab/lib/framework/benchmarks.dart
+++ b/dev/devicelab/lib/framework/benchmarks.dart
@@ -33,7 +33,7 @@
 }) async {
   await benchmark.init();
 
-  List<num> allRuns = <num>[];
+  final List<num> allRuns = <num>[];
 
   num minValue;
 
@@ -46,7 +46,7 @@
     print('');
 
     try {
-      num result = await benchmark.run();
+      final num result = await benchmark.run();
       allRuns.add(result);
 
       if (minValue == null || result < minValue) {
diff --git a/dev/devicelab/lib/framework/framework.dart b/dev/devicelab/lib/framework/framework.dart
index 71cf696..5d6d88a 100644
--- a/dev/devicelab/lib/framework/framework.dart
+++ b/dev/devicelab/lib/framework/framework.dart
@@ -43,7 +43,7 @@
     print('${rec.level.name}: ${rec.time}: ${rec.message}');
   });
 
-  _TaskRunner runner = new _TaskRunner(task);
+  final _TaskRunner runner = new _TaskRunner(task);
   runner.keepVmAliveUntilTaskRunRequested();
   return runner.whenDone;
 }
@@ -63,7 +63,7 @@
   _TaskRunner(this.task) {
     registerExtension('ext.cocoonRunTask',
         (String method, Map<String, String> parameters) async {
-      TaskResult result = await run();
+      final TaskResult result = await run();
       return new ServiceExtensionResponse.result(JSON.encode(result.toJson()));
     });
     registerExtension('ext.cocoonRunnerReady',
@@ -78,7 +78,7 @@
   Future<TaskResult> run() async {
     try {
       _taskStarted = true;
-      TaskResult result = await _performTask().timeout(taskTimeout);
+      final TaskResult result = await _performTask().timeout(taskTimeout);
       _completer.complete(result);
       return result;
     } on TimeoutException catch (_) {
@@ -117,11 +117,11 @@
   }
 
   Future<TaskResult> _performTask() {
-    Completer<TaskResult> completer = new Completer<TaskResult>();
+    final Completer<TaskResult> completer = new Completer<TaskResult>();
     Chain.capture(() async {
       completer.complete(await task());
     }, onError: (dynamic taskError, Chain taskErrorStack) {
-      String message = 'Task failed: $taskError';
+      final String message = 'Task failed: $taskError';
       stderr
         ..writeln(message)
         ..writeln('\nStack trace:')
@@ -210,7 +210,7 @@
   ///       "reason": failure reason string valid only for unsuccessful results
   ///     }
   Map<String, dynamic> toJson() {
-    Map<String, dynamic> json = <String, dynamic>{
+    final Map<String, dynamic> json = <String, dynamic>{
       'success': succeeded,
     };
 
diff --git a/dev/devicelab/lib/framework/manifest.dart b/dev/devicelab/lib/framework/manifest.dart
index 2bc9706..3eac7a1 100644
--- a/dev/devicelab/lib/framework/manifest.dart
+++ b/dev/devicelab/lib/framework/manifest.dart
@@ -9,7 +9,7 @@
 
 /// Loads manifest data from `manifest.yaml` file or from [yaml], if present.
 Manifest loadTaskManifest([ String yaml ]) {
-  dynamic manifestYaml = yaml == null
+  final dynamic manifestYaml = yaml == null
     ? loadYaml(file('manifest.yaml').readAsStringSync())
     : loadYamlNode(yaml);
 
@@ -33,7 +33,7 @@
     @required this.stage,
     @required this.requiredAgentCapabilities,
   }) {
-    String taskName = 'task "$name"';
+    final String taskName = 'task "$name"';
     _checkIsNotBlank(name, 'Task name', taskName);
     _checkIsNotBlank(description, 'Task description', taskName);
     _checkIsNotBlank(stage, 'Task stage', taskName);
@@ -84,7 +84,7 @@
     'required_agent_capabilities',
   ]);
 
-  List<String> capabilities = _validateAndParseCapabilities(taskName, taskYaml['required_agent_capabilities']);
+  final List<String> capabilities = _validateAndParseCapabilities(taskName, taskYaml['required_agent_capabilities']);
   return new ManifestTask._(
     name: taskName,
     description: taskYaml['description'],
@@ -96,7 +96,7 @@
 List<String> _validateAndParseCapabilities(String taskName, dynamic capabilitiesYaml) {
   _checkType(capabilitiesYaml is List, capabilitiesYaml, 'required_agent_capabilities', 'list');
   for (int i = 0; i < capabilitiesYaml.length; i++) {
-    dynamic capability = capabilitiesYaml[i];
+    final dynamic capability = capabilitiesYaml[i];
     _checkType(capability is String, capability, 'required_agent_capabilities[$i]', 'string');
   }
   return capabilitiesYaml;
diff --git a/dev/devicelab/lib/framework/runner.dart b/dev/devicelab/lib/framework/runner.dart
index 49136f2..c4fcac2 100644
--- a/dev/devicelab/lib/framework/runner.dart
+++ b/dev/devicelab/lib/framework/runner.dart
@@ -23,13 +23,13 @@
 /// Running the task in [silent] mode will suppress standard output from task
 /// processes and only print standard errors.
 Future<Map<String, dynamic>> runTask(String taskName, { bool silent: false }) async {
-  String taskExecutable = 'bin/tasks/$taskName.dart';
+  final String taskExecutable = 'bin/tasks/$taskName.dart';
 
   if (!file(taskExecutable).existsSync())
     throw 'Executable Dart file not found: $taskExecutable';
 
-  int vmServicePort = await findAvailablePort();
-  Process runner = await startProcess(dartBin, <String>[
+  final int vmServicePort = await findAvailablePort();
+  final Process runner = await startProcess(dartBin, <String>[
     '--enable-vm-service=$vmServicePort',
     '--no-pause-isolates-on-exit',
     taskExecutable,
@@ -41,7 +41,7 @@
     runnerFinished = true;
   });
 
-  StreamSubscription<String> stdoutSub = runner.stdout
+  final StreamSubscription<String> stdoutSub = runner.stdout
       .transform(const Utf8Decoder())
       .transform(const LineSplitter())
       .listen((String line) {
@@ -50,7 +50,7 @@
     }
   });
 
-  StreamSubscription<String> stderrSub = runner.stderr
+  final StreamSubscription<String> stderrSub = runner.stderr
       .transform(const Utf8Decoder())
       .transform(const LineSplitter())
       .listen((String line) {
@@ -59,9 +59,9 @@
 
   String waitingFor = 'connection';
   try {
-    VMIsolateRef isolate = await _connectToRunnerIsolate(vmServicePort);
+    final VMIsolateRef isolate = await _connectToRunnerIsolate(vmServicePort);
     waitingFor = 'task completion';
-    Map<String, dynamic> taskResult =
+    final Map<String, dynamic> taskResult =
         await isolate.invokeExtension('ext.cocoonRunTask').timeout(taskTimeoutWithGracePeriod);
     waitingFor = 'task process to exit';
     await runner.exitCode.timeout(const Duration(seconds: 1));
@@ -81,8 +81,8 @@
 }
 
 Future<VMIsolateRef> _connectToRunnerIsolate(int vmServicePort) async {
-  String url = 'ws://localhost:$vmServicePort/ws';
-  DateTime started = new DateTime.now();
+  final String url = 'ws://localhost:$vmServicePort/ws';
+  final DateTime started = new DateTime.now();
 
   // TODO(yjbanov): due to lack of imagination at the moment the handshake with
   //                the task process is very rudimentary and requires this small
@@ -97,10 +97,10 @@
       await (await WebSocket.connect(url)).close();
 
       // Look up the isolate.
-      VMServiceClient client = new VMServiceClient.connect(url);
-      VM vm = await client.getVM();
-      VMIsolateRef isolate = vm.isolates.single;
-      String response = await isolate.invokeExtension('ext.cocoonRunnerReady');
+      final VMServiceClient client = new VMServiceClient.connect(url);
+      final VM vm = await client.getVM();
+      final VMIsolateRef isolate = vm.isolates.single;
+      final String response = await isolate.invokeExtension('ext.cocoonRunnerReady');
       if (response != 'ready') throw 'not ready yet';
       return isolate;
     } catch (error) {
diff --git a/dev/devicelab/lib/framework/utils.dart b/dev/devicelab/lib/framework/utils.dart
index eb07c88..4daafda 100644
--- a/dev/devicelab/lib/framework/utils.dart
+++ b/dev/devicelab/lib/framework/utils.dart
@@ -46,7 +46,7 @@
 
   @override
   String toString() {
-    StringBuffer buf = new StringBuffer(succeeded ? 'succeeded' : 'failed');
+    final StringBuffer buf = new StringBuffer(succeeded ? 'succeeded' : 'failed');
     if (details != null && details.trim().isNotEmpty) {
       buf.writeln();
       // Indent details by 4 spaces
@@ -89,7 +89,7 @@
 File file(String path) => new File(path);
 
 void copy(File sourceFile, Directory targetDirectory, {String name}) {
-  File target = file(
+  final File target = file(
       path.join(targetDirectory.path, name ?? path.basename(sourceFile.path)));
   target.writeAsBytesSync(sourceFile.readAsBytesSync());
 }
@@ -118,7 +118,7 @@
 
 Future<String> getDartVersion() async {
   // The Dart VM returns the version text to stderr.
-  ProcessResult result = Process.runSync(dartBin, <String>['--version']);
+  final ProcessResult result = Process.runSync(dartBin, <String>['--version']);
   String version = result.stderr.trim();
 
   // Convert:
@@ -146,13 +146,13 @@
 Future<DateTime> getFlutterRepoCommitTimestamp(String commit) {
   // git show -s --format=%at 4b546df7f0b3858aaaa56c4079e5be1ba91fbb65
   return inDirectory(flutterDirectory, () async {
-    String unixTimestamp = await eval('git', <String>[
+    final String unixTimestamp = await eval('git', <String>[
       'show',
       '-s',
       '--format=%at',
       commit,
     ]);
-    int secondsSinceEpoch = int.parse(unixTimestamp);
+    final int secondsSinceEpoch = int.parse(unixTimestamp);
     return new DateTime.fromMillisecondsSinceEpoch(secondsSinceEpoch * 1000);
   });
 }
@@ -163,17 +163,17 @@
   Map<String, String> environment,
   String workingDirectory,
 }) async {
-  String command = '$executable ${arguments?.join(" ") ?? ""}';
+  final String command = '$executable ${arguments?.join(" ") ?? ""}';
   print('Executing: $command');
   environment ??= <String, String>{};
   environment['BOT'] = 'true';
-  Process process = await Process.start(
+  final Process process = await Process.start(
     executable,
     arguments,
     environment: environment,
     workingDirectory: workingDirectory ?? cwd,
   );
-  ProcessInfo processInfo = new ProcessInfo(command, process);
+  final ProcessInfo processInfo = new ProcessInfo(command, process);
   _runningProcesses.add(processInfo);
 
   process.exitCode.whenComplete(() {
@@ -207,7 +207,7 @@
   Map<String, String> environment,
   bool canFail: false,
 }) async {
-  Process process = await startProcess(executable, arguments, environment: environment);
+  final Process process = await startProcess(executable, arguments, environment: environment);
 
   process.stdout
       .transform(UTF8.decoder)
@@ -218,7 +218,7 @@
       .transform(const LineSplitter())
       .listen(stderr.writeln);
 
-  int exitCode = await process.exitCode;
+  final int exitCode = await process.exitCode;
 
   if (exitCode != 0 && !canFail)
     fail('Executable failed with exit code $exitCode.');
@@ -235,12 +235,12 @@
   Map<String, String> environment,
   bool canFail: false,
 }) async {
-  Process process = await startProcess(executable, arguments, environment: environment);
+  final Process process = await startProcess(executable, arguments, environment: environment);
   process.stderr.listen((List<int> data) {
     stderr.add(data);
   });
-  String output = await UTF8.decodeStream(process.stdout);
-  int exitCode = await process.exitCode;
+  final String output = await UTF8.decodeStream(process.stdout);
+  final int exitCode = await process.exitCode;
 
   if (exitCode != 0 && !canFail)
     fail('Executable failed with exit code $exitCode.');
@@ -253,7 +253,7 @@
   bool canFail: false,
   Map<String, String> environment,
 }) {
-  List<String> args = <String>[command]..addAll(options);
+  final List<String> args = <String>[command]..addAll(options);
   return exec(path.join(flutterDirectory.path, 'bin', 'flutter'), args,
       canFail: canFail, environment: environment);
 }
@@ -264,7 +264,7 @@
   bool canFail: false,
   Map<String, String> environment,
 }) {
-  List<String> args = <String>[command]..addAll(options);
+  final List<String> args = <String>[command]..addAll(options);
   return eval(path.join(flutterDirectory.path, 'bin', 'flutter'), args,
       canFail: canFail, environment: environment);
 }
@@ -275,7 +275,7 @@
 Future<int> dart(List<String> args) => exec(dartBin, args);
 
 Future<dynamic> inDirectory(dynamic directory, Future<dynamic> action()) async {
-  String previousCwd = cwd;
+  final String previousCwd = cwd;
   try {
     cd(directory);
     return await action();
@@ -303,7 +303,7 @@
 Directory get flutterDirectory => dir('../..').absolute;
 
 String requireEnvVar(String name) {
-  String value = Platform.environment[name];
+  final String value = Platform.environment[name];
 
   if (value == null) fail('$name environment variable is missing. Quitting.');
 
@@ -313,7 +313,7 @@
 T requireConfigProperty<T>(Map<String, dynamic> map, String propertyName) {
   if (!map.containsKey(propertyName))
     fail('Configuration property not found: $propertyName');
-  T result = map[propertyName];
+  final T result = map[propertyName];
   return result;
 }
 
@@ -426,7 +426,7 @@
 ///
 ///     }
 Future<Null> runAndCaptureAsyncStacks(Future<Null> callback()) {
-  Completer<Null> completer = new Completer<Null>();
+  final Completer<Null> completer = new Completer<Null>();
   Chain.capture(() async {
     await callback();
     completer.complete();
@@ -441,7 +441,7 @@
   int port = 20000;
   while (true) {
     try {
-      ServerSocket socket =
+      final ServerSocket socket =
           await ServerSocket.bind(InternetAddress.LOOPBACK_IP_V4, port);
       await socket.close();
       return port;
diff --git a/dev/devicelab/lib/tasks/gallery.dart b/dev/devicelab/lib/tasks/gallery.dart
index 8463dcc..0dcd6b0 100644
--- a/dev/devicelab/lib/tasks/gallery.dart
+++ b/dev/devicelab/lib/tasks/gallery.dart
@@ -18,10 +18,10 @@
 class GalleryTransitionTest {
 
   Future<TaskResult> call() async {
-    Device device = await devices.workingDevice;
+    final Device device = await devices.workingDevice;
     await device.unlock();
-    String deviceId = device.deviceId;
-    Directory galleryDirectory =
+    final String deviceId = device.deviceId;
+    final Directory galleryDirectory =
         dir('${flutterDirectory.path}/examples/flutter_gallery');
     await inDirectory(galleryDirectory, () async {
       await flutter('packages', options: <String>['get']);
@@ -43,17 +43,17 @@
 
     // Route paths contains slashes, which Firebase doesn't accept in keys, so we
     // remove them.
-    Map<String, List<int>> original = JSON.decode(file(
+    final Map<String, List<int>> original = JSON.decode(file(
             '${galleryDirectory.path}/build/transition_durations.timeline.json')
         .readAsStringSync());
-    Map<String, List<int>> transitions = new Map<String, List<int>>.fromIterable(
+    final Map<String, List<int>> transitions = new Map<String, List<int>>.fromIterable(
         original.keys,
         key: (String key) => key.replaceAll('/', ''),
         value: (String key) => original[key]);
 
-    Map<String, dynamic> summary = JSON.decode(file('${galleryDirectory.path}/build/transitions.timeline_summary.json').readAsStringSync());
+    final Map<String, dynamic> summary = JSON.decode(file('${galleryDirectory.path}/build/transitions.timeline_summary.json').readAsStringSync());
 
-    Map<String, dynamic> data = <String, dynamic>{
+    final Map<String, dynamic> data = <String, dynamic>{
       'transitions': transitions,
       'missed_transition_count': _countMissedTransitions(transitions),
     };
@@ -75,7 +75,7 @@
   const int _kTransitionBudget = 100000; // µs
   int count = 0;
   transitions.forEach((String demoName, List<int> durations) {
-    int longestDuration = durations.reduce(math.max);
+    final int longestDuration = durations.reduce(math.max);
     if (longestDuration > _kTransitionBudget) {
       print('$demoName missed transition time budget ($longestDuration µs > $_kTransitionBudget µs)');
       count++;
diff --git a/dev/devicelab/lib/tasks/microbenchmarks.dart b/dev/devicelab/lib/tasks/microbenchmarks.dart
index fea216d..20106aa 100644
--- a/dev/devicelab/lib/tasks/microbenchmarks.dart
+++ b/dev/devicelab/lib/tasks/microbenchmarks.dart
@@ -16,13 +16,13 @@
 /// `dev/benchmarks/microbenchmarks` reports results to the dashboard.
 TaskFunction createMicrobenchmarkTask() {
   return () async {
-    Device device = await devices.workingDevice;
+    final Device device = await devices.workingDevice;
     await device.unlock();
 
     Future<Map<String, double>> _runMicrobench(String benchmarkPath) async {
       print('Running $benchmarkPath');
-      Directory appDir = dir(path.join(flutterDirectory.path, 'dev/benchmarks/microbenchmarks'));
-      Process flutterProcess = await inDirectory(appDir, () async {
+      final Directory appDir = dir(path.join(flutterDirectory.path, 'dev/benchmarks/microbenchmarks'));
+      final Process flutterProcess = await inDirectory(appDir, () async {
         return await _startFlutter(
           options: <String>[
             '--profile',  // --release doesn't work on iOS due to code signing issues
@@ -37,7 +37,7 @@
       return await _readJsonResults(flutterProcess);
     }
 
-    Map<String, double> allResults = <String, double>{};
+    final Map<String, double> allResults = <String, double>{};
     allResults.addAll(await _runMicrobench('lib/stocks/layout_bench.dart'));
     allResults.addAll(await _runMicrobench('lib/stocks/build_bench.dart'));
     allResults.addAll(await _runMicrobench('lib/gestures/velocity_tracker_bench.dart'));
@@ -53,7 +53,7 @@
   bool canFail: false,
   Map<String, String> environment,
 }) {
-  List<String> args = <String>['run']..addAll(options);
+  final List<String> args = <String>['run']..addAll(options);
   return startProcess(path.join(flutterDirectory.path, 'bin', 'flutter'), args, environment: environment);
 }
 
@@ -62,8 +62,8 @@
   const String jsonStart = '================ RESULTS ================';
   const String jsonEnd = '================ FORMATTED ==============';
   bool jsonStarted = false;
-  StringBuffer jsonBuf = new StringBuffer();
-  Completer<Map<String, double>> completer = new Completer<Map<String, double>>();
+  final StringBuffer jsonBuf = new StringBuffer();
+  final Completer<Map<String, double>> completer = new Completer<Map<String, double>>();
   StreamSubscription<String> stdoutSub;
 
   int prefixLength = 0;
diff --git a/dev/devicelab/lib/tasks/perf_tests.dart b/dev/devicelab/lib/tasks/perf_tests.dart
index b51ed4e..960e4c7 100644
--- a/dev/devicelab/lib/tasks/perf_tests.dart
+++ b/dev/devicelab/lib/tasks/perf_tests.dart
@@ -77,7 +77,7 @@
 
   Future<TaskResult> call() async {
     return await inDirectory(testDirectory, () async {
-      String deviceId = (await devices.workingDevice).deviceId;
+      final String deviceId = (await devices.workingDevice).deviceId;
       await flutter('packages', options: <String>['get']);
 
       if (deviceOperatingSystem == DeviceOperatingSystem.ios) {
@@ -91,7 +91,7 @@
         '-d',
         deviceId,
       ]).timeout(_startupTimeout);
-      Map<String, dynamic> data = JSON.decode(file('$testDirectory/build/start_up_info.json').readAsStringSync());
+      final Map<String, dynamic> data = JSON.decode(file('$testDirectory/build/start_up_info.json').readAsStringSync());
       return new TaskResult.success(data, benchmarkScoreKeys: <String>[
         'timeToFirstFrameMicros',
       ]);
@@ -111,9 +111,9 @@
 
   Future<TaskResult> call() {
     return inDirectory(testDirectory, () async {
-      Device device = await devices.workingDevice;
+      final Device device = await devices.workingDevice;
       await device.unlock();
-      String deviceId = device.deviceId;
+      final String deviceId = device.deviceId;
       await flutter('packages', options: <String>['get']);
 
       if (deviceOperatingSystem == DeviceOperatingSystem.ios) {
@@ -130,7 +130,7 @@
         '-d',
         deviceId,
       ]);
-      Map<String, dynamic> data = JSON.decode(file('$testDirectory/build/$timelineFileName.timeline_summary.json').readAsStringSync());
+      final Map<String, dynamic> data = JSON.decode(file('$testDirectory/build/$timelineFileName.timeline_summary.json').readAsStringSync());
 
       if (data['frame_count'] < 5) {
         return new TaskResult.failure(
@@ -159,12 +159,12 @@
 
   Future<TaskResult> call() async {
     return await inDirectory(testDirectory, () async {
-      Device device = await devices.workingDevice;
+      final Device device = await devices.workingDevice;
       await device.unlock();
       await flutter('packages', options: <String>['get']);
 
-      Stopwatch watch = new Stopwatch()..start();
-      String buildLog = await evalFlutter('build', options: <String>[
+      final Stopwatch watch = new Stopwatch()..start();
+      final String buildLog = await evalFlutter('build', options: <String>[
         'aot',
         '-v',
         '--profile',
@@ -173,9 +173,9 @@
       ]);
       watch.stop();
 
-      RegExp metricExpression = new RegExp(r'([a-zA-Z]+)\(CodeSize\)\: (\d+)');
+      final RegExp metricExpression = new RegExp(r'([a-zA-Z]+)\(CodeSize\)\: (\d+)');
 
-      Map<String, dynamic> data = new Map<String, dynamic>.fromIterable(
+      final Map<String, dynamic> data = new Map<String, dynamic>.fromIterable(
         metricExpression.allMatches(buildLog),
         key: (Match m) => _sdkNameToMetricName(m.group(1)),
         value: (Match m) => int.parse(m.group(2)),
@@ -216,9 +216,9 @@
 
   Future<TaskResult> call() {
     return inDirectory(testDirectory, () async {
-      Device device = await devices.workingDevice;
+      final Device device = await devices.workingDevice;
       await device.unlock();
-      String deviceId = device.deviceId;
+      final String deviceId = device.deviceId;
       await flutter('packages', options: <String>['get']);
 
       if (deviceOperatingSystem == DeviceOperatingSystem.ios) {
@@ -226,9 +226,9 @@
         await flutter('build', options: <String>['ios', '--profile']);
       }
 
-      int observatoryPort = await findAvailablePort();
+      final int observatoryPort = await findAvailablePort();
 
-      List<String> runOptions = <String>[
+      final List<String> runOptions = <String>[
         '-v',
         '--profile',
         '--trace-startup', // wait for the first frame to render
@@ -241,9 +241,9 @@
         runOptions.addAll(<String>['-t', testTarget]);
       await flutter('run', options: runOptions);
 
-      Map<String, dynamic> startData = await device.getMemoryStats(packageName);
+      final Map<String, dynamic> startData = await device.getMemoryStats(packageName);
 
-      Map<String, dynamic> data = <String, dynamic>{
+      final Map<String, dynamic> data = <String, dynamic>{
          'start_total_kb': startData['total_kb'],
       };
 
@@ -257,7 +257,7 @@
           '--use-existing-app=http://localhost:$observatoryPort',
         ]);
 
-        Map<String, dynamic> endData = await device.getMemoryStats(packageName);
+        final Map<String, dynamic> endData = await device.getMemoryStats(packageName);
         data['end_total_kb'] = endData['total_kb'];
         data['diff_total_kb'] = endData['total_kb'] - startData['total_kb'];
       }
@@ -283,9 +283,9 @@
         throw 'This test is only supported on Android';
       }
 
-      AndroidDevice device = await devices.workingDevice;
+      final AndroidDevice device = await devices.workingDevice;
       await device.unlock();
-      String deviceId = device.deviceId;
+      final String deviceId = device.deviceId;
       await flutter('packages', options: <String>['get']);
 
       await flutter('run', options: <String>[
@@ -296,9 +296,9 @@
         deviceId,
       ]);
 
-      Map<String, dynamic> startData = await device.getMemoryStats(packageName);
+      final Map<String, dynamic> startData = await device.getMemoryStats(packageName);
 
-      Map<String, dynamic> data = <String, dynamic>{
+      final Map<String, dynamic> data = <String, dynamic>{
          'start_total_kb': startData['total_kb'],
       };
 
@@ -306,14 +306,14 @@
       for (int i = 0; i < 10; i++) {
         await device.shellExec('input', <String>['keyevent', 'KEYCODE_BACK']);
         await new Future<Null>.delayed(const Duration(milliseconds: 1000));
-        String output = await device.shellEval('am', <String>['start', '-n', 'io.flutter.examples.gallery/io.flutter.app.FlutterActivity']);
+        final String output = await device.shellEval('am', <String>['start', '-n', 'io.flutter.examples.gallery/io.flutter.app.FlutterActivity']);
         print(output);
         if (output.contains('Error'))
           return new TaskResult.failure('unable to launch activity');
         await new Future<Null>.delayed(const Duration(milliseconds: 1000));
       }
 
-      Map<String, dynamic> endData = await device.getMemoryStats(packageName);
+      final Map<String, dynamic> endData = await device.getMemoryStats(packageName);
       data['end_total_kb'] = endData['total_kb'];
       data['diff_total_kb'] = endData['total_kb'] - startData['total_kb'];
 
diff --git a/dev/devicelab/lib/tasks/size_tests.dart b/dev/devicelab/lib/tasks/size_tests.dart
index 422ae81..e652bc1 100644
--- a/dev/devicelab/lib/tasks/size_tests.dart
+++ b/dev/devicelab/lib/tasks/size_tests.dart
@@ -12,7 +12,7 @@
 TaskFunction createBasicMaterialAppSizeTest() {
   return () async {
     const String sampleAppName = 'sample_flutter_app';
-    Directory sampleDir = dir('${Directory.systemTemp.path}/$sampleAppName');
+    final Directory sampleDir = dir('${Directory.systemTemp.path}/$sampleAppName');
 
     if (await sampleDir.exists())
       rmTree(sampleDir);
diff --git a/dev/devicelab/test/adb_test.dart b/dev/devicelab/test/adb_test.dart
index 840758c..ca72310 100644
--- a/dev/devicelab/test/adb_test.dart
+++ b/dev/devicelab/test/adb_test.dart
@@ -129,7 +129,7 @@
     if (other.runtimeType != CommandArgs)
       return false;
 
-    CommandArgs otherCmd = other;
+    final CommandArgs otherCmd = other;
     return otherCmd.command == this.command &&
       const ListEquality<String>().equals(otherCmd.arguments, this.arguments) &&
       const MapEquality<String, String>().equals(otherCmd.environment, this.environment);
@@ -188,7 +188,7 @@
       arguments: arguments,
       environment: environment,
     ));
-    dynamic exitError = exitErrorFactory();
+    final dynamic exitError = exitErrorFactory();
     if (exitError != null)
       throw exitError;
   }
diff --git a/dev/devicelab/test/manifest_test.dart b/dev/devicelab/test/manifest_test.dart
index 28eb0d9..2478e26 100644
--- a/dev/devicelab/test/manifest_test.dart
+++ b/dev/devicelab/test/manifest_test.dart
@@ -9,10 +9,10 @@
 void main() {
   group('production manifest', () {
     test('must be valid', () {
-      Manifest manifest = loadTaskManifest();
+      final Manifest manifest = loadTaskManifest();
       expect(manifest.tasks, isNotEmpty);
 
-      ManifestTask task = manifest.tasks.firstWhere((ManifestTask task) => task.name == 'flutter_gallery__start_up');
+      final ManifestTask task = manifest.tasks.firstWhere((ManifestTask task) => task.name == 'flutter_gallery__start_up');
       expect(task.description, 'Measures the startup time of the Flutter Gallery app on Android.\n');
       expect(task.stage, 'devicelab');
       expect(task.requiredAgentCapabilities, <String>['has-android-device']);
diff --git a/dev/devicelab/test/run_test.dart b/dev/devicelab/test/run_test.dart
index 3f7c77a..4a1b2d5 100644
--- a/dev/devicelab/test/run_test.dart
+++ b/dev/devicelab/test/run_test.dart
@@ -10,11 +10,11 @@
 void main() {
   group('run.dart script', () {
     Future<int> runScript(List<String> testNames) async {
-      List<String> options = <String>['bin/run.dart'];
+      final List<String> options = <String>['bin/run.dart'];
       for (String testName in testNames) {
         options..addAll(<String>['-t', testName]);
       }
-      ProcessResult scriptProcess = Process.runSync(
+      final ProcessResult scriptProcess = Process.runSync(
         '../../bin/cache/dart-sdk/bin/dart',
         options,
       );
diff --git a/dev/manual_tests/card_collection.dart b/dev/manual_tests/card_collection.dart
index b8a5b1e..0bfca12 100644
--- a/dev/manual_tests/card_collection.dart
+++ b/dev/manual_tests/card_collection.dart
@@ -42,7 +42,7 @@
   bool _varyFontSizes = false;
 
   void _initVariableSizedCardModels() {
-    List<double> cardHeights = <double>[
+    final List<double> cardHeights = <double>[
       48.0, 63.0, 82.0, 146.0, 60.0, 55.0, 84.0, 96.0, 50.0,
       48.0, 63.0, 82.0, 146.0, 60.0, 55.0, 84.0, 96.0, 50.0,
       48.0, 63.0, 82.0, 146.0, 60.0, 55.0, 84.0, 96.0, 50.0,
@@ -119,7 +119,7 @@
   }
 
   String _dismissDirectionText(DismissDirection direction) {
-    String s = direction.toString();
+    final String s = direction.toString();
     return "dismiss ${s.substring(s.indexOf('.') + 1)}";
   }
 
@@ -247,8 +247,8 @@
   }
 
   Widget _buildCard(BuildContext context, int index) {
-    CardModel cardModel = _cardModels[index];
-    Widget card = new Dismissable(
+    final CardModel cardModel = _cardModels[index];
+    final Widget card = new Dismissable(
       key: new ObjectKey(cardModel),
       direction: _dismissDirection,
       onDismissed: (DismissDirection direction) { dismissCard(cardModel); },
@@ -318,7 +318,7 @@
     // size of the background,card Stack will be based only on the card. The
     // Viewport ensures that when the card's resize animation occurs, the
     // background (text and icons) will just be clipped, not resized.
-    Widget background = new Positioned.fill(
+    final Widget background = new Positioned.fill(
       child: new Container(
         margin: const EdgeInsets.all(4.0),
         child: new SingleChildScrollView(
@@ -376,7 +376,7 @@
       );
     }
 
-    Widget body = new Container(
+    final Widget body = new Container(
       padding: const EdgeInsets.symmetric(vertical: 12.0, horizontal: 8.0),
       color: _primaryColor[50],
       child: cardCollection,
diff --git a/dev/manual_tests/drag_and_drop.dart b/dev/manual_tests/drag_and_drop.dart
index d32ad69..1986d25 100644
--- a/dev/manual_tests/drag_and_drop.dart
+++ b/dev/manual_tests/drag_and_drop.dart
@@ -97,7 +97,7 @@
     if (heavy)
       size *= kHeavyMultiplier;
 
-    Widget contents = new DefaultTextStyle(
+    final Widget contents = new DefaultTextStyle(
       style: Theme.of(context).textTheme.body1,
       textAlign: TextAlign.center,
       child: new Dot(
@@ -185,7 +185,7 @@
 
   @override
   Widget build(BuildContext context) {
-    Widget ball = new DefaultTextStyle(
+    final Widget ball = new DefaultTextStyle(
       style: Theme.of(context).primaryTextTheme.body1,
       textAlign: TextAlign.center,
       child: new Dot(
@@ -196,7 +196,7 @@
         child: new Center(child: new Text('BALL'))
       )
     );
-    Widget dashedBall = new Container(
+    final Widget dashedBall = new Container(
       width: kBallSize,
       height: kBallSize,
       child: new CustomPaint(
diff --git a/dev/manual_tests/overlay_geometry.dart b/dev/manual_tests/overlay_geometry.dart
index 4efc6af..4c283b1 100644
--- a/dev/manual_tests/overlay_geometry.dart
+++ b/dev/manual_tests/overlay_geometry.dart
@@ -31,8 +31,8 @@
 
   @override
   void paint(Canvas canvas, _) {
-    Paint paint = new Paint()..color = const Color(0x8000FF00);
-    double r = size / 2.0;
+    final Paint paint = new Paint()..color = const Color(0x8000FF00);
+    final double r = size / 2.0;
     canvas.drawCircle(new Point(r, r), r, paint);
 
     paint
@@ -107,7 +107,7 @@
   Widget build(BuildContext context, int index) {
     if (index >= cardModels.length)
       return null;
-    CardModel cardModel = cardModels[index];
+    final CardModel cardModel = cardModels[index];
     return new GestureDetector(
       key: cardModel.key,
       onTapUp: (TapUpDetails details) { onTapUp(cardModel.targetKey, details.globalPosition); },
@@ -140,13 +140,13 @@
   @override
   void initState() {
     super.initState();
-    List<double> cardHeights = <double>[
+    final List<double> cardHeights = <double>[
       48.0, 63.0, 82.0, 146.0, 60.0, 55.0, 84.0, 96.0, 50.0,
       48.0, 63.0, 82.0, 146.0, 60.0, 55.0, 84.0, 96.0, 50.0,
       48.0, 63.0, 82.0, 146.0, 60.0, 55.0, 84.0, 96.0, 50.0,
     ];
     cardModels = new List<CardModel>.generate(cardHeights.length, (int i) {
-      Color color = Color.lerp(Colors.red[300], Colors.blue[900], i / cardHeights.length);
+      final Color color = Color.lerp(Colors.red[300], Colors.blue[900], i / cardHeights.length);
       return new CardModel(i, cardHeights[i], color);
     });
   }
@@ -154,10 +154,10 @@
   bool handleScrollNotification(ScrollNotification notification) {
     if (notification is ScrollUpdateNotification && notification.depth == 1) {
       setState(() {
-        double dy = markersScrollOffset - notification.metrics.extentBefore;
+        final double dy = markersScrollOffset - notification.metrics.extentBefore;
         markersScrollOffset = notification.metrics.extentBefore;
         for (MarkerType type in markers.keys) {
-          Point oldPosition = markers[type];
+          final Point oldPosition = markers[type];
           markers[type] = new Point(oldPosition.x, oldPosition.y + dy);
         }
       });
@@ -179,7 +179,7 @@
 
   @override
   Widget build(BuildContext context) {
-    List<Widget> layers = <Widget>[
+    final List<Widget> layers = <Widget>[
       new Scaffold(
         appBar: new AppBar(title: new Text('Tap a Card')),
         body: new Container(
diff --git a/dev/manual_tests/page_view.dart b/dev/manual_tests/page_view.dart
index 724b816..776fb64 100644
--- a/dev/manual_tests/page_view.dart
+++ b/dev/manual_tests/page_view.dart
@@ -31,7 +31,7 @@
     ];
 
     cardModels = new List<CardModel>.generate(cardSizes.length, (int i) {
-      Color color = Color.lerp(Colors.red[300], Colors.blue[900], i / cardSizes.length);
+      final Color color = Color.lerp(Colors.red[300], Colors.blue[900], i / cardSizes.length);
       return new CardModel(i, cardSizes[i], color);
     });
   }
@@ -45,7 +45,7 @@
   bool itemsWrap = false;
 
   Widget buildCard(CardModel cardModel) {
-    Widget card = new Card(
+    final Widget card = new Card(
       color: cardModel.color,
       child: new Container(
         width: cardModel.size.width,
@@ -55,7 +55,7 @@
       ),
     );
 
-    BoxConstraints constraints = (scrollDirection == Axis.vertical)
+    final BoxConstraints constraints = (scrollDirection == Axis.vertical)
       ? new BoxConstraints.tightFor(height: pageSize.height)
       : new BoxConstraints.tightFor(width: pageSize.width);
 
diff --git a/dev/manual_tests/test/card_collection_test.dart b/dev/manual_tests/test/card_collection_test.dart
index 34defcb..6afde78 100644
--- a/dev/manual_tests/test/card_collection_test.dart
+++ b/dev/manual_tests/test/card_collection_test.dart
@@ -13,7 +13,7 @@
     await tester.pump(); // see https://github.com/flutter/flutter/issues/1865
     await tester.pump(); // triggers a frame
 
-    Finder navigationMenu = find.byWidgetPredicate((Widget widget) {
+    final Finder navigationMenu = find.byWidgetPredicate((Widget widget) {
       if (widget is Tooltip)
         return widget.message == 'Open navigation menu';
       return false;
diff --git a/dev/tools/dartdoc.dart b/dev/tools/dartdoc.dart
index 577d734..3ae633a 100644
--- a/dev/tools/dartdoc.dart
+++ b/dev/tools/dartdoc.dart
@@ -25,7 +25,7 @@
     Directory.current = Directory.current.parent.parent;
 
   // Create the pubspec.yaml file.
-  StringBuffer buf = new StringBuffer('''
+  final StringBuffer buf = new StringBuffer('''
 name: Flutter
 dependencies:
 ''');
@@ -40,10 +40,10 @@
   new File('dev/docs/pubspec.yaml').writeAsStringSync(buf.toString());
 
   // Create the library file.
-  Directory libDir = new Directory('dev/docs/lib');
+  final Directory libDir = new Directory('dev/docs/lib');
   libDir.createSync();
 
-  StringBuffer contents = new StringBuffer('library temp_doc;\n\n');
+  final StringBuffer contents = new StringBuffer('library temp_doc;\n\n');
   for (String libraryRef in libraryRefs()) {
     contents.writeln('import \'package:$libraryRef\';');
   }
@@ -58,14 +58,14 @@
   );
   printStream(process.stdout);
   printStream(process.stderr);
-  int code = await process.exitCode;
+  final int code = await process.exitCode;
   if (code != 0)
     exit(code);
 
   createFooter('dev/docs/lib/footer.html');
 
   // Generate the documentation.
-  List<String> args = <String>[
+  final List<String> args = <String>[
     'global', 'run', 'dartdoc',
     '--header', 'styles.html',
     '--header', 'analytics.html',
@@ -84,7 +84,7 @@
   process = await Process.start('pub', args, workingDirectory: 'dev/docs');
   printStream(process.stdout);
   printStream(process.stderr);
-  int exitCode = await process.exitCode;
+  final int exitCode = await process.exitCode;
 
   if (exitCode != 0)
     exit(exitCode);
@@ -95,10 +95,10 @@
 }
 
 void createFooter(String footerPath) {
-  ProcessResult gitResult = Process.runSync('git', <String>['rev-parse', 'HEAD']);
-  String gitHead = (gitResult.exitCode == 0) ? gitResult.stdout.trim() : 'unknown';
+  final ProcessResult gitResult = Process.runSync('git', <String>['rev-parse', 'HEAD']);
+  final String gitHead = (gitResult.exitCode == 0) ? gitResult.stdout.trim() : 'unknown';
 
-  String timestamp = new DateFormat('yyyy-MM-dd HH:mm').format(new DateTime.now());
+  final String timestamp = new DateFormat('yyyy-MM-dd HH:mm').format(new DateTime.now());
 
   new File(footerPath).writeAsStringSync(
     '<p class="text-center" style="font-size: 10px">'
@@ -107,7 +107,7 @@
 }
 
 void sanityCheckDocs() {
-  List<String> canaries = <String>[
+  final List<String> canaries = <String>[
     '$kDocRoot/api/dart-io/File-class.html',
     '$kDocRoot/api/dart-ui/Canvas-class.html',
     '$kDocRoot/api/dart-ui/Canvas/drawRect.html',
@@ -151,7 +151,7 @@
 }
 
 void addHtmlBaseToIndex() {
-  File indexFile = new File('$kDocRoot/index.html');
+  final File indexFile = new File('$kDocRoot/index.html');
   String indexContents = indexFile.readAsStringSync();
   indexContents = indexContents.replaceFirst('</title>\n',
     '</title>\n  <base href="./flutter/">\n');
@@ -163,7 +163,7 @@
 }
 
 void putRedirectInOldIndexLocation() {
-  String metaTag = '<meta http-equiv="refresh" content="0;URL=../index.html">';
+  final String metaTag = '<meta http-equiv="refresh" content="0;URL=../index.html">';
   new File('$kDocRoot/flutter/index.html').writeAsStringSync(metaTag);
 }
 
@@ -178,7 +178,7 @@
     .where((FileSystemEntity entity) {
       if (entity is! Directory)
         return false;
-      File pubspec = new File('${entity.path}/pubspec.yaml');
+      final File pubspec = new File('${entity.path}/pubspec.yaml');
       // TODO(ianh): Use a real YAML parser here
       return !pubspec.readAsStringSync().contains('nodoc: true');
     })
@@ -190,7 +190,7 @@
 /// diskPath toggles between import paths vs. disk paths.
 Iterable<String> libraryRefs({ bool diskPath: false }) sync* {
   for (Directory dir in findPackages()) {
-    String dirName = path.basename(dir.path);
+    final String dirName = path.basename(dir.path);
     for (FileSystemEntity file in new Directory('${dir.path}/lib').listSync()) {
       if (file is File && file.path.endsWith('.dart')) {
         if (diskPath)
diff --git a/dev/tools/javadoc.dart b/dev/tools/javadoc.dart
index 1c85722..e888060 100644
--- a/dev/tools/javadoc.dart
+++ b/dev/tools/javadoc.dart
@@ -13,26 +13,26 @@
 /// This script downloads an archive of Javadoc for the engine from the
 /// artifact store and extracts it to the location used for Dartdoc.
 Future<Null> main(List<String> args) async {
-  String engineVersion = new File('bin/internal/engine.version').readAsStringSync().trim();
+  final String engineVersion = new File('bin/internal/engine.version').readAsStringSync().trim();
 
-  String url = 'https://storage.googleapis.com/flutter_infra/flutter/$engineVersion/android-javadoc.zip';
-  http.Response response = await http.get(url);
+  final String url = 'https://storage.googleapis.com/flutter_infra/flutter/$engineVersion/android-javadoc.zip';
+  final http.Response response = await http.get(url);
 
-  Archive archive = new ZipDecoder().decodeBytes(response.bodyBytes);
+  final Archive archive = new ZipDecoder().decodeBytes(response.bodyBytes);
 
-  Directory output = new Directory('$kDocRoot/javadoc');
+  final Directory output = new Directory('$kDocRoot/javadoc');
   print('Extracing javadoc to ${output.path}');
   output.createSync(recursive: true);
 
   for (ArchiveFile af in archive) {
     if (af.isFile) {
-      File file = new File('${output.path}/${af.name}');
+      final File file = new File('${output.path}/${af.name}');
       file.createSync(recursive: true);
       file.writeAsBytesSync(af.content);
     }
   }
 
-  File testFile = new File('${output.path}/io/flutter/view/FlutterView.html');
+  final File testFile = new File('${output.path}/io/flutter/view/FlutterView.html');
   if (!testFile.existsSync()) {
     print('Expected file ${testFile.path} not found');
     exit(1);
diff --git a/dev/tools/mega_gallery.dart b/dev/tools/mega_gallery.dart
index e53adc3..fd68187 100644
--- a/dev/tools/mega_gallery.dart
+++ b/dev/tools/mega_gallery.dart
@@ -17,14 +17,14 @@
   if (path.basename(Directory.current.path) == 'tools')
     Directory.current = Directory.current.parent.parent;
 
-  ArgParser argParser = new ArgParser();
+  final ArgParser argParser = new ArgParser();
   // ../mega_gallery? dev/benchmarks/mega_gallery?
   argParser.addOption('out', defaultsTo: _normalize('dev/benchmarks/mega_gallery'));
   argParser.addOption('copies');
   argParser.addFlag('delete', negatable: false);
   argParser.addFlag('help', abbr: 'h', negatable: false);
 
-  ArgResults results = argParser.parse(args);
+  final ArgResults results = argParser.parse(args);
 
   if (results['help']) {
     print('Generate n copies of flutter_gallery.\n');
@@ -33,8 +33,8 @@
     exit(0);
   }
 
-  Directory source = new Directory(_normalize('examples/flutter_gallery'));
-  Directory out = new Directory(_normalize(results['out']));
+  final Directory source = new Directory(_normalize('examples/flutter_gallery'));
+  final Directory out = new Directory(_normalize(results['out']));
 
   if (results['delete']) {
     if (out.existsSync()) {
@@ -47,7 +47,7 @@
 
   int copies;
   if (!results.wasParsed('copies')) {
-    SourceStats stats = getStatsFor(_dir(source, 'lib'));
+    final SourceStats stats = getStatsFor(_dir(source, 'lib'));
     copies = (kTargetLineCount / stats.lines).round();
   } else {
     copies = int.parse(results['copies']);
@@ -59,7 +59,7 @@
   print('  packages/flutter            : ${getStatsFor(new Directory("packages/flutter"))}');
   print('  examples/flutter_gallery    : ${getStatsFor(new Directory("examples/flutter_gallery"))}');
 
-  Directory lib = _dir(out, 'lib');
+  final Directory lib = _dir(out, 'lib');
   if (lib.existsSync())
     lib.deleteSync(recursive: true);
 
@@ -86,15 +86,15 @@
 
 // TODO(devoncarew): Create an entry-point that builds a UI with all `n` copies.
 void _createEntry(File mainFile, int copies) {
-  StringBuffer imports = new StringBuffer();
-  StringBuffer importRefs = new StringBuffer();
+  final StringBuffer imports = new StringBuffer();
+  final StringBuffer importRefs = new StringBuffer();
 
   for (int i = 1; i < copies; i++) {
     imports.writeln("import 'gallery_$i/main.dart' as main_$i;");
     importRefs.writeln("  main_$i.main;");
   }
 
-  String contents = '''
+  final String contents = '''
 // 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.
@@ -116,8 +116,8 @@
 }
 
 void _copyGallery(Directory galleryDir, int index) {
-  Directory lib = _dir(galleryDir, 'lib');
-  Directory dest = _dir(lib, 'gallery_$index');
+  final Directory lib = _dir(galleryDir, 'lib');
+  final Directory dest = _dir(lib, 'gallery_$index');
   dest.createSync();
 
   // Copy demo/, gallery/, and main.dart.
@@ -131,7 +131,7 @@
     target.createSync();
 
   for (FileSystemEntity entity in source.listSync(followLinks: false)) {
-    String name = path.basename(entity.path);
+    final String name = path.basename(entity.path);
 
     if (entity is Directory) {
       if (name == 'build' || name.startsWith('.'))
@@ -140,7 +140,7 @@
     } else if (entity is File) {
       if (name == '.packages' || name == 'pubspec.lock')
         continue;
-      File dest = new File(path.join(target.path, name));
+      final File dest = new File(path.join(target.path, name));
       dest.writeAsBytesSync(entity.readAsBytesSync());
     }
   }
@@ -162,7 +162,7 @@
   stats ??= new SourceStats();
 
   for (FileSystemEntity entity in dir.listSync(recursive: false, followLinks: false)) {
-    String name = path.basename(entity.path);
+    final String name = path.basename(entity.path);
     if (entity is File && name.endsWith('.dart')) {
       stats.files += 1;
       stats.lines += _lineCount(entity);
@@ -184,7 +184,7 @@
 }
 
 String _comma(int count) {
-  String str = count.toString();
+  final String str = count.toString();
   if (str.length > 3)
     return str.substring(0, str.length - 3) + ',' + str.substring(str.length - 3);
   return str;
diff --git a/dev/tools/update_icons.dart b/dev/tools/update_icons.dart
index 690ad2e..0b3e46f 100644
--- a/dev/tools/update_icons.dart
+++ b/dev/tools/update_icons.dart
@@ -33,26 +33,26 @@
   if (path.basename(Directory.current.path) == 'tools')
     Directory.current = Directory.current.parent.parent;
 
-  ArgParser argParser = new ArgParser();
+  final ArgParser argParser = new ArgParser();
   argParser.addOption(kOptionCodepointsPath, defaultsTo: kDefaultCodepointsPath);
   argParser.addOption(kOptionIconsPath, defaultsTo: kDefaultIconsPath);
   argParser.addFlag(kOptionDryRun, defaultsTo: false);
-  ArgResults argResults = argParser.parse(args);
+  final ArgResults argResults = argParser.parse(args);
 
-  File iconFile = new File(path.absolute(argResults[kOptionIconsPath]));
+  final File iconFile = new File(path.absolute(argResults[kOptionIconsPath]));
   if (!iconFile.existsSync()) {
     stderr.writeln('Icons file not found: ${iconFile.path}');
     exit(1);
   }
-  File codepointsFile = new File(path.absolute(argResults[kOptionCodepointsPath]));
+  final File codepointsFile = new File(path.absolute(argResults[kOptionCodepointsPath]));
   if (!codepointsFile.existsSync()) {
     stderr.writeln('Codepoints file not found: ${codepointsFile.path}');
     exit(1);
   }
 
-  String iconData = iconFile.readAsStringSync();
-  String codepointData = codepointsFile.readAsStringSync();
-  String newIconData = regenerateIconsFile(iconData, codepointData);
+  final String iconData = iconFile.readAsStringSync();
+  final String codepointData = codepointsFile.readAsStringSync();
+  final String newIconData = regenerateIconsFile(iconData, codepointData);
 
   if (argResults[kOptionDryRun])
     stdout.writeln(newIconData);
@@ -61,14 +61,14 @@
 }
 
 String regenerateIconsFile(String iconData, String codepointData) {
-  StringBuffer buf = new StringBuffer();
+  final StringBuffer buf = new StringBuffer();
   bool generating = false;
   for (String line in LineSplitter.split(iconData)) {
     if (!generating)
       buf.writeln(line);
     if (line.contains(kBeginGeneratedMark)) {
       generating = true;
-      String iconDeclarations = generateIconDeclarations(codepointData);
+      final String iconDeclarations = generateIconDeclarations(codepointData);
       buf.write(iconDeclarations);
     } else if (line.contains(kEndGeneratedMark)) {
       generating = false;
@@ -87,13 +87,13 @@
 }
 
 String getIconDeclaration(String line) {
-  List<String> tokens = line.split(' ');
+  final List<String> tokens = line.split(' ');
   if (tokens.length != 2)
     throw new FormatException('Unexpected codepoint data: $line');
-  String name = tokens[0];
-  String codepoint = tokens[1];
-  String identifier = kIdentifierRewrites[name] ?? name;
-  String description = name.replaceAll('_', ' ');
+  final String name = tokens[0];
+  final String codepoint = tokens[1];
+  final String identifier = kIdentifierRewrites[name] ?? name;
+  final String description = name.replaceAll('_', ' ');
   return '''
 
   /// <p><i class="material-icons md-36">$name</i> &#x2014; material icon named "$description".</p>