From ef4741540bb52b4ccc20ada8db7410557ae5b53c Mon Sep 17 00:00:00 2001 From: Jonah Williams Date: Thu, 19 Nov 2020 13:13:51 -0800 Subject: [PATCH] [flutter_tools] wire up alternative invalidation strategy to features (#70865) --- packages/flutter_tools/lib/src/features.dart | 30 +++++++++++++++++++ .../lib/src/resident_runner.dart | 13 ++++---- .../general.shard/resident_runner_test.dart | 27 +++++++++++++++++ packages/flutter_tools/test/src/testbed.dart | 8 ++++- 4 files changed, 71 insertions(+), 7 deletions(-) diff --git a/packages/flutter_tools/lib/src/features.dart b/packages/flutter_tools/lib/src/features.dart index 90460defd5b..701a9adffb8 100644 --- a/packages/flutter_tools/lib/src/features.dart +++ b/packages/flutter_tools/lib/src/features.dart @@ -49,6 +49,9 @@ abstract class FeatureFlags { /// Whether fast single widget reloads are enabled. bool get isSingleWidgetReloadEnabled => false; + /// Whether the CFE experimental invalidation strategy is enabled. + bool get isExperimentalInvalidationStrategyEnabled => false; + /// Whether a particular feature is enabled for the current channel. /// /// Prefer using one of the specific getters above instead of this API. @@ -92,6 +95,9 @@ class FlutterFeatureFlags implements FeatureFlags { @override bool get isSingleWidgetReloadEnabled => isEnabled(singleWidgetReload); + @override + bool get isExperimentalInvalidationStrategyEnabled => isEnabled(experimentalInvalidationStrategy); + @override bool isEnabled(Feature feature) { final String currentChannel = _flutterVersion.channel; @@ -125,6 +131,7 @@ const List allFeatures = [ flutterAndroidFeature, flutterIOSFeature, flutterFuchsiaFeature, + experimentalInvalidationStrategy, ]; /// The [Feature] for flutter web. @@ -270,6 +277,29 @@ const Feature singleWidgetReload = Feature( ), ); +/// The CFE experimental invalidation strategy. +const Feature experimentalInvalidationStrategy = Feature( + name: 'Hot reload optimization that reduces incremental artifact size', + configSetting: 'experimental-invalidation-strategy', + environmentOverride: 'FLUTTER_CFE_EXPERIMENTAL_INVALIDATION', + master: FeatureChannelSetting( + available: true, + enabledByDefault: true, + ), + dev: FeatureChannelSetting( + available: true, + enabledByDefault: false, + ), + beta: FeatureChannelSetting( + available: true, + enabledByDefault: false, + ), + stable: FeatureChannelSetting( + available: true, + enabledByDefault: false, + ), +); + /// A [Feature] is a process for conditionally enabling tool features. /// /// All settings are optional, and if not provided will generally default to diff --git a/packages/flutter_tools/lib/src/resident_runner.dart b/packages/flutter_tools/lib/src/resident_runner.dart index ad3074a2c3e..a4c336e27fd 100644 --- a/packages/flutter_tools/lib/src/resident_runner.dart +++ b/packages/flutter_tools/lib/src/resident_runner.dart @@ -139,12 +139,13 @@ class FlutterDevice { } else { // The flutter-widget-cache feature only applies to run mode. List extraFrontEndOptions = buildInfo.extraFrontEndOptions; - if (featureFlags.isSingleWidgetReloadEnabled) { - extraFrontEndOptions = [ - '--flutter-widget-cache', - ...?extraFrontEndOptions, - ]; - } + extraFrontEndOptions = [ + if (featureFlags.isSingleWidgetReloadEnabled) + '--flutter-widget-cache', + if (featureFlags.isExperimentalInvalidationStrategyEnabled) + '--enable-experiment=alternative-invalidation-strategy', + ...?extraFrontEndOptions, + ]; generator = ResidentCompiler( globals.artifacts.getArtifactPath( Artifact.flutterPatchedSdkPath, diff --git a/packages/flutter_tools/test/general.shard/resident_runner_test.dart b/packages/flutter_tools/test/general.shard/resident_runner_test.dart index c8e66ee5af0..399ec695188 100644 --- a/packages/flutter_tools/test/general.shard/resident_runner_test.dart +++ b/packages/flutter_tools/test/general.shard/resident_runner_test.dart @@ -2578,6 +2578,33 @@ void main() { FeatureFlags: () => TestFeatureFlags(isSingleWidgetReloadEnabled: true) }); + testUsingContext('FlutterDevice passes alternative-invalidation-strategy flag when feature is enabled', () async { + fakeVmServiceHost = FakeVmServiceHost(requests: []); + final MockDevice mockDevice = MockDevice(); + when(mockDevice.targetPlatform).thenAnswer((Invocation invocation) async { + return TargetPlatform.android_arm; + }); + + final DefaultResidentCompiler residentCompiler = (await FlutterDevice.create( + mockDevice, + buildInfo: const BuildInfo( + BuildMode.debug, + '', + treeShakeIcons: false, + extraFrontEndOptions: [], + ), + target: null, platform: null, + )).generator as DefaultResidentCompiler; + + expect(residentCompiler.extraFrontEndOptions, + contains('--enable-experiment=alternative-invalidation-strategy')); + }, overrides: { + Artifacts: () => Artifacts.test(), + FileSystem: () => MemoryFileSystem.test(), + ProcessManager: () => FakeProcessManager.any(), + FeatureFlags: () => TestFeatureFlags(isExperimentalInvalidationStrategyEnabled: true) + }); + testUsingContext('connect sets up log reader', () => testbed.run(() async { fakeVmServiceHost = FakeVmServiceHost(requests: []); final MockDevice mockDevice = MockDevice(); diff --git a/packages/flutter_tools/test/src/testbed.dart b/packages/flutter_tools/test/src/testbed.dart index 44c2b87e789..94cd23ec4b8 100644 --- a/packages/flutter_tools/test/src/testbed.dart +++ b/packages/flutter_tools/test/src/testbed.dart @@ -730,7 +730,8 @@ class TestFeatureFlags implements FeatureFlags { this.isAndroidEnabled = true, this.isIOSEnabled = true, this.isFuchsiaEnabled = false, -}); + this.isExperimentalInvalidationStrategyEnabled = false, + }); @override final bool isLinuxEnabled; @@ -756,6 +757,9 @@ class TestFeatureFlags implements FeatureFlags { @override final bool isFuchsiaEnabled; + @override + final bool isExperimentalInvalidationStrategyEnabled; + @override bool isEnabled(Feature feature) { switch (feature) { @@ -775,6 +779,8 @@ class TestFeatureFlags implements FeatureFlags { return isIOSEnabled; case flutterFuchsiaFeature: return isFuchsiaEnabled; + case experimentalInvalidationStrategy: + return isExperimentalInvalidationStrategyEnabled; } return false; }