[flutter_tool] Teach the tool about local engine Fuchsia artifacts (#43759)
diff --git a/packages/flutter_tools/lib/src/artifacts.dart b/packages/flutter_tools/lib/src/artifacts.dart index fa12f56..ba0e235 100644 --- a/packages/flutter_tools/lib/src/artifacts.dart +++ b/packages/flutter_tools/lib/src/artifacts.dart
@@ -61,8 +61,6 @@ // Fuchsia artifacts from the engine prebuilts. fuchsiaKernelCompiler, - fuchsiaPlatformDill, - fuchsiaPatchedSdk, fuchsiaFlutterJitRunner, } @@ -138,10 +136,6 @@ return 'flutter_ddc_sdk.dill'; case Artifact.fuchsiaKernelCompiler: return 'kernel_compiler.snapshot'; - case Artifact.fuchsiaPlatformDill: - return 'platform_strong.dill'; - case Artifact.fuchsiaPatchedSdk: - return 'flutter_runner_patched_sdk'; case Artifact.fuchsiaFlutterJitRunner: if (mode == BuildMode.debug || mode == BuildMode.profile) { return 'flutter_jit_runner-0.far'; @@ -245,18 +239,17 @@ final String hostPlatform = getNameForHostPlatform(getCurrentHostPlatform()); return fs.path.join(engineDir, hostPlatform, _artifactToFileName(artifact)); default: - assert(false, 'Artifact $artifact not available for platform $platform.'); - return null; + return _getHostArtifactPath(artifact, platform, mode); } } String _getIosArtifactPath(Artifact artifact, TargetPlatform platform, BuildMode mode) { - final String artifactFileName = _artifactToFileName(artifact); switch (artifact) { case Artifact.genSnapshot: case Artifact.snapshotDart: case Artifact.flutterFramework: case Artifact.frontendServerSnapshotForEngineDartSdk: + final String artifactFileName = _artifactToFileName(artifact); final String engineDir = _getEngineArtifactsPath(platform, mode); return fs.path.join(engineDir, artifactFileName); case Artifact.ideviceId: @@ -264,21 +257,23 @@ case Artifact.idevicescreenshot: case Artifact.idevicesyslog: case Artifact.idevicename: + final String artifactFileName = _artifactToFileName(artifact); return cache.getArtifactDirectory('libimobiledevice').childFile(artifactFileName).path; case Artifact.iosDeploy: + final String artifactFileName = _artifactToFileName(artifact); return cache.getArtifactDirectory('ios-deploy').childFile(artifactFileName).path; case Artifact.ideviceinstaller: + final String artifactFileName = _artifactToFileName(artifact); return cache.getArtifactDirectory('ideviceinstaller').childFile(artifactFileName).path; case Artifact.iproxy: + final String artifactFileName = _artifactToFileName(artifact); return cache.getArtifactDirectory('usbmuxd').childFile(artifactFileName).path; default: - assert(false, 'Artifact $artifact not available for platform $platform.'); - return null; + return _getHostArtifactPath(artifact, platform, mode); } } String _getFuchsiaArtifactPath(Artifact artifact, TargetPlatform platform, BuildMode mode) { - final String artifactFileName = _artifactToFileName(artifact, platform, mode); final String root = fs.path.join( cache.getArtifactDirectory('flutter_runner').path, 'flutter', @@ -286,16 +281,20 @@ getNameForBuildMode(mode), ); switch (artifact) { - case Artifact.fuchsiaKernelCompiler: - return fs.path.join(root, 'jit', 'dart_binaries', artifactFileName); - case Artifact.fuchsiaPlatformDill: + case Artifact.flutterPatchedSdkPath: + const String artifactFileName = 'flutter_runner_patched_sdk'; + return fs.path.join(root, 'jit', artifactFileName); + case Artifact.platformKernelDill: + final String artifactFileName = _artifactToFileName(artifact, platform, mode); return fs.path.join(root, 'jit', 'flutter_runner_patched_sdk', artifactFileName); - case Artifact.fuchsiaPatchedSdk: + case Artifact.fuchsiaKernelCompiler: + final String artifactFileName = _artifactToFileName(artifact, platform, mode); + return fs.path.join(root, 'jit', 'dart_binaries', artifactFileName); case Artifact.fuchsiaFlutterJitRunner: + final String artifactFileName = _artifactToFileName(artifact, platform, mode); return fs.path.join(root, 'jit', artifactFileName); default: - assert(false, 'Artifact $artifact not available for platform $platform.'); - return null; + return _getHostArtifactPath(artifact, platform, mode); } } @@ -423,6 +422,9 @@ case Artifact.vmSnapshotData: return fs.path.join(engineOutPath, 'gen', 'flutter', 'lib', 'snapshot', artifactFileName); case Artifact.platformKernelDill: + if (platform == TargetPlatform.fuchsia_x64 || platform == TargetPlatform.fuchsia_arm64) { + return fs.path.join(engineOutPath, 'flutter_runner_patched_sdk', artifactFileName); + } return fs.path.join(_getFlutterPatchedSdkPath(mode), artifactFileName); case Artifact.platformLibrariesJson: return fs.path.join(_getFlutterPatchedSdkPath(mode), 'lib', artifactFileName); @@ -435,6 +437,9 @@ // what was specified in [mode] argument because local engine will // have only one flutter_patched_sdk in standard location, that // is happen to be what debug(non-release) mode is using. + if (platform == TargetPlatform.fuchsia_x64 || platform == TargetPlatform.fuchsia_arm64) { + return fs.path.join(engineOutPath, 'flutter_runner_patched_sdk'); + } return _getFlutterPatchedSdkPath(BuildMode.debug); case Artifact.flutterWebSdk: return _getFlutterWebSdkPath(); @@ -473,11 +478,14 @@ case Artifact.webPlatformKernelDill: return fs.path.join(_getFlutterWebSdkPath(), 'kernel', _artifactToFileName(artifact)); case Artifact.fuchsiaKernelCompiler: - case Artifact.fuchsiaPlatformDill: - case Artifact.fuchsiaPatchedSdk: + final String hostPlatform = getNameForHostPlatform(getCurrentHostPlatform()); + final String dartBinaries = 'dart_binaries-$mode-$hostPlatform'; + return fs.path.join(engineOutPath, 'host_bundle', dartBinaries, 'kernel_compiler.dart.snapshot'); case Artifact.fuchsiaFlutterJitRunner: - assert(false, 'Invalid local engine artifact $artifact.'); - return null; + if (mode == BuildMode.debug || mode == BuildMode.profile) { + return fs.path.join(engineOutPath, 'flutter_jit_runner-0.far'); + } + return fs.path.join(engineOutPath, 'flutter_jit_product_runner-0.far'); } assert(false, 'Invalid artifact $artifact.'); return null;
diff --git a/packages/flutter_tools/lib/src/build_system/build_system.dart b/packages/flutter_tools/lib/src/build_system/build_system.dart index 25236e2..19de36b 100644 --- a/packages/flutter_tools/lib/src/build_system/build_system.dart +++ b/packages/flutter_tools/lib/src/build_system/build_system.dart
@@ -575,6 +575,9 @@ final String target; final dynamic exception; final StackTrace stackTrace; + + @override + String toString() => 'target: $target\nexception:$exception\n$stackTrace'; } /// Helper class to collect measurement data.
diff --git a/packages/flutter_tools/lib/src/build_system/targets/dart.dart b/packages/flutter_tools/lib/src/build_system/targets/dart.dart index ed4945f..13cc4e0 100644 --- a/packages/flutter_tools/lib/src/build_system/targets/dart.dart +++ b/packages/flutter_tools/lib/src/build_system/targets/dart.dart
@@ -207,19 +207,33 @@ if (environment.defines[kBuildMode] == null) { throw MissingDefineException(kBuildMode, 'kernel_snapshot'); } + if (environment.defines[kTargetPlatform] == null) { + throw MissingDefineException(kTargetPlatform, 'kernel_snapshot'); + } final BuildMode buildMode = getBuildModeForName(environment.defines[kBuildMode]); final String targetFile = environment.defines[kTargetFile] ?? fs.path.join('lib', 'main.dart'); final String packagesPath = environment.projectDir.childFile('.packages').path; final String targetFileAbsolute = fs.file(targetFile).absolute.path; // everything besides 'false' is considered to be enabled. final bool trackWidgetCreation = environment.defines[kTrackWidgetCreation] != 'false'; + final TargetPlatform targetPlatform = getTargetPlatformForName(environment.defines[kTargetPlatform]); + + TargetModel targetModel = TargetModel.flutter; + if (targetPlatform == TargetPlatform.fuchsia_x64 || + targetPlatform == TargetPlatform.fuchsia_arm64) { + targetModel = TargetModel.flutterRunner; + } final CompilerOutput output = await compiler.compile( - sdkRoot: artifacts.getArtifactPath(Artifact.flutterPatchedSdkPath, mode: buildMode), + sdkRoot: artifacts.getArtifactPath( + Artifact.flutterPatchedSdkPath, + platform: targetPlatform, + mode: buildMode, + ), aot: buildMode != BuildMode.debug, buildMode: buildMode, trackWidgetCreation: trackWidgetCreation && buildMode == BuildMode.debug, - targetModel: TargetModel.flutter, + targetModel: targetModel, outputFilePath: environment.buildDir.childFile('app.dill').path, packagesPath: packagesPath, linkPlatformKernelIn: buildMode == BuildMode.release,
diff --git a/packages/flutter_tools/lib/src/codegen.dart b/packages/flutter_tools/lib/src/codegen.dart index 6703dd1..bd66869 100644 --- a/packages/flutter_tools/lib/src/codegen.dart +++ b/packages/flutter_tools/lib/src/codegen.dart
@@ -171,10 +171,15 @@ String outputPath, String initializeFromDill, bool runCold = false, + TargetPlatform targetPlatform, }) async { codeGenerator.updatePackages(flutterProject); final ResidentCompiler residentCompiler = ResidentCompiler( - artifacts.getArtifactPath(Artifact.flutterPatchedSdkPath), + artifacts.getArtifactPath( + Artifact.flutterPatchedSdkPath, + platform: targetPlatform, + mode: buildMode, + ), buildMode: buildMode, trackWidgetCreation: trackWidgetCreation, packagesPath: PackageMap.globalGeneratedPackagesPath,
diff --git a/packages/flutter_tools/lib/src/fuchsia/fuchsia_device.dart b/packages/flutter_tools/lib/src/fuchsia/fuchsia_device.dart index 07be37c..142a7b9 100644 --- a/packages/flutter_tools/lib/src/fuchsia/fuchsia_device.dart +++ b/packages/flutter_tools/lib/src/fuchsia/fuchsia_device.dart
@@ -433,24 +433,6 @@ void clearLogs() {} @override - OverrideArtifacts get artifactOverrides { - return _artifactOverrides ??= OverrideArtifacts( - parent: Artifacts.instance, - platformKernelDill: fs.file(artifacts.getArtifactPath( - Artifact.fuchsiaPlatformDill, - platform: TargetPlatform.fuchsia_x64, - mode: BuildMode.debug, - )), - flutterPatchedSdk: fs.file(artifacts.getArtifactPath( - Artifact.fuchsiaPatchedSdk, - platform: TargetPlatform.fuchsia_x64, - mode: BuildMode.debug, - )), - ); - } - OverrideArtifacts _artifactOverrides; - - @override bool get supportsScreenshot => false; bool get ipv6 {
diff --git a/packages/flutter_tools/lib/src/fuchsia/fuchsia_kernel_compiler.dart b/packages/flutter_tools/lib/src/fuchsia/fuchsia_kernel_compiler.dart index aabe9a8..48caeca 100644 --- a/packages/flutter_tools/lib/src/fuchsia/fuchsia_kernel_compiler.dart +++ b/packages/flutter_tools/lib/src/fuchsia/fuchsia_kernel_compiler.dart
@@ -38,13 +38,13 @@ final String kernelCompiler = artifacts.getArtifactPath( Artifact.fuchsiaKernelCompiler, platform: TargetPlatform.fuchsia_x64, // This file is not arch-specific. - mode: BuildMode.debug, + mode: buildInfo.mode, ); if (!fs.isFileSync(kernelCompiler)) { throwToolExit('Fuchisa kernel compiler not found at "$kernelCompiler"'); } final String platformDill = artifacts.getArtifactPath( - Artifact.fuchsiaPlatformDill, + Artifact.platformKernelDill, platform: TargetPlatform.fuchsia_x64, // This file is not arch-specific. mode: buildInfo.mode, ); @@ -92,7 +92,7 @@ final List<String> command = <String>[ artifacts.getArtifactPath(Artifact.engineDartBinary), - artifacts.getArtifactPath(Artifact.fuchsiaKernelCompiler), + kernelCompiler, ...flags, ]; final Process process = await processUtils.start(command);
diff --git a/packages/flutter_tools/lib/src/resident_runner.dart b/packages/flutter_tools/lib/src/resident_runner.dart index 6de86aa..c48d2a6 100644 --- a/packages/flutter_tools/lib/src/resident_runner.dart +++ b/packages/flutter_tools/lib/src/resident_runner.dart
@@ -37,12 +37,17 @@ this.fileSystemScheme, this.viewFilter, TargetModel targetModel = TargetModel.flutter, + TargetPlatform targetPlatform, List<String> experimentalFlags, ResidentCompiler generator, @required BuildMode buildMode, }) : assert(trackWidgetCreation != null), generator = generator ?? ResidentCompiler( - artifacts.getArtifactPath(Artifact.flutterPatchedSdkPath, mode: buildMode), + artifacts.getArtifactPath( + Artifact.flutterPatchedSdkPath, + platform: targetPlatform, + mode: buildMode, + ), buildMode: buildMode, trackWidgetCreation: trackWidgetCreation, fileSystemRoots: fileSystemRoots, @@ -66,8 +71,12 @@ ResidentCompiler generator, }) async { ResidentCompiler generator; + final TargetPlatform targetPlatform = await device.targetPlatform; + if (device.platformType == PlatformType.fuchsia) { + targetModel = TargetModel.flutterRunner; + } if (featureFlags.isWebIncrementalCompilerEnabled && - await device.targetPlatform == TargetPlatform.web_javascript) { + targetPlatform == TargetPlatform.web_javascript) { generator = ResidentCompiler( artifacts.getArtifactPath(Artifact.flutterWebSdk, mode: buildMode), buildMode: buildMode, @@ -80,12 +89,17 @@ ); } else if (flutterProject.hasBuilders) { generator = await CodeGeneratingResidentCompiler.create( + targetPlatform: targetPlatform, buildMode: buildMode, flutterProject: flutterProject, ); } else { generator = ResidentCompiler( - artifacts.getArtifactPath(Artifact.flutterPatchedSdkPath, mode: buildMode), + artifacts.getArtifactPath( + Artifact.flutterPatchedSdkPath, + platform: targetPlatform, + mode: buildMode, + ), buildMode: buildMode, trackWidgetCreation: trackWidgetCreation, fileSystemRoots: fileSystemRoots, @@ -102,6 +116,7 @@ viewFilter: viewFilter, experimentalFlags: experimentalFlags, targetModel: targetModel, + targetPlatform: targetPlatform, generator: generator, buildMode: buildMode, );
diff --git a/packages/flutter_tools/test/commands.shard/hermetic/run_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/run_test.dart index fdf649e..b13a303 100644 --- a/packages/flutter_tools/test/commands.shard/hermetic/run_test.dart +++ b/packages/flutter_tools/test/commands.shard/hermetic/run_test.dart
@@ -232,6 +232,9 @@ Future<TargetPlatform> get targetPlatform async => _targetPlatform; @override + final PlatformType platformType = PlatformType.ios; + + @override Future<LaunchResult> startApp( ApplicationPackage package, { String mainPath,
diff --git a/packages/flutter_tools/test/general.shard/build_system/targets/dart_test.dart b/packages/flutter_tools/test/general.shard/build_system/targets/dart_test.dart index 5d1cf05..cf73a40 100644 --- a/packages/flutter_tools/test/general.shard/build_system/targets/dart_test.dart +++ b/packages/flutter_tools/test/general.shard/build_system/targets/dart_test.dart
@@ -236,7 +236,6 @@ expect(result.exceptions.values.single.exception, isInstanceOf<MissingDefineException>()); })); - test('aot_elf_profile throws error if missing target platform', () => testbed.run(() async { final BuildResult result = await buildSystem.build(const AotElfProfile(), androidEnvironment..defines.remove(kTargetPlatform)); @@ -244,7 +243,6 @@ expect(result.exceptions.values.single.exception, isInstanceOf<MissingDefineException>()); })); - test('aot_assembly_profile throws error if missing build mode', () => testbed.run(() async { final BuildResult result = await buildSystem.build(const AotAssemblyProfile(), iosEnvironment..defines.remove(kBuildMode));
diff --git a/packages/flutter_tools/test/general.shard/fuchsia/fuchsia_device_test.dart b/packages/flutter_tools/test/general.shard/fuchsia/fuchsia_device_test.dart index d94a8a2..65803ed 100644 --- a/packages/flutter_tools/test/general.shard/fuchsia/fuchsia_device_test.dart +++ b/packages/flutter_tools/test/general.shard/fuchsia/fuchsia_device_test.dart
@@ -126,76 +126,6 @@ }); }); - group('Fuchsia device artifact overrides', () { - MemoryFileSystem memoryFileSystem; - File devFinder; - File sshConfig; - File platformDill; - File patchedSdk; - MockArtifacts mockArtifacts; - - setUp(() { - memoryFileSystem = MemoryFileSystem(); - devFinder = memoryFileSystem.file('dev_finder'); - sshConfig = memoryFileSystem.file('ssh_config'); - platformDill = memoryFileSystem.file('platform_strong.dill'); - patchedSdk = memoryFileSystem.file('flutter_runner_patched_sdk'); - - mockArtifacts = MockArtifacts(); - when(mockArtifacts.getArtifactPath( - Artifact.fuchsiaPlatformDill, - platform: anyNamed('platform'), - mode: anyNamed('mode'), - )).thenReturn(platformDill.path); - when(mockArtifacts.getArtifactPath( - Artifact.fuchsiaPatchedSdk, - platform: anyNamed('platform'), - mode: anyNamed('mode'), - )).thenReturn(patchedSdk.path); - }); - - testUsingContext('exist', () async { - final FuchsiaDevice device = FuchsiaDevice('fuchsia-device'); - expect(device.artifactOverrides, isNotNull); - expect(device.artifactOverrides.platformKernelDill.path, equals(platformDill.path)); - expect(device.artifactOverrides.flutterPatchedSdk.path, equals(patchedSdk.path)); - }, overrides: <Type, Generator>{ - Artifacts: () => mockArtifacts, - FileSystem: () => memoryFileSystem, - FuchsiaArtifacts: () => FuchsiaArtifacts( - sshConfig: sshConfig, - devFinder: devFinder, - ), - ProcessManager: () => FakeProcessManager.any(), - }); - - testUsingContext('are used', () async { - final FuchsiaDevice device = FuchsiaDevice('fuchsia-device'); - expect(device.artifactOverrides, isNotNull); - expect(device.artifactOverrides.platformKernelDill.path, equals(platformDill.path)); - expect(device.artifactOverrides.flutterPatchedSdk.path, equals(patchedSdk.path)); - await context.run<void>( - body: () { - expect(Artifacts.instance.getArtifactPath(Artifact.platformKernelDill), - equals(platformDill.path)); - expect(Artifacts.instance.getArtifactPath(Artifact.flutterPatchedSdkPath), - equals(patchedSdk.path)); - }, - overrides: <Type, Generator>{ - Artifacts: () => device.artifactOverrides, - }, - ); - }, overrides: <Type, Generator>{ - Artifacts: () => mockArtifacts, - FileSystem: () => memoryFileSystem, - FuchsiaArtifacts: () => FuchsiaArtifacts( - sshConfig: sshConfig, - devFinder: devFinder, - ), - ProcessManager: () => FakeProcessManager.any(), - }); - }); - group('displays friendly error when', () { MockProcessManager mockProcessManager; MockProcessResult mockProcessResult; @@ -480,12 +410,12 @@ mode: anyNamed('mode'), )).thenReturn(compilerSnapshot.path); when(mockArtifacts.getArtifactPath( - Artifact.fuchsiaPlatformDill, + Artifact.platformKernelDill, platform: anyNamed('platform'), mode: anyNamed('mode'), )).thenReturn(platformDill.path); when(mockArtifacts.getArtifactPath( - Artifact.fuchsiaPatchedSdk, + Artifact.flutterPatchedSdkPath, platform: anyNamed('platform'), mode: anyNamed('mode'), )).thenReturn(patchedSdk.path);