Unverified Commit f52eaaea authored by Lau Ching Jun's avatar Lau Ching Jun Committed by GitHub

Allow overriding the native assets yaml file in the resident runner. (#142016)

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

Context: b/286799303
parent f04958a1
......@@ -90,6 +90,7 @@ class AttachCommand extends FlutterCommand {
addEnableExperimentation(hide: !verboseHelp);
addNullSafetyModeOptions(hide: !verboseHelp);
usesInitializeFromDillOption(hide: !verboseHelp);
usesNativeAssetsOption(hide: !verboseHelp);
argParser
..addOption(
'debug-port',
......@@ -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(
......@@ -572,6 +574,7 @@ class HotRunnerFactory {
bool stayResident = true,
bool ipv6 = false,
FlutterProject? flutterProject,
String? nativeAssetsYamlFile,
required Analytics analytics,
}) => HotRunner(
devices,
......@@ -584,6 +587,7 @@ class HotRunnerFactory {
dillOutputPath: dillOutputPath,
stayResident: stayResident,
ipv6: ipv6,
nativeAssetsYamlFile: nativeAssetsYamlFile,
analytics: analytics,
);
}
......@@ -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
......@@ -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(
......
......@@ -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,
......@@ -140,6 +142,7 @@ class HotRunner extends ResidentRunner {
bool? _emulator;
NativeAssetsBuildRunner? _buildRunner;
final String? _nativeAssetsYamlFile;
String? flavor;
......@@ -371,6 +374,10 @@ class HotRunner extends ResidentRunner {
}) async {
await _calculateTargetPlatform();
final Uri? nativeAssetsYaml;
if (_nativeAssetsYamlFile != null) {
nativeAssetsYaml = globals.fs.path.toUri(_nativeAssetsYamlFile);
} else {
final Uri projectUri = Uri.directory(projectRootPath);
_buildRunner ??= NativeAssetsBuildRunnerImpl(
projectUri,
......@@ -378,12 +385,13 @@ class HotRunner extends ResidentRunner {
fileSystem,
globals.logger,
);
final Uri? nativeAssetsYaml = await dryRunNativeAssets(
nativeAssetsYaml = await dryRunNativeAssets(
projectUri: projectUri,
fileSystem: fileSystem,
buildRunner: _buildRunner!,
flutterDevices: flutterDevices,
);
}
final Stopwatch appStartedTimer = Stopwatch()..start();
final File mainFile = globals.fs.file(mainPath);
......
......@@ -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';
......@@ -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,
......
......@@ -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) {
......
......@@ -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,
......@@ -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(),
......@@ -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(
......@@ -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>[]);
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment