Skip to content

Commit

Permalink
Allow overriding the native assets yaml file in the resident runner. …
Browse files Browse the repository at this point in the history
…(#142016)

This is used when the native assets are built by a separate build system.

Context: b/286799303
  • Loading branch information
chingjun authored Jan 23, 2024
1 parent f04958a commit f52eaae
Show file tree
Hide file tree
Showing 6 changed files with 105 additions and 14 deletions.
4 changes: 4 additions & 0 deletions packages/flutter_tools/lib/src/commands/attach.dart
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,7 @@ class AttachCommand extends FlutterCommand {
addEnableExperimentation(hide: !verboseHelp);
addNullSafetyModeOptions(hide: !verboseHelp);
usesInitializeFromDillOption(hide: !verboseHelp);
usesNativeAssetsOption(hide: !verboseHelp);
argParser
..addOption(
'debug-port',
Expand Down Expand Up @@ -539,6 +540,7 @@ known, it can be explicitly provided to attach via the command-line, e.g.
dillOutputPath: stringArg('output-dill'),
ipv6: usesIpv6,
flutterProject: flutterProject,
nativeAssetsYamlFile: stringArg(FlutterOptions.kNativeAssetsYamlFile),
analytics: analytics,
)
: ColdRunner(
Expand Down Expand Up @@ -572,6 +574,7 @@ class HotRunnerFactory {
bool stayResident = true,
bool ipv6 = false,
FlutterProject? flutterProject,
String? nativeAssetsYamlFile,
required Analytics analytics,
}) => HotRunner(
devices,
Expand All @@ -584,6 +587,7 @@ class HotRunnerFactory {
dillOutputPath: dillOutputPath,
stayResident: stayResident,
ipv6: ipv6,
nativeAssetsYamlFile: nativeAssetsYamlFile,
analytics: analytics,
);
}
2 changes: 2 additions & 0 deletions packages/flutter_tools/lib/src/commands/run.dart
Original file line number Diff line number Diff line change
Expand Up @@ -331,6 +331,7 @@ class RunCommand extends RunCommandBase {
usesFrontendServerStarterPathOption(verboseHelp: verboseHelp);
addEnableExperimentation(hide: !verboseHelp);
usesInitializeFromDillOption(hide: !verboseHelp);
usesNativeAssetsOption(hide: !verboseHelp);

// By default, the app should to publish the VM service port over mDNS.
// This will allow subsequent "flutter attach" commands to connect to the VM
Expand Down Expand Up @@ -641,6 +642,7 @@ class RunCommand extends RunCommandBase {
ipv6: ipv6 ?? false,
multidexEnabled: boolArg('multidex'),
analytics: globals.analytics,
nativeAssetsYamlFile: stringArg(FlutterOptions.kNativeAssetsYamlFile),
);
} else if (webMode) {
return webRunnerFactory!.createWebRunner(
Expand Down
34 changes: 21 additions & 13 deletions packages/flutter_tools/lib/src/run_hot.dart
Original file line number Diff line number Diff line change
Expand Up @@ -95,11 +95,13 @@ class HotRunner extends ResidentRunner {
ReloadSourcesHelper reloadSourcesHelper = defaultReloadSourcesHelper,
ReassembleHelper reassembleHelper = _defaultReassembleHelper,
NativeAssetsBuildRunner? buildRunner,
String? nativeAssetsYamlFile,
required Analytics analytics,
}) : _stopwatchFactory = stopwatchFactory,
_reloadSourcesHelper = reloadSourcesHelper,
_reassembleHelper = reassembleHelper,
_buildRunner = buildRunner,
_nativeAssetsYamlFile = nativeAssetsYamlFile,
_analytics = analytics,
super(
hotMode: true,
Expand Down Expand Up @@ -140,6 +142,7 @@ class HotRunner extends ResidentRunner {
bool? _emulator;

NativeAssetsBuildRunner? _buildRunner;
final String? _nativeAssetsYamlFile;

String? flavor;

Expand Down Expand Up @@ -371,19 +374,24 @@ class HotRunner extends ResidentRunner {
}) async {
await _calculateTargetPlatform();

final Uri projectUri = Uri.directory(projectRootPath);
_buildRunner ??= NativeAssetsBuildRunnerImpl(
projectUri,
debuggingOptions.buildInfo.packageConfig,
fileSystem,
globals.logger,
);
final Uri? nativeAssetsYaml = await dryRunNativeAssets(
projectUri: projectUri,
fileSystem: fileSystem,
buildRunner: _buildRunner!,
flutterDevices: flutterDevices,
);
final Uri? nativeAssetsYaml;
if (_nativeAssetsYamlFile != null) {
nativeAssetsYaml = globals.fs.path.toUri(_nativeAssetsYamlFile);
} else {
final Uri projectUri = Uri.directory(projectRootPath);
_buildRunner ??= NativeAssetsBuildRunnerImpl(
projectUri,
debuggingOptions.buildInfo.packageConfig,
fileSystem,
globals.logger,
);
nativeAssetsYaml = await dryRunNativeAssets(
projectUri: projectUri,
fileSystem: fileSystem,
buildRunner: _buildRunner!,
flutterDevices: flutterDevices,
);
}

final Stopwatch appStartedTimer = Stopwatch()..start();
final File mainFile = globals.fs.file(mainPath);
Expand Down
9 changes: 9 additions & 0 deletions packages/flutter_tools/lib/src/runner/flutter_command.dart
Original file line number Diff line number Diff line change
Expand Up @@ -150,6 +150,7 @@ abstract final class FlutterOptions {
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 kNativeAssetsYamlFile = 'native-assets-yaml-file';
static const String kFatalWarnings = 'fatal-warnings';
static const String kUseApplicationBinary = 'use-application-binary';
static const String kWebBrowserFlag = 'web-browser-flag';
Expand Down Expand Up @@ -1007,6 +1008,14 @@ abstract class FlutterCommand extends Command<void> {
);
}

void usesNativeAssetsOption({ required bool hide }) {
argParser.addOption(FlutterOptions.kNativeAssetsYamlFile,
help: 'Initializes the resident compiler with a custom native assets '
'yaml file instead of the default cached location.',
hide: hide,
);
}

void addMultidexOption({ bool hide = false }) {
argParser.addFlag('multidex',
defaultsTo: true,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1208,6 +1208,7 @@ class FakeHotRunnerFactory extends Fake implements HotRunnerFactory {
bool ipv6 = false,
FlutterProject? flutterProject,
Analytics? analytics,
String? nativeAssetsYamlFile,
}) {
if (_artifactTester != null) {
for (final FlutterDevice device in devices) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2455,12 +2455,14 @@ flutter:
targetPlatform: TargetPlatform.darwin,
sdkNameAndVersion: 'Macos',
);
final FakeResidentCompiler residentCompiler = FakeResidentCompiler();
final FakeFlutterDevice flutterDevice = FakeFlutterDevice()
..testUri = testUri
..vmServiceHost = (() => fakeVmServiceHost)
..device = device
.._devFS = devFS
..targetPlatform = TargetPlatform.darwin;
..targetPlatform = TargetPlatform.darwin
..generator = residentCompiler;

fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[
listViews,
Expand Down Expand Up @@ -2508,6 +2510,67 @@ flutter:
expect(buildRunner.dryRunInvocations, 1);
expect(buildRunner.hasPackageConfigInvocations, 1);
expect(buildRunner.packagesWithNativeAssetsInvocations, 1);

expect(residentCompiler.recompileCalled, true);
expect(residentCompiler.receivedNativeAssetsYaml.toString(), endsWith('native_assets/macos/native_assets.yaml'));
}),
overrides: <Type, Generator>{
ProcessManager: () => FakeProcessManager.any(),
FeatureFlags: () => TestFeatureFlags(isNativeAssetsEnabled: true, isMacOSEnabled: true),
});

testUsingContext(
'use the nativeAssetsYamlFile when provided',
() => testbed.run(() async {
final FakeDevice device = FakeDevice(
targetPlatform: TargetPlatform.darwin,
sdkNameAndVersion: 'Macos',
);
final FakeResidentCompiler residentCompiler = FakeResidentCompiler();
final FakeFlutterDevice flutterDevice = FakeFlutterDevice()
..testUri = testUri
..vmServiceHost = (() => fakeVmServiceHost)
..device = device
.._devFS = devFS
..targetPlatform = TargetPlatform.darwin
..generator = residentCompiler;

fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[
listViews,
listViews,
]);
globals.fs
.file(globals.fs.path.join('lib', 'main.dart'))
.createSync(recursive: true);
final FakeNativeAssetsBuildRunner buildRunner = FakeNativeAssetsBuildRunner();
residentRunner = HotRunner(
<FlutterDevice>[
flutterDevice,
],
stayResident: false,
debuggingOptions: DebuggingOptions.enabled(const BuildInfo(
BuildMode.debug,
'',
treeShakeIcons: false,
trackWidgetCreation: true,
)),
target: 'main.dart',
devtoolsHandler: createNoOpHandler,
buildRunner: buildRunner,
analytics: fakeAnalytics,
nativeAssetsYamlFile: 'foo.yaml',
);

final int? result = await residentRunner.run();
expect(result, 0);

expect(buildRunner.buildInvocations, 0);
expect(buildRunner.dryRunInvocations, 0);
expect(buildRunner.hasPackageConfigInvocations, 0);
expect(buildRunner.packagesWithNativeAssetsInvocations, 0);

expect(residentCompiler.recompileCalled, true);
expect(residentCompiler.receivedNativeAssetsYaml, globals.fs.path.toUri('foo.yaml'));
}),
overrides: <Type, Generator>{
ProcessManager: () => FakeProcessManager.any(),
Expand Down Expand Up @@ -2700,6 +2763,8 @@ class FakeDelegateFlutterDevice extends FlutterDevice {
class FakeResidentCompiler extends Fake implements ResidentCompiler {
CompilerOutput? nextOutput;
bool didSuppressErrors = false;
Uri? receivedNativeAssetsYaml;
bool recompileCalled = false;

@override
Future<CompilerOutput?> recompile(
Expand All @@ -2714,6 +2779,8 @@ class FakeResidentCompiler extends Fake implements ResidentCompiler {
File? dartPluginRegistrant,
Uri? nativeAssetsYaml,
}) async {
recompileCalled = true;
receivedNativeAssetsYaml = nativeAssetsYaml;
didSuppressErrors = suppressErrors;
return nextOutput ?? const CompilerOutput('foo.dill', 0, <Uri>[]);
}
Expand Down

0 comments on commit f52eaae

Please sign in to comment.