diff --git a/packages/flutter_tools/lib/src/build_system/targets/common.dart b/packages/flutter_tools/lib/src/build_system/targets/common.dart index 179b46a2026..d9c4243eac0 100644 --- a/packages/flutter_tools/lib/src/build_system/targets/common.dart +++ b/packages/flutter_tools/lib/src/build_system/targets/common.dart @@ -289,7 +289,7 @@ class KernelSnapshotNativeAssets extends Target { @override List get inputs => [ - const Source.pattern('{BUILD_DIR}/native_assets.yaml'), + const Source.pattern('{BUILD_DIR}/${InstallCodeAssets.nativeAssetsFilename}'), ...const KernelSnapshotProgram().inputs, ]; @@ -302,15 +302,15 @@ class KernelSnapshotNativeAssets extends Target { List get depfiles => const []; @override - List get dependencies => [ - const NativeAssets(), + List get dependencies => const [ + InstallCodeAssets(), ]; static const String dillName = 'native_assets.dill'; @override Future build(Environment environment) async { - final File nativeAssetsFile = environment.buildDir.childFile('native_assets.yaml'); + final File nativeAssetsFile = environment.buildDir.childFile(InstallCodeAssets.nativeAssetsFilename); final File dillFile = environment.buildDir.childFile(dillName); final YamlNode nativeAssetContents = loadYamlNode(await nativeAssetsFile.readAsString()); diff --git a/packages/flutter_tools/lib/src/build_system/targets/native_assets.dart b/packages/flutter_tools/lib/src/build_system/targets/native_assets.dart index 12efadc5dbf..af1a80615d8 100644 --- a/packages/flutter_tools/lib/src/build_system/targets/native_assets.dart +++ b/packages/flutter_tools/lib/src/build_system/targets/native_assets.dart @@ -3,12 +3,12 @@ // found in the LICENSE file. import 'package:meta/meta.dart'; -import 'package:native_assets_builder/native_assets_builder.dart'; import 'package:package_config/package_config_types.dart'; import '../../base/common.dart'; import '../../base/file_system.dart'; import '../../build_info.dart'; +import '../../convert.dart'; import '../../dart/package_map.dart'; import '../../isolated/native_assets/native_assets.dart'; import '../build_system.dart'; @@ -16,25 +16,9 @@ import '../depfile.dart'; import '../exceptions.dart'; import 'common.dart'; -/// Builds the right native assets for a Flutter app. -/// -/// The build mode and target architecture can be changed from the -/// native build project (Xcode etc.), so only `flutter assemble` has the -/// information about build-mode and target architecture. -/// Invocations of flutter_tools other than `flutter assemble` are dry runs. -/// -/// This step needs to be consistent with the dry run invocations in `flutter -/// run`s so that the kernel mapping of asset id to dylib lines up after hot -/// restart. -/// -/// [KernelSnapshot] depends on this target. We produce a native_assets.yaml -/// here, and embed that mapping inside the kernel snapshot. -/// -/// The build always produces a valid native_assets.yaml and a native_assets.d -/// even if there are no native assets. This way the caching logic won't try to -/// rebuild. -class NativeAssets extends Target { - const NativeAssets({ +/// Runs the dart build of the app. +abstract class DartBuild extends Target { + const DartBuild({ @visibleForTesting FlutterNativeAssetsBuildRunner? buildRunner, }) : _buildRunner = buildRunner; @@ -42,26 +26,20 @@ class NativeAssets extends Target { @override Future build(Environment environment) async { - final String? nativeAssetsEnvironment = environment.defines[kNativeAssets]; final FileSystem fileSystem = environment.fileSystem; - final Uri nativeAssetsFileUri = environment.buildDir.childFile('native_assets.yaml').uri; + final String? nativeAssetsEnvironment = environment.defines[kNativeAssets]; final DartBuildResult result; if (nativeAssetsEnvironment == 'false') { result = const DartBuildResult.empty(); - await writeNativeAssetsYaml(KernelAssets(), nativeAssetsFileUri, fileSystem); } else { - final String? targetPlatformEnvironment = environment.defines[kTargetPlatform]; - if (targetPlatformEnvironment == null) { - throw MissingDefineException(kTargetPlatform, name); - } - final TargetPlatform targetPlatform = getTargetPlatformForName(targetPlatformEnvironment); - final Uri projectUri = environment.projectDir.uri; + final TargetPlatform targetPlatform = _getTargetPlatformFromEnvironment(environment, name); final PackageConfig packageConfig = await loadPackageConfigWithLogging( fileSystem.file(environment.packageConfigPath), logger: environment.logger, ); + final Uri projectUri = environment.projectDir.uri; final FlutterNativeAssetsBuildRunner buildRunner = _buildRunner ?? FlutterNativeAssetsBuildRunnerImpl( projectUri, @@ -70,48 +48,41 @@ class NativeAssets extends Target { fileSystem, environment.logger, ); - - (result, _) = await runFlutterSpecificDartBuild( + result = await runFlutterSpecificDartBuild( environmentDefines: environment.defines, buildRunner: buildRunner, targetPlatform: targetPlatform, projectUri: projectUri, - nativeAssetsYamlUri : nativeAssetsFileUri, fileSystem: fileSystem, ); } + final File dartBuildResultJsonFile = environment.buildDir.childFile(dartBuildResultFilename); + if (!dartBuildResultJsonFile.parent.existsSync()) { + dartBuildResultJsonFile.parent.createSync(recursive: true); + } + dartBuildResultJsonFile.writeAsStringSync(json.encode(result.toJson())); + final Depfile depfile = Depfile( [ for (final Uri dependency in result.dependencies) fileSystem.file(dependency), ], [ - fileSystem.file(nativeAssetsFileUri), + fileSystem.file(dartBuildResultJsonFile), ], ); - final File outputDepfile = environment.buildDir.childFile('native_assets.d'); + final File outputDepfile = environment.buildDir.childFile(depFilename); if (!outputDepfile.parent.existsSync()) { outputDepfile.parent.createSync(recursive: true); } environment.depFileService.writeToFile(depfile, outputDepfile); - if (!await fileSystem.file(nativeAssetsFileUri).exists()) { - throwToolExit("${nativeAssetsFileUri.path} doesn't exist."); - } if (!await outputDepfile.exists()) { throwToolExit("${outputDepfile.path} doesn't exist."); } } @override - List get depfiles => [ - 'native_assets.d', - ]; - - @override - List get dependencies => const [ - // In AOT, depends on tree-shaking information (resources.json) from compiling dart. - KernelSnapshotProgram(), - ]; + List get depfiles => const [depFilename]; @override List get inputs => const [ @@ -122,10 +93,109 @@ class NativeAssets extends Target { ]; @override - String get name => 'native_assets'; + String get name => 'dart_build'; @override List get outputs => const [ - Source.pattern('{BUILD_DIR}/native_assets.yaml'), + Source.pattern('{BUILD_DIR}/$dartBuildResultFilename'), + ]; + + /// Dependent build [Target]s can use this to consume the result of the + /// [DartBuild] target. + static Future loadBuildResult(Environment environment) async { + final File dartBuildResultJsonFile = environment.buildDir.childFile(DartBuild.dartBuildResultFilename); + return DartBuildResult.fromJson(json.decode(dartBuildResultJsonFile.readAsStringSync()) as Map); + } + + static const String dartBuildResultFilename = 'dart_build_result.json'; + static const String depFilename = 'dart_build.d'; +} + +class DartBuildForNative extends DartBuild { + const DartBuildForNative({@visibleForTesting super.buildRunner}); + + @override + List get dependencies => const [ + KernelSnapshotProgram(), ]; } + +/// Installs the code assets from a [DartBuild] Flutter app. +/// +/// The build mode and target architecture can be changed from the +/// native build project (Xcode etc.), so only `flutter assemble` has the +/// information about build-mode and target architecture. +/// Invocations of flutter_tools other than `flutter assemble` are dry runs. +/// +/// This step needs to be consistent with the dry run invocations in `flutter +/// run`s so that the kernel mapping of asset id to dylib lines up after hot +/// restart. +class InstallCodeAssets extends Target { + const InstallCodeAssets(); + + @override + Future build(Environment environment) async { + final Uri projectUri = environment.projectDir.uri; + final FileSystem fileSystem = environment.fileSystem; + final TargetPlatform targetPlatform = _getTargetPlatformFromEnvironment(environment, name); + + // We fetch the result from the [DartBuild]. + final DartBuildResult dartBuildResult = await DartBuild.loadBuildResult(environment); + + // And install/copy the code assets to the right place and create a + // native_asset.yaml that can be used by the final AOT compilation. + final Uri nativeAssetsFileUri = environment.buildDir.childFile(nativeAssetsFilename).uri; + await installCodeAssets(dartBuildResult: dartBuildResult, environmentDefines: environment.defines, + targetPlatform: targetPlatform, projectUri: projectUri, fileSystem: fileSystem, + nativeAssetsFileUri: nativeAssetsFileUri); + assert(await fileSystem.file(nativeAssetsFileUri).exists()); + + final Depfile depfile = Depfile( + [ + for (final Uri file in dartBuildResult.filesToBeBundled) fileSystem.file(file), + ], + [ + fileSystem.file(nativeAssetsFileUri), + ], + ); + final File outputDepfile = environment.buildDir.childFile(depFilename); + environment.depFileService.writeToFile(depfile, outputDepfile); + if (!await outputDepfile.exists()) { + throwToolExit("${outputDepfile.path} doesn't exist."); + } + } + + @override + List get depfiles => [depFilename]; + + @override + List get dependencies => const [ + DartBuildForNative(), + ]; + + @override + List get inputs => const [ + Source.pattern('{FLUTTER_ROOT}/packages/flutter_tools/lib/src/build_system/targets/native_assets.dart'), + // If different packages are resolved, different native assets might need to be built. + Source.pattern('{WORKSPACE_DIR}/.dart_tool/package_config_subset'), + ]; + + @override + String get name => 'install_code_assets'; + + @override + List get outputs => const [ + Source.pattern('{BUILD_DIR}/$nativeAssetsFilename'), + ]; + + static const String nativeAssetsFilename = 'native_assets.yaml'; + static const String depFilename = 'install_code_assets.d'; +} + +TargetPlatform _getTargetPlatformFromEnvironment(Environment environment, String name) { + final String? targetPlatformEnvironment = environment.defines[kTargetPlatform]; + if (targetPlatformEnvironment == null) { + throw MissingDefineException(kTargetPlatform, name); + } + return getTargetPlatformForName(targetPlatformEnvironment); +} diff --git a/packages/flutter_tools/lib/src/isolated/native_assets/native_assets.dart b/packages/flutter_tools/lib/src/isolated/native_assets/native_assets.dart index f50fb43389d..5c989071564 100644 --- a/packages/flutter_tools/lib/src/isolated/native_assets/native_assets.dart +++ b/packages/flutter_tools/lib/src/isolated/native_assets/native_assets.dart @@ -35,40 +35,57 @@ import 'windows/native_assets.dart'; /// again. final class DartBuildResult { const DartBuildResult(this.codeAssets, this.dependencies); + const DartBuildResult.empty() : codeAssets = const [], dependencies = const []; + factory DartBuildResult.fromJson(Map json) { + final List dependencies = [ + for (final Object? encodedUri in json['dependencies']! as List) + Uri.parse(encodedUri! as String), + ]; + final List codeAssets = [ + for (final Object? json in json['code_assets']! as List) + CodeAsset.fromEncoded(EncodedAsset.fromJson(json! as Map)), + ]; + return DartBuildResult(codeAssets, dependencies); + } + final List codeAssets; final List dependencies; + + Map toJson() => { + 'dependencies': [ + for (final Uri dep in dependencies) dep.toString(), + ], + 'code_assets': [ + for (final CodeAsset code in codeAssets) code.encode().toJson(), + ], + }; + + /// The files that eventually should be bundled with the app. + List get filesToBeBundled => [ + for (final CodeAsset code in codeAssets) + if (code.linkMode is DynamicLoadingBundled) code.file!, + ]; } /// Invokes the build of all transitive Dart packages and prepares code assets /// to be included in the native build. -Future<(DartBuildResult, Uri)> runFlutterSpecificDartBuild({ +Future runFlutterSpecificDartBuild({ required Map environmentDefines, required FlutterNativeAssetsBuildRunner buildRunner, required build_info.TargetPlatform targetPlatform, required Uri projectUri, - Uri? nativeAssetsYamlUri, required FileSystem fileSystem, }) async { - final OS targetOS = _getNativeOSFromTargetPlatfrorm(targetPlatform); + final OS targetOS = getNativeOSFromTargetPlatfrorm(targetPlatform); final Uri buildUri = nativeAssetsBuildUri(projectUri, targetOS); final Directory buildDir = fileSystem.directory(buildUri); final bool flutterTester = targetPlatform == build_info.TargetPlatform.tester; - if (nativeAssetsYamlUri == null) { - // Only `flutter test` uses the - // `build/native_assets//native_assets.yaml` file which uses absolute - // paths to the shared libraries. - // - // testCompilerBuildNativeAssets() passes `null` - assert(flutterTester); - nativeAssetsYamlUri ??= buildUri.resolve('native_assets.yaml'); - } - if (!await buildDir.exists()) { // Ensure the folder exists so the native build system can copy it even // if there's no native assets. @@ -76,22 +93,10 @@ Future<(DartBuildResult, Uri)> runFlutterSpecificDartBuild({ } if (!await _nativeBuildRequired(buildRunner)) { - await writeNativeAssetsYaml( - KernelAssets(), nativeAssetsYamlUri, fileSystem); - return (const DartBuildResult.empty(), nativeAssetsYamlUri); + return const DartBuildResult.empty(); } - final build_info.BuildMode buildMode; - if (flutterTester) { - buildMode = build_info.BuildMode.debug; - } else { - final String? environmentBuildMode = - environmentDefines[build_info.kBuildMode]; - if (environmentBuildMode == null) { - throw MissingDefineException(build_info.kBuildMode, 'native_assets'); - } - buildMode = build_info.BuildMode.fromCliName(environmentBuildMode); - } + final build_info.BuildMode buildMode = _getBuildMode(targetPlatform, environmentDefines, flutterTester); final List targets = flutterTester ? [Target.current] : _targetsForOS(targetPlatform, targetOS, environmentDefines); @@ -105,19 +110,27 @@ Future<(DartBuildResult, Uri)> runFlutterSpecificDartBuild({ buildMode: _nativeAssetsBuildMode(buildMode), fileSystem: fileSystem, targetOS: targetOS); + return result; +} - final String? codesignIdentity = - environmentDefines[build_info.kCodesignIdentity]; +Future installCodeAssets({ + required DartBuildResult dartBuildResult, + required Map environmentDefines, + required build_info.TargetPlatform targetPlatform, + required Uri projectUri, + required FileSystem fileSystem, + required Uri nativeAssetsFileUri, +}) async { + final OS targetOS = getNativeOSFromTargetPlatfrorm(targetPlatform); + final Uri buildUri = nativeAssetsBuildUri(projectUri, targetOS); + final bool flutterTester = targetPlatform == build_info.TargetPlatform.tester; + final build_info.BuildMode buildMode = _getBuildMode(targetPlatform, environmentDefines, flutterTester); - final Map assetTargetLocations = - _assetTargetLocationsForOS( - targetOS, result.codeAssets, flutterTester, buildUri); - await _copyNativeCodeAssetsForOS(targetOS, buildUri, buildMode, fileSystem, - assetTargetLocations, codesignIdentity, flutterTester); - final KernelAssets vmAssetMapping = - KernelAssets(assetTargetLocations.values.toList()); - await writeNativeAssetsYaml(vmAssetMapping, nativeAssetsYamlUri, fileSystem); - return (result, nativeAssetsYamlUri); + final String? codesignIdentity = environmentDefines[build_info.kCodesignIdentity]; + final Map assetTargetLocations = assetTargetLocationsForOS(targetOS, dartBuildResult.codeAssets, flutterTester, buildUri); + await _copyNativeCodeAssetsForOS(targetOS, buildUri, buildMode, fileSystem, assetTargetLocations, codesignIdentity, flutterTester); + final KernelAssets kernelAssets = KernelAssets(assetTargetLocations.values.toList()); + await _writeNativeAssetsYaml(kernelAssets, nativeAssetsFileUri, fileSystem); } Future runFlutterSpecificDartDryRunOnPlatforms({ @@ -142,7 +155,7 @@ Future runFlutterSpecificDartDryRunOnPlatforms({ final bool flutterTester = targetPlatform == build_info.TargetPlatform.tester; - final OS targetOS = _getNativeOSFromTargetPlatfrorm(targetPlatform); + final OS targetOS = getNativeOSFromTargetPlatfrorm(targetPlatform); if (targetOS != OS.macOS && targetOS != OS.windows && targetOS != OS.linux && @@ -162,16 +175,16 @@ Future runFlutterSpecificDartDryRunOnPlatforms({ projectUri: projectUri, fileSystem: fileSystem, targetOS: targetOS); - assetTargetLocations.addAll(_assetTargetLocationsForOS( + assetTargetLocations.addAll(assetTargetLocationsForOS( targetOS, result.codeAssets, flutterTester, buildUri)); } final Uri buildUri = targetPlatforms.length == 1 ? nativeAssetsBuildUri( - projectUri, _getNativeOSFromTargetPlatfrorm(targetPlatforms.single)) + projectUri, getNativeOSFromTargetPlatfrorm(targetPlatforms.single)) : _buildUriMultiple(projectUri); final Uri nativeAssetsYamlUri = buildUri.resolve('native_assets.yaml'); - await writeNativeAssetsYaml( + await _writeNativeAssetsYaml( KernelAssets(assetTargetLocations.values.toList()), nativeAssetsYamlUri, fileSystem, @@ -405,7 +418,7 @@ class FlutterNativeAssetsBuildRunnerImpl implements FlutterNativeAssetsBuildRunn }(); } -Future writeNativeAssetsYaml( +Future _writeNativeAssetsYaml( KernelAssets assets, Uri nativeAssetsYamlUri, FileSystem fileSystem, @@ -602,7 +615,7 @@ KernelAsset _targetLocationSingleArchitecture( ); } -Map _assetTargetLocationsForOS( +Map assetTargetLocationsForOS( OS targetOS, List codeAssets, bool flutterTester, Uri buildUri) { switch (targetOS) { case OS.windows: @@ -957,7 +970,7 @@ Never _throwNativeAssetsLinkFailed() { ); } -OS _getNativeOSFromTargetPlatfrorm(build_info.TargetPlatform platform) { +OS getNativeOSFromTargetPlatfrorm(build_info.TargetPlatform platform) { switch (platform) { case build_info.TargetPlatform.ios: return OS.iOS; @@ -1083,3 +1096,14 @@ const Map> _osTargets = >{ Architecture.x64, }, }; + +build_info.BuildMode _getBuildMode(build_info.TargetPlatform targetPlatform, Map environmentDefines, bool isFlutterTester) { + if (isFlutterTester) { + return build_info.BuildMode.debug; + } + final String? environmentBuildMode = environmentDefines[build_info.kBuildMode]; + if (environmentBuildMode == null) { + throw MissingDefineException(build_info.kBuildMode, 'native_assets'); + } + return build_info.BuildMode.fromCliName(environmentBuildMode); +} diff --git a/packages/flutter_tools/lib/src/isolated/native_assets/test/native_assets.dart b/packages/flutter_tools/lib/src/isolated/native_assets/test/native_assets.dart index 423c297670b..679053f0d8c 100644 --- a/packages/flutter_tools/lib/src/isolated/native_assets/test/native_assets.dart +++ b/packages/flutter_tools/lib/src/isolated/native_assets/test/native_assets.dart @@ -50,13 +50,31 @@ Future testCompilerBuildNativeAssets(BuildInfo buildInfo) async { ); return null; } - final (_, Uri nativeAssetsYaml) = await runFlutterSpecificDartBuild( - environmentDefines: { - kBuildMode: buildInfo.mode.cliName, - }, + + // Only `flutter test` uses the + // `build/native_assets//native_assets.yaml` file which uses absolute + // paths to the shared libraries. + final OS targetOS = getNativeOSFromTargetPlatfrorm(TargetPlatform.tester); + final Uri buildUri = nativeAssetsBuildUri(projectUri, targetOS); + final Uri nativeAssetsFileUri = buildUri.resolve('native_assets.yaml'); + + final Map environmentDefines = { + kBuildMode: buildInfo.mode.cliName, + }; + + // First perform the dart build. + final DartBuildResult dartBuildResult = await runFlutterSpecificDartBuild( + environmentDefines: environmentDefines, buildRunner: buildRunner, targetPlatform: TargetPlatform.tester, projectUri: projectUri, fileSystem: globals.fs); - return nativeAssetsYaml; + + // Then "install" the code assets so they can be used at runtime. + await installCodeAssets(dartBuildResult: dartBuildResult, environmentDefines: environmentDefines, + targetPlatform: TargetPlatform.tester, projectUri: projectUri, fileSystem: globals.fs, + nativeAssetsFileUri: nativeAssetsFileUri); + assert(await globals.fs.file(nativeAssetsFileUri).exists()); + + return nativeAssetsFileUri; } diff --git a/packages/flutter_tools/test/general.shard/build_system/targets/common_test.dart b/packages/flutter_tools/test/general.shard/build_system/targets/common_test.dart index 37f2513c478..40032cc3337 100644 --- a/packages/flutter_tools/test/general.shard/build_system/targets/common_test.dart +++ b/packages/flutter_tools/test/general.shard/build_system/targets/common_test.dart @@ -12,6 +12,7 @@ import 'package:flutter_tools/src/build_system/build_system.dart'; import 'package:flutter_tools/src/build_system/exceptions.dart'; import 'package:flutter_tools/src/build_system/targets/common.dart'; import 'package:flutter_tools/src/build_system/targets/ios.dart'; +import 'package:flutter_tools/src/build_system/targets/native_assets.dart'; import 'package:flutter_tools/src/compile.dart'; import '../../../src/common.dart'; @@ -437,7 +438,7 @@ native-assets: fileSystem.file('.dart_tool/package_config.json') ..createSync(recursive: true) ..writeAsStringSync('{"configVersion": 2, "packages":[]}'); - androidEnvironment.buildDir.childFile('native_assets.yaml') + androidEnvironment.buildDir.childFile(InstallCodeAssets.nativeAssetsFilename) ..createSync(recursive: true) ..writeAsStringSync(empty ? emptyNativeAssets : nonEmptyNativeAssets); final String build = androidEnvironment.buildDir.path; @@ -463,7 +464,7 @@ native-assets: '--output-dill', '$build/native_assets.dill', '--native-assets', - '$build/native_assets.yaml', + '$build/${InstallCodeAssets.nativeAssetsFilename}', '--verbosity=error', '--native-assets-only', ], stdout: 'result $kBoundaryKey\n$kBoundaryKey\n$kBoundaryKey $build/app.dill 0\n'), diff --git a/packages/flutter_tools/test/general.shard/isolated/android/native_assets_test.dart b/packages/flutter_tools/test/general.shard/isolated/android/native_assets_test.dart index d6303637f30..34bfa478b8b 100644 --- a/packages/flutter_tools/test/general.shard/isolated/android/native_assets_test.dart +++ b/packages/flutter_tools/test/general.shard/isolated/android/native_assets_test.dart @@ -13,6 +13,7 @@ import 'package:flutter_tools/src/base/logger.dart'; import 'package:flutter_tools/src/base/platform.dart'; import 'package:flutter_tools/src/build_info.dart'; import 'package:flutter_tools/src/build_system/build_system.dart'; +import 'package:flutter_tools/src/build_system/targets/native_assets.dart'; import 'package:flutter_tools/src/features.dart'; import 'package:flutter_tools/src/globals.dart' as globals; import 'package:flutter_tools/src/isolated/native_assets/native_assets.dart'; @@ -59,9 +60,8 @@ void main() { FeatureFlags: () => TestFeatureFlags(isNativeAssetsEnabled: true), ProcessManager: () => FakeProcessManager.empty(), }, () async { - final File packageConfig = - environment.projectDir.childFile('.dart_tool/package_config.json'); - final Uri nonFlutterTesterAssetUri = environment.buildDir.childFile('native_assets.yaml').uri; + final File packageConfig = environment.projectDir.childFile('.dart_tool/package_config.json'); + final Uri nonFlutterTesterAssetUri = environment.buildDir.childFile(InstallCodeAssets.nativeAssetsFilename).uri; await packageConfig.parent.create(); await packageConfig.create(); final File dylibAfterCompiling = fileSystem.file('libbar.so'); @@ -89,17 +89,25 @@ void main() { codeAssets: codeAssets, ), ); - await runFlutterSpecificDartBuild( - environmentDefines: { - kBuildMode: buildMode.cliName, - kMinSdkVersion: minSdkVersion, - }, + final Map environmentDefines = { + kBuildMode: buildMode.cliName, + kMinSdkVersion: minSdkVersion, + }; + final DartBuildResult result = await runFlutterSpecificDartBuild( + environmentDefines: environmentDefines, targetPlatform: TargetPlatform.android_arm64, projectUri: projectUri, - nativeAssetsYamlUri: nonFlutterTesterAssetUri, fileSystem: fileSystem, buildRunner: buildRunner, ); + await installCodeAssets( + dartBuildResult: result, + environmentDefines: environmentDefines, + targetPlatform: TargetPlatform.android_arm64, + projectUri: projectUri, + fileSystem: fileSystem, + nativeAssetsFileUri: nonFlutterTesterAssetUri, + ); expect( (globals.logger as BufferLogger).traceText, stringContainsInOrder([ @@ -108,10 +116,7 @@ void main() { ]), ); - expect( - environment.buildDir.childFile('native_assets.yaml'), - exists, - ); + expect(environment.buildDir.childFile('native_assets.yaml'), exists); expect(buildRunner.buildInvocations, 1); expect( buildRunner.linkInvocations, @@ -130,7 +135,6 @@ void main() { }, () async { final File packageConfig = environment.projectDir.childFile('.dart_tool/package_config.json'); - final Uri nonFlutterTesterAssetUri = environment.buildDir.childFile('native_assets.yaml').uri; await packageConfig.create(recursive: true); await runFlutterSpecificDartBuild( environmentDefines: { @@ -138,7 +142,6 @@ void main() { kMinSdkVersion: minSdkVersion, }, targetPlatform: TargetPlatform.android_x64, - nativeAssetsYamlUri: nonFlutterTesterAssetUri, projectUri: projectUri, fileSystem: fileSystem, buildRunner: _BuildRunnerWithoutNdk(), @@ -155,7 +158,6 @@ void main() { }, () async { final File packageConfig = environment.projectDir.childFile('.dart_tool/package_config.json'); - final Uri nonFlutterTesterAssetUri = environment.buildDir.childFile('native_assets.yaml').uri; await packageConfig.parent.create(); await packageConfig.create(); expect( @@ -166,7 +168,6 @@ void main() { }, targetPlatform: TargetPlatform.android_arm64, projectUri: projectUri, - nativeAssetsYamlUri: nonFlutterTesterAssetUri, fileSystem: fileSystem, buildRunner: _BuildRunnerWithoutNdk( packagesWithNativeAssetsResult: [ diff --git a/packages/flutter_tools/test/general.shard/isolated/build_system/targets/native_assets_test.dart b/packages/flutter_tools/test/general.shard/isolated/build_system/targets/native_assets_test.dart index ad1decb6eaf..39be84f77f4 100644 --- a/packages/flutter_tools/test/general.shard/isolated/build_system/targets/native_assets_test.dart +++ b/packages/flutter_tools/test/general.shard/isolated/build_system/targets/native_assets_test.dart @@ -68,7 +68,7 @@ void main() { testWithoutContext('NativeAssets throws error if missing target platform', () async { iosEnvironment.defines.remove(kTargetPlatform); - expect(const NativeAssets().build(iosEnvironment), throwsA(isA())); + expect(const DartBuildForNative().build(iosEnvironment), throwsA(isA())); }); testUsingContext('NativeAssets defaults to ios archs if missing', () async { @@ -77,14 +77,12 @@ void main() { iosEnvironment.defines.remove(kIosArchs); final FlutterNativeAssetsBuildRunner buildRunner = FakeFlutterNativeAssetsBuildRunner(); - await NativeAssets(buildRunner: buildRunner).build(iosEnvironment); + await DartBuildForNative(buildRunner: buildRunner).build(iosEnvironment); + await const InstallCodeAssets().build(iosEnvironment); - final File nativeAssetsYaml = - iosEnvironment.buildDir.childFile('native_assets.yaml'); - - final File depsFile = iosEnvironment.buildDir.childFile('native_assets.d'); - expect(depsFile, exists); - expect(nativeAssetsYaml, exists); + expect(iosEnvironment.buildDir.childFile(DartBuild.depFilename), exists); + expect(iosEnvironment.buildDir.childFile(InstallCodeAssets.depFilename), exists); + expect(iosEnvironment.buildDir.childFile(InstallCodeAssets.nativeAssetsFilename), exists); }); testUsingContext('NativeAssets throws error if missing sdk root', overrides: { @@ -98,7 +96,7 @@ void main() { ]); iosEnvironment.defines.remove(kSdkRoot); - expect(NativeAssets(buildRunner: buildRunner).build(iosEnvironment), throwsA(isA())); + expect(DartBuildForNative(buildRunner: buildRunner).build(iosEnvironment), throwsA(isA())); }); // The NativeAssets Target should _always_ be creating a yaml an d file. @@ -118,10 +116,12 @@ void main() { await createPackageConfig(iosEnvironment); final FlutterNativeAssetsBuildRunner buildRunner = FakeFlutterNativeAssetsBuildRunner(); - await NativeAssets(buildRunner: buildRunner).build(iosEnvironment); + await DartBuildForNative(buildRunner: buildRunner).build(iosEnvironment); + await const InstallCodeAssets().build(iosEnvironment); - expect(iosEnvironment.buildDir.childFile('native_assets.d'), exists); - expect(iosEnvironment.buildDir.childFile('native_assets.yaml'), exists); + expect(iosEnvironment.buildDir.childFile(DartBuild.depFilename), exists); + expect(iosEnvironment.buildDir.childFile(InstallCodeAssets.depFilename), exists); + expect(iosEnvironment.buildDir.childFile(InstallCodeAssets.nativeAssetsFilename), exists); }, ); } @@ -212,20 +212,34 @@ void main() { codeAssets: codeAssets, ), ); - await NativeAssets(buildRunner: buildRunner).build(iosEnvironment); + await DartBuildForNative(buildRunner: buildRunner).build(iosEnvironment); + await const InstallCodeAssets().build(iosEnvironment); - final File nativeAssetsYaml = iosEnvironment.buildDir.childFile('native_assets.yaml'); - final File depsFile = iosEnvironment.buildDir.childFile('native_assets.d'); - expect(depsFile, exists); - // We don't care about the specific format, but it should contain the - // yaml as the file depending on the source files that went in to the - // build. + // We don't care about the specific format, but + // * dart build output should depend on C source + // * installation output should depend on shared library from dart build + + final File dartBuildResult = iosEnvironment.buildDir.childFile(DartBuild.dartBuildResultFilename); + final File buildDepsFile = iosEnvironment.buildDir.childFile(DartBuild.depFilename); + expect(buildDepsFile, exists); expect( - depsFile.readAsStringSync(), + buildDepsFile.readAsStringSync(), + stringContainsInOrder([ + dartBuildResult.path, + ':', + 'src/foo.c', + ]), + ); + + final File nativeAssetsYaml = iosEnvironment.buildDir.childFile(InstallCodeAssets.nativeAssetsFilename); + final File installDepsFile = iosEnvironment.buildDir.childFile(InstallCodeAssets.depFilename); + expect(installDepsFile, exists); + expect( + installDepsFile.readAsStringSync(), stringContainsInOrder([ nativeAssetsYaml.path, ':', - 'src/foo.c', + 'foo.framework/foo', ]), ); expect(nativeAssetsYaml, exists); @@ -281,7 +295,7 @@ void main() { codeAssets: codeAssets, ), ); - await NativeAssets(buildRunner: buildRunner).build(androidEnvironment); + await DartBuildForNative(buildRunner: buildRunner).build(androidEnvironment); expect( buildRunner.lastBuildMode, native_assets_cli.BuildMode.release, diff --git a/packages/flutter_tools/test/general.shard/isolated/ios/native_assets_test.dart b/packages/flutter_tools/test/general.shard/isolated/ios/native_assets_test.dart index 705210cdbe9..141703026e2 100644 --- a/packages/flutter_tools/test/general.shard/isolated/ios/native_assets_test.dart +++ b/packages/flutter_tools/test/general.shard/isolated/ios/native_assets_test.dart @@ -11,6 +11,7 @@ import 'package:flutter_tools/src/base/logger.dart'; import 'package:flutter_tools/src/base/platform.dart'; import 'package:flutter_tools/src/build_info.dart'; import 'package:flutter_tools/src/build_system/build_system.dart'; +import 'package:flutter_tools/src/build_system/targets/native_assets.dart'; import 'package:flutter_tools/src/features.dart'; import 'package:flutter_tools/src/globals.dart' as globals; import 'package:flutter_tools/src/isolated/native_assets/native_assets.dart'; @@ -159,7 +160,7 @@ void main() { } final File packageConfig = environment.projectDir.childFile('.dart_tool/package_config.json'); - final Uri nonFlutterTesterAssetUri = environment.buildDir.childFile('native_assets.yaml').uri; + final Uri nonFlutterTesterAssetUri = environment.buildDir.childFile(InstallCodeAssets.nativeAssetsFilename).uri; await packageConfig.parent.create(); await packageConfig.create(); @@ -192,18 +193,26 @@ void main() { ? null : FakeFlutterNativeAssetsBuilderResult.fromAssets(codeAssets: codeAssets(config.targetOS, config.codeConfig)), ); - await runFlutterSpecificDartBuild( - environmentDefines: { - kBuildMode: buildMode.cliName, - kSdkRoot: '.../iPhone Simulator', - kIosArchs: 'arm64 x86_64', - }, + final Map environmentDefines = { + kBuildMode: buildMode.cliName, + kSdkRoot: '.../iPhone Simulator', + kIosArchs: 'arm64 x86_64', + }; + final DartBuildResult dartBuildResult = await runFlutterSpecificDartBuild( + environmentDefines: environmentDefines, targetPlatform: TargetPlatform.ios, projectUri: projectUri, - nativeAssetsYamlUri: nonFlutterTesterAssetUri, fileSystem: fileSystem, buildRunner: buildRunner, ); + await installCodeAssets( + dartBuildResult: dartBuildResult, + environmentDefines: environmentDefines, + targetPlatform: TargetPlatform.ios, + projectUri: projectUri, + fileSystem: fileSystem, + nativeAssetsFileUri: nonFlutterTesterAssetUri, + ); expect( (globals.logger as BufferLogger).traceText, stringContainsInOrder([ @@ -211,10 +220,7 @@ void main() { 'Building native assets for [ios_arm64, ios_x64] $buildMode done.', ]), ); - expect( - environment.buildDir.childFile('native_assets.yaml'), - exists, - ); + expect(environment.buildDir.childFile(InstallCodeAssets.nativeAssetsFilename), exists); // Two archs. expect(buildRunner.buildInvocations, 2); expect( diff --git a/packages/flutter_tools/test/general.shard/isolated/linux/native_assets_test.dart b/packages/flutter_tools/test/general.shard/isolated/linux/native_assets_test.dart index 74bf755fc49..1b76981a228 100644 --- a/packages/flutter_tools/test/general.shard/isolated/linux/native_assets_test.dart +++ b/packages/flutter_tools/test/general.shard/isolated/linux/native_assets_test.dart @@ -53,7 +53,6 @@ void main() { ProcessManager: () => FakeProcessManager.empty(), }, () async { final File packageConfig = environment.projectDir.childFile('.dart_tool/package_config.json'); - final Uri nonFlutterTesterAssetUri = environment.buildDir.childFile('native_assets.yaml').uri; await packageConfig.create(recursive: true); await runFlutterSpecificDartBuild( @@ -62,7 +61,6 @@ void main() { }, targetPlatform: TargetPlatform.linux_x64, projectUri: projectUri, - nativeAssetsYamlUri: nonFlutterTesterAssetUri, fileSystem: fileSystem, buildRunner: _BuildRunnerWithoutClang(), ); diff --git a/packages/flutter_tools/test/general.shard/isolated/macos/native_assets_test.dart b/packages/flutter_tools/test/general.shard/isolated/macos/native_assets_test.dart index 524cb733ecc..c674cca87e2 100644 --- a/packages/flutter_tools/test/general.shard/isolated/macos/native_assets_test.dart +++ b/packages/flutter_tools/test/general.shard/isolated/macos/native_assets_test.dart @@ -10,6 +10,7 @@ import 'package:flutter_tools/src/base/logger.dart'; import 'package:flutter_tools/src/base/platform.dart'; import 'package:flutter_tools/src/build_info.dart'; import 'package:flutter_tools/src/build_system/build_system.dart'; +import 'package:flutter_tools/src/build_system/targets/native_assets.dart'; import 'package:flutter_tools/src/dart/package_map.dart'; import 'package:flutter_tools/src/features.dart'; import 'package:flutter_tools/src/globals.dart' as globals; @@ -265,7 +266,7 @@ void main() { return; } final File packageConfig = environment.projectDir.childFile('.dart_tool/package_config.json'); - final Uri nonFlutterTesterAssetUri = environment.buildDir.childFile('native_assets.yaml').uri; + final Uri nonFlutterTesterAssetUri = environment.buildDir.childFile(InstallCodeAssets.nativeAssetsFilename).uri; await packageConfig.parent.create(); await packageConfig.create(); @@ -297,17 +298,30 @@ void main() { ? null : FakeFlutterNativeAssetsBuilderResult.fromAssets(codeAssets: codeAssets(config.targetOS, config.codeConfig)), ); - final (_, Uri nativeAssetsYaml) = await runFlutterSpecificDartBuild( - environmentDefines: { - kBuildMode: buildMode.cliName, - kDarwinArchs: 'arm64 x86_64', - }, - targetPlatform: flutterTester ? TargetPlatform.tester : TargetPlatform.darwin, + final Map environmentDefines = { + kBuildMode: buildMode.cliName, + kDarwinArchs: 'arm64 x86_64', + }; + final TargetPlatform targetPlatform = flutterTester ? TargetPlatform.tester : TargetPlatform.darwin; + final DartBuildResult dartBuildResult = await runFlutterSpecificDartBuild( + environmentDefines: environmentDefines, + targetPlatform: targetPlatform, projectUri: projectUri, - nativeAssetsYamlUri: flutterTester ? null : nonFlutterTesterAssetUri, fileSystem: fileSystem, buildRunner: buildRunner, ); + final Uri nativeAssetsFileUri = flutterTester + ? projectUri.resolve('build/native_assets/macos/${InstallCodeAssets.nativeAssetsFilename}') + : nonFlutterTesterAssetUri; + + await installCodeAssets( + dartBuildResult: dartBuildResult, + environmentDefines: environmentDefines, + targetPlatform: targetPlatform, + projectUri: projectUri, + fileSystem: fileSystem, + nativeAssetsFileUri: nativeAssetsFileUri , + ); final String expectedArchsBeingBuilt = flutterTester ? (isArm64 ? 'macos_arm64' : 'macos_x64') : '[macos_arm64, macos_x64]'; @@ -318,14 +332,9 @@ void main() { 'Building native assets for $expectedArchsBeingBuilt $buildMode done.', ]), ); + final String nativeAssetsFileContent = await fileSystem.file(nativeAssetsFileUri).readAsString(); expect( - nativeAssetsYaml, - flutterTester - ? projectUri.resolve('build/native_assets/macos/native_assets.yaml') - : nonFlutterTesterAssetUri - ); - expect( - await fileSystem.file(nativeAssetsYaml).readAsString(), + nativeAssetsFileContent , stringContainsInOrder([ 'package:bar/bar.dart', if (flutterTester) @@ -337,7 +346,7 @@ void main() { ]), ); expect( - await fileSystem.file(nativeAssetsYaml).readAsString(), + nativeAssetsFileContent, stringContainsInOrder([ 'package:buz/buz.dart', if (flutterTester) diff --git a/packages/flutter_tools/test/general.shard/isolated/native_assets_test.dart b/packages/flutter_tools/test/general.shard/isolated/native_assets_test.dart index dce1d3187f4..64b3957617d 100644 --- a/packages/flutter_tools/test/general.shard/isolated/native_assets_test.dart +++ b/packages/flutter_tools/test/general.shard/isolated/native_assets_test.dart @@ -10,6 +10,7 @@ import 'package:flutter_tools/src/base/file_system.dart'; import 'package:flutter_tools/src/base/logger.dart'; import 'package:flutter_tools/src/build_info.dart'; import 'package:flutter_tools/src/build_system/build_system.dart'; +import 'package:flutter_tools/src/build_system/targets/native_assets.dart'; import 'package:flutter_tools/src/features.dart'; import 'package:flutter_tools/src/globals.dart' as globals; import 'package:flutter_tools/src/isolated/native_assets/native_assets.dart'; @@ -69,14 +70,12 @@ void main() { testUsingContext('build with no package config', overrides: { ProcessManager: () => FakeProcessManager.empty(), }, () async { - final Uri nonFlutterTesterAssetUri = environment.buildDir.childFile('native_assets.yaml').uri; await runFlutterSpecificDartBuild( environmentDefines: { kBuildMode: BuildMode.debug.cliName, }, targetPlatform: TargetPlatform.windows_x64, projectUri: projectUri, - nativeAssetsYamlUri: nonFlutterTesterAssetUri, fileSystem: fileSystem, buildRunner: FakeFlutterNativeAssetsBuildRunner( hasPackageConfigResult: false, @@ -171,7 +170,7 @@ void main() { ); expect( nativeAssetsYaml, - projectUri.resolve('build/native_assets/windows/native_assets.yaml'), + projectUri.resolve('build/native_assets/windows/${InstallCodeAssets.nativeAssetsFilename}'), ); expect( await fileSystem.file(nativeAssetsYaml).readAsString(), @@ -203,19 +202,18 @@ void main() { file: file, ); + final Map environmentDefines = { + kBuildMode: BuildMode.release.cliName, + }; final List codeAssets = [ makeCodeAsset('malloc', LookupInProcess()), makeCodeAsset('free', LookupInExecutable()), makeCodeAsset('draw', DynamicLoadingSystem(Uri.file('/usr/lib/skia.so'))), ]; - - await runFlutterSpecificDartBuild( - environmentDefines: { - kBuildMode: BuildMode.release.cliName, - }, + final DartBuildResult dartBuildResult = await runFlutterSpecificDartBuild( + environmentDefines: environmentDefines, targetPlatform: TargetPlatform.linux_x64, projectUri: projectUri, - nativeAssetsYamlUri: nonFlutterTesterAssetUri, fileSystem: fileSystem, buildRunner: FakeFlutterNativeAssetsBuildRunner( packagesWithNativeAssetsResult: [ @@ -225,6 +223,14 @@ void main() { linkResult: FakeFlutterNativeAssetsBuilderResult.fromAssets(codeAssets: codeAssets), ), ); + await installCodeAssets( + dartBuildResult: dartBuildResult, + environmentDefines: environmentDefines, + targetPlatform: TargetPlatform.windows_x64, + projectUri: projectUri, + fileSystem: fileSystem, + nativeAssetsFileUri: nonFlutterTesterAssetUri, + ); expect(testLogger.traceText, isNot(contains('Copying native assets to'))); }); @@ -232,7 +238,6 @@ void main() { ProcessManager: () => FakeProcessManager.empty(), }, () async { final File packageConfig = environment.projectDir.childFile('.dart_tool/package_config.json'); - final Uri nonFlutterTesterAssetUri = environment.buildDir.childFile('native_assets.yaml').uri; await packageConfig.parent.create(); await packageConfig.create(); expect( @@ -242,7 +247,6 @@ void main() { }, targetPlatform: TargetPlatform.windows_x64, projectUri: projectUri, - nativeAssetsYamlUri: nonFlutterTesterAssetUri, fileSystem: fileSystem, buildRunner: FakeFlutterNativeAssetsBuildRunner( packagesWithNativeAssetsResult: [ @@ -262,16 +266,17 @@ void main() { ProcessManager: () => FakeProcessManager.empty(), }, () async { final File packageConfig = environment.projectDir.childFile('.dart_tool/package_config.json'); - final Uri nonFlutterTesterAssetUri = environment.buildDir.childFile('native_assets.yaml').uri; + final Uri nonFlutterTesterAssetUri = environment.buildDir.childFile(InstallCodeAssets.nativeAssetsFilename).uri; await packageConfig.parent.create(); await packageConfig.create(); - final (_, Uri nativeAssetsYaml) = await runFlutterSpecificDartBuild( - environmentDefines: { - kBuildMode: BuildMode.debug.cliName, - }, + + final Map environmentDefines = { + kBuildMode: BuildMode.debug.cliName, + }; + final DartBuildResult dartBuildResult = await runFlutterSpecificDartBuild( + environmentDefines: environmentDefines, targetPlatform: TargetPlatform.windows_x64, projectUri: projectUri, - nativeAssetsYamlUri: nonFlutterTesterAssetUri, fileSystem: fileSystem, buildRunner: FakeFlutterNativeAssetsBuildRunner( packagesWithNativeAssetsResult: [ @@ -279,9 +284,16 @@ void main() { ], ), ); - expect(nativeAssetsYaml, nonFlutterTesterAssetUri); + await installCodeAssets( + dartBuildResult: dartBuildResult, + environmentDefines: environmentDefines, + targetPlatform: TargetPlatform.windows_x64, + projectUri: projectUri, + fileSystem: fileSystem, + nativeAssetsFileUri: nonFlutterTesterAssetUri, + ); expect( - await fileSystem.file(nativeAssetsYaml).readAsString(), + await fileSystem.file(nonFlutterTesterAssetUri).readAsString(), isNot(contains('package:bar/bar.dart')), ); expect( @@ -323,7 +335,6 @@ void main() { }, () async { final File packageConfig = environment.projectDir.childFile('.dart_tool/package_config.json'); - final Uri nonFlutterTesterAssetUri = environment.buildDir.childFile('native_assets.yaml').uri; await packageConfig.parent.create(); await packageConfig.create(); expect( @@ -333,7 +344,6 @@ void main() { }, targetPlatform: TargetPlatform.linux_x64, projectUri: projectUri, - nativeAssetsYamlUri: nonFlutterTesterAssetUri, fileSystem: fileSystem, buildRunner: FakeFlutterNativeAssetsBuildRunner( packagesWithNativeAssetsResult: [ @@ -355,7 +365,6 @@ void main() { }, () async { final File packageConfig = environment.projectDir.childFile('.dart_tool/package_config.json'); - final Uri nonFlutterTesterAssetUri = environment.buildDir.childFile('native_assets.yaml').uri; await packageConfig.parent.create(); await packageConfig.create(); @@ -376,14 +385,13 @@ void main() { file: file, ); - final (DartBuildResult result, _) = await runFlutterSpecificDartBuild( + final DartBuildResult result = await runFlutterSpecificDartBuild( environmentDefines: { // Release mode means the dart build has linking enabled. kBuildMode: BuildMode.release.cliName, }, targetPlatform: TargetPlatform.linux_x64, projectUri: projectUri, - nativeAssetsYamlUri: nonFlutterTesterAssetUri, fileSystem: fileSystem, buildRunner: FakeFlutterNativeAssetsBuildRunner( packagesWithNativeAssetsResult: [ diff --git a/packages/flutter_tools/test/general.shard/isolated/windows/native_assets_test.dart b/packages/flutter_tools/test/general.shard/isolated/windows/native_assets_test.dart index ad0658a1ee3..c05c308a6a9 100644 --- a/packages/flutter_tools/test/general.shard/isolated/windows/native_assets_test.dart +++ b/packages/flutter_tools/test/general.shard/isolated/windows/native_assets_test.dart @@ -10,6 +10,7 @@ import 'package:flutter_tools/src/base/logger.dart'; import 'package:flutter_tools/src/base/platform.dart'; import 'package:flutter_tools/src/build_info.dart'; import 'package:flutter_tools/src/build_system/build_system.dart'; +import 'package:flutter_tools/src/build_system/targets/native_assets.dart'; import 'package:flutter_tools/src/dart/package_map.dart'; import 'package:flutter_tools/src/features.dart'; import 'package:flutter_tools/src/globals.dart' as globals; @@ -71,7 +72,7 @@ void main() { ProcessManager: () => FakeProcessManager.empty(), }, () async { final File packageConfig = environment.projectDir.childDirectory('.dart_tool').childFile('package_config.json'); - final Uri nonFlutterTesterAssetUri = environment.buildDir.childFile('native_assets.yaml').uri; + final Uri nonFlutterTesterAssetUri = environment.buildDir.childFile(InstallCodeAssets.nativeAssetsFilename).uri; await packageConfig.parent.create(); await packageConfig.create(); final File dylibAfterCompiling = fileSystem.file('bar.dll'); @@ -98,18 +99,33 @@ void main() { : FakeFlutterNativeAssetsBuilderResult.fromAssets(codeAssets: codeAssets, ), ); - final (_, Uri nativeAssetsYaml) = await runFlutterSpecificDartBuild( - environmentDefines: { - kBuildMode: buildMode.cliName, - }, - targetPlatform: flutterTester - ? TargetPlatform.tester - : TargetPlatform.windows_x64, + final Map environmentDefines = { + kBuildMode: buildMode.cliName, + }; + final TargetPlatform targetPlatform = flutterTester + ? TargetPlatform.tester + : TargetPlatform.windows_x64; + final DartBuildResult dartBuildResult = await runFlutterSpecificDartBuild( + environmentDefines: environmentDefines, + targetPlatform: targetPlatform, projectUri: projectUri, - nativeAssetsYamlUri: flutterTester ? null : nonFlutterTesterAssetUri, fileSystem: fileSystem, buildRunner: buildRunner, ); + final String expectedDirectory = flutterTester + ? native_assets_cli.OS.current.toString() + : 'windows'; + final Uri nativeAssetsFileUri = flutterTester + ? projectUri.resolve('build/native_assets/$expectedDirectory/${InstallCodeAssets.nativeAssetsFilename}') + : nonFlutterTesterAssetUri; + await installCodeAssets( + dartBuildResult: dartBuildResult, + environmentDefines: environmentDefines, + targetPlatform: targetPlatform, + projectUri: projectUri, + fileSystem: fileSystem, + nativeAssetsFileUri: nativeAssetsFileUri, + ); final String expectedOS = flutterTester ? native_assets_cli.Target.current.toString() : 'windows_x64'; @@ -120,16 +136,8 @@ void main() { 'Building native assets for $expectedOS $buildMode done.', ]), ); - final String expectedDirectory = flutterTester - ? native_assets_cli.OS.current.toString() - : 'windows'; - expect(nativeAssetsYaml, - flutterTester - ? projectUri.resolve('build/native_assets/$expectedDirectory/native_assets.yaml') - : nonFlutterTesterAssetUri - ); expect( - await fileSystem.file(nativeAssetsYaml).readAsString(), + await fileSystem.file(nativeAssetsFileUri).readAsString(), stringContainsInOrder([ 'package:bar/bar.dart', if (flutterTester)