diff --git a/packages/flutter_tools/lib/src/build_info.dart b/packages/flutter_tools/lib/src/build_info.dart index f91ed1093a1..119e3929876 100644 --- a/packages/flutter_tools/lib/src/build_info.dart +++ b/packages/flutter_tools/lib/src/build_info.dart @@ -42,6 +42,7 @@ class BuildInfo { this.androidGradleDaemon = true, this.packageConfig = PackageConfig.empty, this.initializeFromDill, + this.assumeInitializeFromDillUpToDate = false, }) : extraFrontEndOptions = extraFrontEndOptions ?? const [], extraGenSnapshotOptions = extraGenSnapshotOptions ?? const [], fileSystemRoots = fileSystemRoots ?? const [], @@ -159,6 +160,10 @@ class BuildInfo { /// If this is null, it will be initialized from the default cached location. final String? initializeFromDill; + /// If set, assumes that the file passed in [initializeFromDill] is up to date + /// and skips the check and potential invalidation of files. + final bool assumeInitializeFromDillUpToDate; + static const BuildInfo debug = BuildInfo(BuildMode.debug, null, treeShakeIcons: false); static const BuildInfo profile = BuildInfo(BuildMode.profile, null, treeShakeIcons: kIconTreeShakerEnabledDefault); static const BuildInfo jitRelease = BuildInfo(BuildMode.jitRelease, null, treeShakeIcons: kIconTreeShakerEnabledDefault); diff --git a/packages/flutter_tools/lib/src/compile.dart b/packages/flutter_tools/lib/src/compile.dart index 139e62780bb..588c35f2d9d 100644 --- a/packages/flutter_tools/lib/src/compile.dart +++ b/packages/flutter_tools/lib/src/compile.dart @@ -451,6 +451,7 @@ abstract class ResidentCompiler { List fileSystemRoots, String? fileSystemScheme, String initializeFromDill, + bool assumeInitializeFromDillUpToDate, TargetModel targetModel, bool unsafePackageSerialization, List extraFrontEndOptions, @@ -559,6 +560,7 @@ class DefaultResidentCompiler implements ResidentCompiler { List fileSystemRoots = const [], this.fileSystemScheme, this.initializeFromDill, + this.assumeInitializeFromDillUpToDate = false, this.targetModel = TargetModel.flutter, this.unsafePackageSerialization = false, this.extraFrontEndOptions, @@ -591,6 +593,7 @@ class DefaultResidentCompiler implements ResidentCompiler { final List fileSystemRoots; final String? fileSystemScheme; final String? initializeFromDill; + final bool assumeInitializeFromDillUpToDate; final bool unsafePackageSerialization; final List? extraFrontEndOptions; final List dartDefines; @@ -768,6 +771,7 @@ class DefaultResidentCompiler implements ResidentCompiler { '--initialize-from-dill', initializeFromDill!, ], + if (assumeInitializeFromDillUpToDate) '--assume-initialize-from-dill-up-to-date', if (additionalSource != null) ...[ '--source', additionalSource, diff --git a/packages/flutter_tools/lib/src/resident_runner.dart b/packages/flutter_tools/lib/src/resident_runner.dart index d06cfea399b..9d630ed9f0d 100644 --- a/packages/flutter_tools/lib/src/resident_runner.dart +++ b/packages/flutter_tools/lib/src/resident_runner.dart @@ -126,6 +126,7 @@ class FlutterDevice { dartDefines: buildInfo.dartDefines, extraFrontEndOptions: extraFrontEndOptions, ), + assumeInitializeFromDillUpToDate: buildInfo.assumeInitializeFromDillUpToDate, targetModel: TargetModel.dartdevc, extraFrontEndOptions: extraFrontEndOptions, platformDill: globals.fs.file(globals.artifacts @@ -168,6 +169,7 @@ class FlutterDevice { dartDefines: buildInfo.dartDefines, extraFrontEndOptions: extraFrontEndOptions, ), + assumeInitializeFromDillUpToDate: buildInfo.assumeInitializeFromDillUpToDate, packagesPath: buildInfo.packagesPath, artifacts: globals.artifacts, processManager: globals.processManager, diff --git a/packages/flutter_tools/lib/src/runner/flutter_command.dart b/packages/flutter_tools/lib/src/runner/flutter_command.dart index 4eb9ec194a4..c6066cf7cd0 100644 --- a/packages/flutter_tools/lib/src/runner/flutter_command.dart +++ b/packages/flutter_tools/lib/src/runner/flutter_command.dart @@ -115,6 +115,7 @@ class FlutterOptions { static const String kDeferredComponents = 'deferred-components'; static const String kAndroidProjectArgs = 'android-project-arg'; static const String kInitializeFromDill = 'initialize-from-dill'; + static const String kAssumeInitializeFromDillUpToDate = 'assume-initialize-from-dill-up-to-date'; static const String kFatalWarnings = 'fatal-warnings'; } @@ -829,6 +830,11 @@ abstract class FlutterCommand extends Command { 'the default cached location.', hide: hide, ); + argParser.addFlag(FlutterOptions.kAssumeInitializeFromDillUpToDate, + help: 'If set, assumes that the file passed in initialize-from-dill is up ' + 'to date and skip the check and potential invalidation of files.', + hide: hide, + ); } void addMultidexOption({ bool hide = false }) { @@ -1113,6 +1119,8 @@ abstract class FlutterCommand extends Command { initializeFromDill: argParser.options.containsKey(FlutterOptions.kInitializeFromDill) ? stringArg(FlutterOptions.kInitializeFromDill) : null, + assumeInitializeFromDillUpToDate: argParser.options.containsKey(FlutterOptions.kAssumeInitializeFromDillUpToDate) + && boolArg(FlutterOptions.kAssumeInitializeFromDillUpToDate), ); } 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 eed1bc664a9..feb7ff42f7d 100644 --- a/packages/flutter_tools/test/general.shard/resident_runner_test.dart +++ b/packages/flutter_tools/test/general.shard/resident_runner_test.dart @@ -1882,6 +1882,30 @@ flutter: )).generator as DefaultResidentCompiler; expect(residentCompiler.initializeFromDill, '/foo/bar.dill'); + expect(residentCompiler.assumeInitializeFromDillUpToDate, false); + }, overrides: { + Artifacts: () => Artifacts.test(), + FileSystem: () => MemoryFileSystem.test(), + ProcessManager: () => FakeProcessManager.any(), + }); + + testUsingContext('FlutterDevice passes assumeInitializeFromDillUpToDate parameter if specified', () async { + fakeVmServiceHost = FakeVmServiceHost(requests: []); + final FakeDevice device = FakeDevice(); + + final DefaultResidentCompiler residentCompiler = (await FlutterDevice.create( + device, + buildInfo: const BuildInfo( + BuildMode.debug, + '', + treeShakeIcons: false, + extraFrontEndOptions: [], + assumeInitializeFromDillUpToDate: true, + ), + target: null, platform: null, + )).generator as DefaultResidentCompiler; + + expect(residentCompiler.assumeInitializeFromDillUpToDate, true); }, overrides: { Artifacts: () => Artifacts.test(), FileSystem: () => MemoryFileSystem.test(), diff --git a/packages/flutter_tools/test/general.shard/runner/flutter_command_test.dart b/packages/flutter_tools/test/general.shard/runner/flutter_command_test.dart index 6a05f0e6850..6b8a2ecc94c 100644 --- a/packages/flutter_tools/test/general.shard/runner/flutter_command_test.dart +++ b/packages/flutter_tools/test/general.shard/runner/flutter_command_test.dart @@ -588,6 +588,28 @@ void main() { ProcessManager: () => processManager, }); + testUsingContext('includes assumeInitializeFromDillUpToDate in BuildInfo', () async { + final DummyFlutterCommand flutterCommand = DummyFlutterCommand()..usesInitializeFromDillOption(hide: false); + final CommandRunner runner = createTestCommandRunner(flutterCommand); + await runner.run(['dummy', '--assume-initialize-from-dill-up-to-date']); + final BuildInfo buildInfo = await flutterCommand.getBuildInfo(forcedBuildMode: BuildMode.debug); + expect(buildInfo.assumeInitializeFromDillUpToDate, isTrue); + }, overrides: { + FileSystem: () => fileSystem, + ProcessManager: () => processManager, + }); + + testUsingContext('unsets assumeInitializeFromDillUpToDate in BuildInfo when disabled', () async { + final DummyFlutterCommand flutterCommand = DummyFlutterCommand()..usesInitializeFromDillOption(hide: false); + final CommandRunner runner = createTestCommandRunner(flutterCommand); + await runner.run(['dummy', '--no-assume-initialize-from-dill-up-to-date']); + final BuildInfo buildInfo = await flutterCommand.getBuildInfo(forcedBuildMode: BuildMode.debug); + expect(buildInfo.assumeInitializeFromDillUpToDate, isFalse); + }, overrides: { + FileSystem: () => fileSystem, + ProcessManager: () => processManager, + }); + testUsingContext('dds options', () async { final FakeDdsCommand ddsCommand = FakeDdsCommand(); final CommandRunner runner = createTestCommandRunner(ddsCommand);