From 3a83e43ede5700dfe4ea92709fec2c2365cdef4f Mon Sep 17 00:00:00 2001 From: Martin Kustermann Date: Wed, 6 Nov 2024 14:12:34 +0100 Subject: [PATCH] Make flutter_tools use newest package:{native_assets_builder,native_assets_cli,native_toolchain_c} (#158214) Almost all of the code is just adopting to changes to the APIs of `package:native_assets_builder`, `package:native_assets_cli` and `package:native_toolchain_c` There's only two semantic changes * Removes a test that checks for a verification error if a build hook produces a static library if the preferred linking mode is dynamic: => The test is written in a very hacky way. By monkey patching the build config.json that flutter build actually made. This monkey patching relies on package:cli_config which is now no longer used. => The actual code that checks for this mismatch lives in dart-lang/native repository and is tested there. So there's really no need to duplicate that. * The `package:native_assets_builder` no longer knows about code assets. This is something a user of that package (e.g. flutter tools) adds. Now the dry-run functionality will invoke build hooks who produce code assets without an architecture. => The `package:native_assets_builder` used to expand such a code asset to N different code assets (one for each supported architecture) => This logic was now moved to flutter tools. => In the near future we're going to this dry-run complexity, which will then also get rid of this uglyness (of expanding to all archs of an OS). --- .../link_hook/hook/build.dart | 15 +- .../link_hook/hook/link.dart | 8 +- dev/integration_tests/link_hook/pubspec.yaml | 7 +- .../native_assets/android/native_assets.dart | 21 +- .../native_assets/ios/native_assets.dart | 39 +- .../native_assets/linux/native_assets.dart | 6 +- .../native_assets/macos/native_assets.dart | 37 +- .../macos/native_assets_host.dart | 7 +- .../isolated/native_assets/native_assets.dart | 360 +++++++++++------- .../native_assets/windows/native_assets.dart | 6 +- .../lib/src/update_packages_pins.dart | 4 +- packages/flutter_tools/pubspec.yaml | 7 +- .../templates/package_ffi/pubspec.yaml.tmpl | 5 +- .../isolated/android/native_assets_test.dart | 19 +- .../targets/native_assets_test.dart | 36 +- .../fake_native_assets_build_runner.dart | 145 ++++--- .../test/general.shard/isolated/hot_test.dart | 55 +-- .../isolated/ios/native_assets_test.dart | 36 +- .../isolated/linux/native_assets_test.dart | 7 +- .../macos/native_assets_host_test.dart | 2 +- .../isolated/macos/native_assets_test.dart | 40 +- .../isolated/native_assets_test.dart | 25 +- .../isolated/windows/native_assets_test.dart | 21 +- .../isolated/native_assets_test.dart | 60 +-- 24 files changed, 519 insertions(+), 449 deletions(-) diff --git a/dev/integration_tests/link_hook/hook/build.dart b/dev/integration_tests/link_hook/hook/build.dart index 605b123380..1cf7c3de12 100644 --- a/dev/integration_tests/link_hook/hook/build.dart +++ b/dev/integration_tests/link_hook/hook/build.dart @@ -3,12 +3,12 @@ // found in the LICENSE file. import 'package:logging/logging.dart'; -import 'package:native_assets_cli/native_assets_cli.dart'; +import 'package:native_assets_cli/code_assets.dart'; +import 'package:native_assets_cli/code_assets_builder.dart'; import 'package:native_toolchain_c/native_toolchain_c.dart'; - void main(List args) async { - await build(args, (BuildConfig config, BuildOutput output) async { + await build(args, (BuildConfig config, BuildOutputBuilder output) async { final String assetName; if (config.linkingEnabled) { // The link hook will be run. So emit an asset with a name that is @@ -30,7 +30,7 @@ void main(List args) async { ], dartBuildFiles: ['hook/build.dart'], ); - final BuildOutput outputCatcher = BuildOutput(); + final BuildOutputBuilder outputCatcher = BuildOutputBuilder(); await cbuilder.run( config: config, output: outputCatcher, @@ -38,10 +38,11 @@ void main(List args) async { ..level = Level.ALL ..onRecord.listen((LogRecord record) => print(record.message)), ); - output.addDependencies(outputCatcher.dependencies); + final BuildOutput catchedOutput = BuildOutput(outputCatcher.json); + output.addDependencies(catchedOutput.dependencies); // Send the asset to hook/link.dart or immediately for bundling. - output.addAsset( - outputCatcher.assets.single, + output.codeAssets.add( + catchedOutput.codeAssets.single, linkInPackage: config.linkingEnabled ? 'link_hook' : null, ); }); diff --git a/dev/integration_tests/link_hook/hook/link.dart b/dev/integration_tests/link_hook/hook/link.dart index 3c37155587..a4750f4909 100644 --- a/dev/integration_tests/link_hook/hook/link.dart +++ b/dev/integration_tests/link_hook/hook/link.dart @@ -2,13 +2,13 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import 'package:native_assets_cli/native_assets_cli.dart'; +import 'package:native_assets_cli/code_assets.dart'; void main(List args) async { - await link(args, (LinkConfig config, LinkOutput output) async { - final NativeCodeAsset asset = config.assets.single as NativeCodeAsset; + await link(args, (LinkConfig config, LinkOutputBuilder output) async { + final CodeAsset asset = config.codeAssets.single; final String packageName = config.packageName; - output.addAsset(NativeCodeAsset( + output.codeAssets.add(CodeAsset( package: packageName, // Change the asset id to something that is used. name: '${packageName}_bindings_generated.dart', diff --git a/dev/integration_tests/link_hook/pubspec.yaml b/dev/integration_tests/link_hook/pubspec.yaml index f2ab76bb30..99048199ba 100644 --- a/dev/integration_tests/link_hook/pubspec.yaml +++ b/dev/integration_tests/link_hook/pubspec.yaml @@ -6,10 +6,9 @@ environment: sdk: '>=3.5.0-154.0.dev <4.0.0' dependencies: - cli_config: 0.2.0 logging: 1.2.0 - native_assets_cli: 0.8.0 - native_toolchain_c: 0.5.4 + native_assets_cli: 0.9.0 + native_toolchain_c: 0.6.0 _fe_analyzer_shared: 76.0.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" analyzer: 6.11.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" @@ -68,4 +67,4 @@ dev_dependencies: quiver: 3.2.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" yaml_edit: 2.2.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" -# PUBSPEC CHECKSUM: ddf6 +# PUBSPEC CHECKSUM: a89a diff --git a/packages/flutter_tools/lib/src/isolated/native_assets/android/native_assets.dart b/packages/flutter_tools/lib/src/isolated/native_assets/android/native_assets.dart index c5fde536ce..bb88f52afd 100644 --- a/packages/flutter_tools/lib/src/isolated/native_assets/android/native_assets.dart +++ b/packages/flutter_tools/lib/src/isolated/native_assets/android/native_assets.dart @@ -3,8 +3,7 @@ // found in the LICENSE file. import 'package:native_assets_builder/native_assets_builder.dart'; -import 'package:native_assets_cli/native_assets_cli.dart'; -import 'package:native_assets_cli/native_assets_cli_internal.dart'; +import 'package:native_assets_cli/code_assets_builder.dart'; import '../../../android/android_sdk.dart'; import '../../../android/gradle_utils.dart'; @@ -19,7 +18,7 @@ int targetAndroidNdkApi(Map environmentDefines) { Future copyNativeCodeAssetsAndroid( Uri buildUri, - Map assetTargetLocations, + Map assetTargetLocations, FileSystem fileSystem, ) async { if (assetTargetLocations.isNotEmpty) { @@ -33,7 +32,7 @@ Future copyNativeCodeAssetsAndroid( final Uri archUri = buildUri.resolve('jniLibs/lib/$jniArchDir/'); await fileSystem.directory(archUri).create(recursive: true); } - for (final MapEntry assetMapping + for (final MapEntry assetMapping in assetTargetLocations.entries) { final Uri source = assetMapping.key.file!; final Uri target = (assetMapping.value.path as KernelAssetAbsolutePath).uri; @@ -71,17 +70,17 @@ AndroidArch _getAndroidArch(Target target) { }; } -Map assetTargetLocationsAndroid( - List nativeAssets) { - return { - for (final NativeCodeAssetImpl asset in nativeAssets) +Map assetTargetLocationsAndroid( + List nativeAssets) { + return { + for (final CodeAsset asset in nativeAssets) asset: _targetLocationAndroid(asset), }; } /// Converts the `path` of [asset] as output from a `build.dart` invocation to /// the path used inside the Flutter app bundle. -KernelAsset _targetLocationAndroid(NativeCodeAssetImpl asset) { +KernelAsset _targetLocationAndroid(CodeAsset asset) { final LinkMode linkMode = asset.linkMode; final KernelAssetPath kernelAssetPath; switch (linkMode) { @@ -113,12 +112,12 @@ KernelAsset _targetLocationAndroid(NativeCodeAssetImpl asset) { /// Should only be invoked if a native assets build is performed. If the native /// assets feature is disabled, or none of the packages have native assets, a /// missing NDK is okay. -Future cCompilerConfigAndroid() async { +Future cCompilerConfigAndroid() async { final AndroidSdk? androidSdk = AndroidSdk.locateAndroidSdk(); if (androidSdk == null) { throwToolExit('Android SDK could not be found.'); } - final CCompilerConfigImpl result = CCompilerConfigImpl( + final CCompilerConfig result = CCompilerConfig( compiler: _toOptionalFileUri(androidSdk.getNdkClangPath()), archiver: _toOptionalFileUri(androidSdk.getNdkArPath()), linker: _toOptionalFileUri(androidSdk.getNdkLdPath()), diff --git a/packages/flutter_tools/lib/src/isolated/native_assets/ios/native_assets.dart b/packages/flutter_tools/lib/src/isolated/native_assets/ios/native_assets.dart index 20b5cb7c89..a3df69900b 100644 --- a/packages/flutter_tools/lib/src/isolated/native_assets/ios/native_assets.dart +++ b/packages/flutter_tools/lib/src/isolated/native_assets/ios/native_assets.dart @@ -3,8 +3,7 @@ // found in the LICENSE file. import 'package:native_assets_builder/native_assets_builder.dart'; -import 'package:native_assets_cli/native_assets_cli.dart'; -import 'package:native_assets_cli/native_assets_cli_internal.dart'; +import 'package:native_assets_cli/code_assets_builder.dart'; import '../../../base/file_system.dart'; import '../../../build_info.dart' hide BuildMode; @@ -15,10 +14,10 @@ import '../macos/native_assets_host.dart'; // TODO(dcharkes): Fetch minimum iOS version from somewhere. https://github.com/flutter/flutter/issues/145104 const int targetIOSVersion = 12; -IOSSdkImpl getIOSSdk(EnvironmentType environmentType) { +IOSSdk getIOSSdk(EnvironmentType environmentType) { return switch (environmentType) { - EnvironmentType.physical => IOSSdkImpl.iPhoneOS, - EnvironmentType.simulator => IOSSdkImpl.iPhoneSimulator, + EnvironmentType.physical => IOSSdk.iPhoneOS, + EnvironmentType.simulator => IOSSdk.iPhoneSimulator, }; } @@ -31,13 +30,13 @@ Target getNativeIOSTarget(DarwinArch darwinArch) { }; } -Map> fatAssetTargetLocationsIOS( - List nativeAssets) { +Map> fatAssetTargetLocationsIOS( + List nativeAssets) { final Set alreadyTakenNames = {}; - final Map> result = - >{}; + final Map> result = + >{}; final Map idToPath = {}; - for (final NativeCodeAssetImpl asset in nativeAssets) { + for (final CodeAsset asset in nativeAssets) { // Use same target path for all assets with the same id. final KernelAssetPath path = idToPath[asset.id] ?? _targetLocationIOS( @@ -45,19 +44,18 @@ Map> fatAssetTargetLocationsIOS( alreadyTakenNames, ).path; idToPath[asset.id] = path; - result[path] ??= []; + result[path] ??= []; result[path]!.add(asset); } return result; } -Map assetTargetLocationsIOS( - List nativeAssets) { +Map assetTargetLocationsIOS( + List nativeAssets) { final Set alreadyTakenNames = {}; final Map idToPath = {}; - final Map result = - {}; - for (final NativeCodeAssetImpl asset in nativeAssets) { + final Map result = {}; + for (final CodeAsset asset in nativeAssets) { final KernelAssetPath path = idToPath[asset.id] ?? _targetLocationIOS(asset, alreadyTakenNames).path; idToPath[asset.id] = path; @@ -70,8 +68,7 @@ Map assetTargetLocationsIOS( return result; } -KernelAsset _targetLocationIOS( - NativeCodeAssetImpl asset, Set alreadyTakenNames) { +KernelAsset _targetLocationIOS(CodeAsset asset, Set alreadyTakenNames) { final LinkMode linkMode = asset.linkMode; final KernelAssetPath kernelAssetPath; switch (linkMode) { @@ -113,7 +110,7 @@ KernelAsset _targetLocationIOS( /// in xcode_backend.dart. Future copyNativeCodeAssetsIOS( Uri buildUri, - Map> assetTargetLocations, + Map> assetTargetLocations, String? codesignIdentity, build_info.BuildMode buildMode, FileSystem fileSystem, @@ -125,11 +122,11 @@ Future copyNativeCodeAssetsIOS( final Map oldToNewInstallNames = {}; final List<(File, String, Directory)> dylibs = <(File, String, Directory)>[]; - for (final MapEntry> assetMapping + for (final MapEntry> assetMapping in assetTargetLocations.entries) { final Uri target = (assetMapping.key as KernelAssetAbsolutePath).uri; final List sources = [ - for (final NativeCodeAssetImpl source in assetMapping.value) + for (final CodeAsset source in assetMapping.value) fileSystem.file(source.file) ]; final Uri targetUri = buildUri.resolveUri(target); diff --git a/packages/flutter_tools/lib/src/isolated/native_assets/linux/native_assets.dart b/packages/flutter_tools/lib/src/isolated/native_assets/linux/native_assets.dart index 815146e96f..9b773e9867 100644 --- a/packages/flutter_tools/lib/src/isolated/native_assets/linux/native_assets.dart +++ b/packages/flutter_tools/lib/src/isolated/native_assets/linux/native_assets.dart @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import 'package:native_assets_cli/native_assets_cli_internal.dart'; +import 'package:native_assets_cli/code_assets_builder.dart'; import '../../../base/common.dart'; import '../../../base/file_system.dart'; @@ -12,7 +12,7 @@ import '../../../globals.dart' as globals; /// Flutter expects `clang++` to be on the path on Linux hosts. /// /// Search for the accompanying `clang`, `ar`, and `ld`. -Future cCompilerConfigLinux() async { +Future cCompilerConfigLinux() async { const String kClangPlusPlusBinary = 'clang++'; const String kClangBinary = 'clang'; const String kArBinary = 'llvm-ar'; @@ -34,7 +34,7 @@ Future cCompilerConfigLinux() async { } binaryPaths[binary] = binaryFile.uri; } - return CCompilerConfigImpl( + return CCompilerConfig( archiver: binaryPaths[kArBinary], compiler: binaryPaths[kClangBinary], linker: binaryPaths[kLdBinary], diff --git a/packages/flutter_tools/lib/src/isolated/native_assets/macos/native_assets.dart b/packages/flutter_tools/lib/src/isolated/native_assets/macos/native_assets.dart index 6878797a2c..ff7d6305cd 100644 --- a/packages/flutter_tools/lib/src/isolated/native_assets/macos/native_assets.dart +++ b/packages/flutter_tools/lib/src/isolated/native_assets/macos/native_assets.dart @@ -3,8 +3,7 @@ // found in the LICENSE file. import 'package:native_assets_builder/native_assets_builder.dart'; -import 'package:native_assets_cli/native_assets_cli.dart'; -import 'package:native_assets_cli/native_assets_cli_internal.dart'; +import 'package:native_assets_cli/code_assets_builder.dart'; import '../../../base/file_system.dart'; import '../../../build_info.dart' hide BuildMode; @@ -24,15 +23,15 @@ Target getNativeMacOSTarget(DarwinArch darwinArch) { }; } -Map> fatAssetTargetLocationsMacOS( - List nativeAssets, +Map> fatAssetTargetLocationsMacOS( + List nativeAssets, Uri? absolutePath, ) { final Set alreadyTakenNames = {}; - final Map> result = - >{}; + final Map> result = + >{}; final Map idToPath = {}; - for (final NativeCodeAssetImpl asset in nativeAssets) { + for (final CodeAsset asset in nativeAssets) { // Use same target path for all assets with the same id. final KernelAssetPath path = idToPath[asset.id] ?? _targetLocationMacOS( @@ -41,20 +40,20 @@ Map> fatAssetTargetLocationsMacOS( alreadyTakenNames, ).path; idToPath[asset.id] = path; - result[path] ??= []; + result[path] ??= []; result[path]!.add(asset); } return result; } -Map assetTargetLocationsMacOS( - List nativeAssets, +Map assetTargetLocationsMacOS( + List nativeAssets, Uri? absolutePath, ) { final Set alreadyTakenNames = {}; final Map idToPath = {}; - final Map result = {}; - for (final NativeCodeAssetImpl asset in nativeAssets) { + final Map result = {}; + for (final CodeAsset asset in nativeAssets) { final KernelAssetPath path = idToPath[asset.id] ?? _targetLocationMacOS(asset, absolutePath, alreadyTakenNames).path; idToPath[asset.id] = path; @@ -68,7 +67,7 @@ Map assetTargetLocationsMacOS( } KernelAsset _targetLocationMacOS( - NativeCodeAssetImpl asset, + CodeAsset asset, Uri? absolutePath, Set alreadyTakenNames, ) { @@ -123,7 +122,7 @@ KernelAsset _targetLocationMacOS( /// in macos_assemble.sh. Future copyNativeCodeAssetsMacOS( Uri buildUri, - Map> assetTargetLocations, + Map> assetTargetLocations, String? codesignIdentity, build_info.BuildMode buildMode, FileSystem fileSystem, @@ -136,11 +135,11 @@ Future copyNativeCodeAssetsMacOS( final Map oldToNewInstallNames = {}; final List<(File, String, Directory)> dylibs = <(File, String, Directory)>[]; - for (final MapEntry> assetMapping + for (final MapEntry> assetMapping in assetTargetLocations.entries) { final Uri target = (assetMapping.key as KernelAssetAbsolutePath).uri; final List sources = [ - for (final NativeCodeAssetImpl source in assetMapping.value) fileSystem.file(source.file), + for (final CodeAsset source in assetMapping.value) fileSystem.file(source.file), ]; final Uri targetUri = buildUri.resolveUri(target); final String name = targetUri.pathSegments.last; @@ -217,7 +216,7 @@ Future copyNativeCodeAssetsMacOS( /// Code signing is also done here. Future copyNativeCodeAssetsMacOSFlutterTester( Uri buildUri, - Map> assetTargetLocations, + Map> assetTargetLocations, String? codesignIdentity, build_info.BuildMode buildMode, FileSystem fileSystem, @@ -230,11 +229,11 @@ Future copyNativeCodeAssetsMacOSFlutterTester( final Map oldToNewInstallNames = {}; final List<(File, String)> dylibs = <(File, String)>[]; - for (final MapEntry> assetMapping + for (final MapEntry> assetMapping in assetTargetLocations.entries) { final Uri target = (assetMapping.key as KernelAssetAbsolutePath).uri; final List sources = [ - for (final NativeCodeAssetImpl source in assetMapping.value) fileSystem.file(source.file), + for (final CodeAsset source in assetMapping.value) fileSystem.file(source.file), ]; final Uri targetUri = buildUri.resolveUri(target); final File dylibFile = fileSystem.file(targetUri); diff --git a/packages/flutter_tools/lib/src/isolated/native_assets/macos/native_assets_host.dart b/packages/flutter_tools/lib/src/isolated/native_assets/macos/native_assets_host.dart index 503f9ae2a0..fad3efa3cd 100644 --- a/packages/flutter_tools/lib/src/isolated/native_assets/macos/native_assets_host.dart +++ b/packages/flutter_tools/lib/src/isolated/native_assets/macos/native_assets_host.dart @@ -4,8 +4,7 @@ // Shared logic between iOS and macOS implementations of native assets. -import 'package:native_assets_cli/native_assets_cli.dart'; -import 'package:native_assets_cli/native_assets_cli_internal.dart'; +import 'package:native_assets_cli/code_assets_builder.dart'; import '../../../base/common.dart'; import '../../../base/file_system.dart'; @@ -178,7 +177,7 @@ Future codesignDylib( /// Flutter expects `xcrun` to be on the path on macOS hosts. /// /// Use the `clang`, `ar`, and `ld` that would be used if run with `xcrun`. -Future cCompilerConfigMacOS() async { +Future cCompilerConfigMacOS() async { final ProcessResult xcrunResult = await globals.processManager.run( ['xcrun', 'clang', '--version'], ); @@ -189,7 +188,7 @@ Future cCompilerConfigMacOS() async { .firstWhere((String s) => s.startsWith('InstalledDir: ')) .split(' ') .last; - return CCompilerConfigImpl( + return CCompilerConfig( compiler: Uri.file('$installPath/clang'), archiver: Uri.file('$installPath/ar'), linker: Uri.file('$installPath/ld'), 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 fd8952e7d9..31f9908f4b 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 @@ -6,7 +6,7 @@ import 'package:logging/logging.dart' as logging; import 'package:native_assets_builder/native_assets_builder.dart'; -import 'package:native_assets_cli/native_assets_cli.dart'; +import 'package:native_assets_cli/code_assets_builder.dart'; import 'package:native_assets_cli/native_assets_cli_internal.dart'; import 'package:package_config/package_config_types.dart'; @@ -34,12 +34,12 @@ import 'windows/native_assets.dart'; /// If any of the dependencies change, then the Dart build should be performed /// again. final class DartBuildResult { - const DartBuildResult({required this.codeAssets, required this.dependencies}); + const DartBuildResult(this.codeAssets, this.dependencies); const DartBuildResult.empty() - : codeAssets = const [], + : codeAssets = const [], dependencies = const []; - final List codeAssets; + final List codeAssets; final List dependencies; } @@ -109,7 +109,7 @@ Future<(DartBuildResult, Uri)> runFlutterSpecificDartBuild({ final String? codesignIdentity = environmentDefines[build_info.kCodesignIdentity]; - final Map assetTargetLocations = + final Map assetTargetLocations = _assetTargetLocationsForOS( targetOS, result.codeAssets, flutterTester, buildUri); await _copyNativeCodeAssetsForOS(targetOS, buildUri, buildMode, fileSystem, @@ -130,8 +130,8 @@ Future runFlutterSpecificDartDryRunOnPlatforms({ return null; } - final Map assetTargetLocations = - {}; + final Map assetTargetLocations = + {}; for (final build_info.TargetPlatform targetPlatform in targetPlatforms) { // This dry-run functionality is only used in the `flutter run` // implementation (not in `flutter build` or `flutter test`). @@ -142,7 +142,7 @@ Future runFlutterSpecificDartDryRunOnPlatforms({ final bool flutterTester = targetPlatform == build_info.TargetPlatform.tester; - final OSImpl targetOS = _getNativeOSFromTargetPlatfrorm(targetPlatform); + final OS targetOS = _getNativeOSFromTargetPlatfrorm(targetPlatform); if (targetOS != OS.macOS && targetOS != OS.windows && targetOS != OS.linux && @@ -194,48 +194,48 @@ abstract interface class FlutterNativeAssetsBuildRunner { Future> packagesWithNativeAssets(); /// Runs all [packagesWithNativeAssets] `build.dart` in dry run. - Future buildDryRun({ + Future buildDryRun({ + required List supportedAssetTypes, + required BuildConfigCreator configCreator, + required BuildValidator buildValidator, required bool includeParentEnvironment, - required LinkModePreferenceImpl linkModePreference, - required OSImpl targetOS, + required OS targetOS, required Uri workingDirectory, }); /// Runs all [packagesWithNativeAssets] `build.dart`. - Future build({ + Future build({ + required List supportedAssetTypes, + required BuildConfigValidator configValidator, + required BuildConfigCreator configCreator, + required BuildValidator buildValidator, + required ApplicationAssetValidator applicationAssetValidator, required bool includeParentEnvironment, - required BuildModeImpl buildMode, - required LinkModePreferenceImpl linkModePreference, - required Target target, + required BuildMode buildMode, + required OS targetOS, required Uri workingDirectory, - CCompilerConfigImpl? cCompilerConfig, - int? targetAndroidNdkApi, - int? targetIOSVersion, - int? targetMacOSVersion, - IOSSdkImpl? targetIOSSdkImpl, required bool linkingEnabled, }); /// Runs all [packagesWithNativeAssets] `link.dart`. - Future link({ + Future link({ + required List supportedAssetTypes, + required LinkConfigValidator configValidator, + required LinkConfigCreator configCreator, + required LinkValidator linkValidator, + required ApplicationAssetValidator applicationAssetValidator, required bool includeParentEnvironment, - required BuildModeImpl buildMode, - required LinkModePreferenceImpl linkModePreference, - required Target target, + required BuildMode buildMode, + required OS targetOS, required Uri workingDirectory, required BuildResult buildResult, - CCompilerConfigImpl? cCompilerConfig, - int? targetAndroidNdkApi, - int? targetIOSVersion, - int? targetMacOSVersion, - IOSSdkImpl? targetIOSSdkImpl, }); /// The C compiler config to use for compilation. - Future get cCompilerConfig; + Future get cCompilerConfig; /// The NDK compiler to use to use for compilation for Android. - Future get ndkCCompilerConfigImpl; + Future get ndkCCompilerConfig; } /// Uses `package:native_assets_builder` for its implementation. @@ -294,10 +294,12 @@ class FlutterNativeAssetsBuildRunnerImpl implements FlutterNativeAssetsBuildRunn } @override - Future buildDryRun({ + Future buildDryRun({ + required List supportedAssetTypes, + required BuildConfigCreator configCreator, + required BuildValidator buildValidator, required bool includeParentEnvironment, - required LinkModePreferenceImpl linkModePreference, - required OSImpl targetOS, + required OS targetOS, required Uri workingDirectory, }) { final PackageLayout packageLayout = PackageLayout.fromPackageConfig( @@ -305,8 +307,10 @@ class FlutterNativeAssetsBuildRunnerImpl implements FlutterNativeAssetsBuildRunn Uri.file(packageConfigPath), ); return _buildRunner.buildDryRun( + supportedAssetTypes: supportedAssetTypes, + configCreator: configCreator, + buildValidator: buildValidator, includeParentEnvironment: includeParentEnvironment, - linkModePreference: linkModePreference, targetOS: targetOS, workingDirectory: workingDirectory, packageLayout: packageLayout, @@ -315,17 +319,16 @@ class FlutterNativeAssetsBuildRunnerImpl implements FlutterNativeAssetsBuildRunn } @override - Future build({ + Future build({ + required List supportedAssetTypes, + required BuildConfigValidator configValidator, + required BuildConfigCreator configCreator, + required BuildValidator buildValidator, + required ApplicationAssetValidator applicationAssetValidator, required bool includeParentEnvironment, - required BuildModeImpl buildMode, - required LinkModePreferenceImpl linkModePreference, - required Target target, + required BuildMode buildMode, + required OS targetOS, required Uri workingDirectory, - CCompilerConfigImpl? cCompilerConfig, - int? targetIOSVersion, - int? targetMacOSVersion, - int? targetAndroidNdkApi, - IOSSdkImpl? targetIOSSdkImpl, required bool linkingEnabled, }) { final PackageLayout packageLayout = PackageLayout.fromPackageConfig( @@ -333,57 +336,54 @@ class FlutterNativeAssetsBuildRunnerImpl implements FlutterNativeAssetsBuildRunn Uri.file(packageConfigPath), ); return _buildRunner.build( + supportedAssetTypes: supportedAssetTypes, + configCreator: configCreator, + configValidator: configValidator, + buildValidator: buildValidator, + applicationAssetValidator: applicationAssetValidator, buildMode: buildMode, - cCompilerConfig: cCompilerConfig, includeParentEnvironment: includeParentEnvironment, - linkModePreference: linkModePreference, - target: target, - targetAndroidNdkApi: targetAndroidNdkApi, - targetIOSSdk: targetIOSSdkImpl, + targetOS: targetOS, workingDirectory: workingDirectory, packageLayout: packageLayout, - targetIOSVersion: targetIOSVersion, - targetMacOSVersion: targetMacOSVersion, linkingEnabled: linkingEnabled, ); } @override - Future link({ + Future link({ + required List supportedAssetTypes, + required LinkConfigValidator configValidator, + required LinkConfigCreator configCreator, + required LinkValidator linkValidator, + required ApplicationAssetValidator applicationAssetValidator, required bool includeParentEnvironment, - required BuildModeImpl buildMode, - required LinkModePreferenceImpl linkModePreference, - required Target target, + required BuildMode buildMode, + required OS targetOS, required Uri workingDirectory, required BuildResult buildResult, - CCompilerConfigImpl? cCompilerConfig, - int? targetAndroidNdkApi, - int? targetIOSVersion, - int? targetMacOSVersion, - IOSSdkImpl? targetIOSSdkImpl, }) { final PackageLayout packageLayout = PackageLayout.fromPackageConfig( packageConfig, Uri.file(packageConfigPath), ); return _buildRunner.link( + supportedAssetTypes: supportedAssetTypes, + configCreator: configCreator, + configValidator: configValidator, + linkValidator: linkValidator, + applicationAssetValidator: applicationAssetValidator, buildMode: buildMode, - cCompilerConfig: cCompilerConfig, includeParentEnvironment: includeParentEnvironment, - linkModePreference: linkModePreference, - target: target, - targetAndroidNdkApi: targetAndroidNdkApi, - targetIOSSdk: targetIOSSdkImpl, + targetOS: targetOS, workingDirectory: workingDirectory, packageLayout: packageLayout, buildResult: buildResult, - targetIOSVersion: targetIOSVersion, - targetMacOSVersion: targetMacOSVersion, ); } @override - late final Future cCompilerConfig = () { + late final Future cCompilerConfig = () { if (globals.platform.isMacOS || globals.platform.isIOS) { return cCompilerConfigMacOS(); } @@ -400,7 +400,7 @@ class FlutterNativeAssetsBuildRunnerImpl implements FlutterNativeAssetsBuildRunn }(); @override - late final Future ndkCCompilerConfigImpl = () { + late final Future ndkCCompilerConfig = () { return cCompilerConfigAndroid(); }(); } @@ -423,14 +423,14 @@ Future writeNativeAssetsYaml( } /// Select the native asset build mode for a given Flutter build mode. -BuildModeImpl _nativeAssetsBuildMode(build_info.BuildMode buildMode) { +BuildMode _nativeAssetsBuildMode(build_info.BuildMode buildMode) { switch (buildMode) { case build_info.BuildMode.debug: - return BuildModeImpl.debug; + return BuildMode.debug; case build_info.BuildMode.jitRelease: case build_info.BuildMode.profile: case build_info.BuildMode.release: - return BuildModeImpl.release; + return BuildMode.release; } } @@ -448,7 +448,6 @@ Future _hasNoPackageConfig(FlutterNativeAssetsBuildRunner buildRunner) asy return !packageConfigExists; } - Future _nativeBuildRequired(FlutterNativeAssetsBuildRunner buildRunner) async { if (await _hasNoPackageConfig(buildRunner)) { return false; @@ -547,7 +546,6 @@ class HotRunnerNativeAssetsBuilderImpl implements HotRunnerNativeAssetsBuilder { } } - /// With `flutter run -d all` we need a place to store the native assets /// mapping for multiple OSes combined. Uri _buildUriMultiple(Uri projectUri) { @@ -555,12 +553,12 @@ Uri _buildUriMultiple(Uri projectUri) { return projectUri.resolve('$buildDir/native_assets/multiple/'); } -Map _assetTargetLocationsWindowsLinux( - List assets, +Map _assetTargetLocationsWindowsLinux( + List assets, Uri? absolutePath, ) { - return { - for (final NativeCodeAssetImpl asset in assets) + return { + for (final CodeAsset asset in assets) asset: _targetLocationSingleArchitecture( asset, absolutePath, @@ -569,7 +567,7 @@ Map _assetTargetLocationsWindowsLinux( } KernelAsset _targetLocationSingleArchitecture( - NativeCodeAssetImpl asset, Uri? absolutePath) { + CodeAsset asset, Uri? absolutePath) { final LinkMode linkMode = asset.linkMode; final KernelAssetPath kernelAssetPath; switch (linkMode) { @@ -604,8 +602,8 @@ KernelAsset _targetLocationSingleArchitecture( ); } -Map _assetTargetLocationsForOS(OS targetOS, - List codeAssets, bool flutterTester, Uri buildUri) { +Map _assetTargetLocationsForOS( + OS targetOS, List codeAssets, bool flutterTester, Uri buildUri) { switch (targetOS) { case OS.windows: case OS.linux: @@ -628,11 +626,10 @@ Future _copyNativeCodeAssetsForOS( Uri buildUri, build_info.BuildMode buildMode, FileSystem fileSystem, - Map assetTargetLocations, + Map assetTargetLocations, String? codesignIdentity, bool flutterTester) async { - final List codeAssets = - assetTargetLocations.keys.toList(); + final List codeAssets = assetTargetLocations.keys.toList(); switch (targetOS) { case OS.windows: case OS.linux: @@ -687,7 +684,7 @@ Future _runDartBuild({ required FlutterNativeAssetsBuildRunner buildRunner, required List targets, required Uri projectUri, - required BuildModeImpl buildMode, + required BuildMode buildMode, required FileSystem fileSystem, required OS targetOS, }) async { @@ -697,7 +694,7 @@ Future _runDartBuild({ : targets.toList().toString(); globals.logger .printTrace('Building native assets for $targetString $buildMode.'); - final List assets = []; + final List assets = []; final Set dependencies = {}; final build_info.EnvironmentType? environmentType; if (targetOS == OS.iOS) { @@ -710,8 +707,8 @@ Future _runDartBuild({ environmentType = null; } - final CCompilerConfigImpl cCompilerConfig = targetOS == OS.android - ? await buildRunner.ndkCCompilerConfigImpl + final CCompilerConfig cCompilerConfig = targetOS == OS.android + ? await buildRunner.ndkCCompilerConfig : await buildRunner.cCompilerConfig; final String? codesignIdentity = environmentDefines[build_info.kCodesignIdentity]; @@ -720,81 +717,122 @@ Future _runDartBuild({ final int? androidNdkApi = targetOS == OS.android ? targetAndroidNdkApi(environmentDefines) : null; final int? iOSVersion = targetOS == OS.iOS ? targetIOSVersion : null; final int? macOSVersion = targetOS == OS.macOS ? targetMacOSVersion : null; - final IOSSdkImpl? iOSSdkImpl = targetOS == OS.iOS ? getIOSSdk(environmentType!) : null; + final IOSSdk? iOSSdk = targetOS == OS.iOS ? getIOSSdk(environmentType!) : null; for (final Target target in targets) { - final BuildResult buildResult = await buildRunner.build( - linkModePreference: LinkModePreferenceImpl.dynamic, - target: target, + final BuildResult? buildResult = await buildRunner.build( + supportedAssetTypes: [CodeAsset.type], + configCreator: () => BuildConfigBuilder() + ..setupCodeConfig( + targetArchitecture: target.architecture, + linkModePreference: LinkModePreference.dynamic, + cCompilerConfig: cCompilerConfig, + targetAndroidNdkApi: androidNdkApi, + targetIOSVersion: iOSVersion, + targetMacOSVersion: macOSVersion, + targetIOSSdk: iOSSdk, + ), + configValidator: (BuildConfig config) async => [ + ...await validateCodeAssetBuildConfig(config), + ], + buildValidator: (BuildConfig config, BuildOutput output) async => [ + ...await validateCodeAssetBuildOutput(config, output), + ], + applicationAssetValidator: (List assets) async => [ + ...await validateCodeAssetInApplication(assets), + ], + targetOS: target.os, buildMode: buildMode, workingDirectory: projectUri, includeParentEnvironment: true, linkingEnabled: linkingEnabled, - cCompilerConfig: cCompilerConfig, - targetAndroidNdkApi: androidNdkApi, - targetIOSVersion: iOSVersion, - targetMacOSVersion: macOSVersion, - targetIOSSdkImpl: iOSSdkImpl, ); - if (!buildResult.success) { + if (buildResult == null) { _throwNativeAssetsBuildFailed(); } - assets.addAll(buildResult.assets); + assets.addAll(buildResult.encodedAssets); dependencies.addAll(buildResult.dependencies); if (linkingEnabled) { - final LinkResult linkResult = await buildRunner.link( - linkModePreference: LinkModePreferenceImpl.dynamic, - target: target, - buildMode: buildMode, + final LinkResult? linkResult = await buildRunner.link( + supportedAssetTypes: [CodeAsset.type], + configCreator: () => LinkConfigBuilder() + ..setupCodeConfig( + targetArchitecture: target.architecture, + linkModePreference: LinkModePreference.dynamic, + cCompilerConfig: cCompilerConfig, + targetAndroidNdkApi: androidNdkApi, + targetIOSVersion: iOSVersion, + targetMacOSVersion: macOSVersion, + targetIOSSdk: iOSSdk, + ), + configValidator: (LinkConfig config) async => [ + ...await validateCodeAssetLinkConfig(config), + ], + linkValidator: (LinkConfig config, LinkOutput output) async => [ + ...await validateCodeAssetLinkOutput(config, output), + ], + applicationAssetValidator: (List assets) async => [ + ...await validateCodeAssetInApplication(assets), + ], workingDirectory: projectUri, includeParentEnvironment: true, buildResult: buildResult, - cCompilerConfig: cCompilerConfig, - targetAndroidNdkApi: androidNdkApi, - targetIOSVersion: iOSVersion, - targetMacOSVersion: macOSVersion, - targetIOSSdkImpl: iOSSdkImpl, + targetOS: targetOS, + buildMode: buildMode, ); - if (!linkResult.success) { + if (linkResult == null) { _throwNativeAssetsLinkFailed(); } - assets.addAll(linkResult.assets); + assets.addAll(linkResult.encodedAssets); dependencies.addAll(linkResult.dependencies); } } - final List codeAssets = - assets.whereType().toList(); + final List codeAssets = assets + .where((EncodedAsset asset) => asset.type == CodeAsset.type) + .map(CodeAsset.fromEncoded) + .toList(); globals.logger .printTrace('Building native assets for $targetString $buildMode done.'); - return DartBuildResult(codeAssets: codeAssets, dependencies: dependencies.toList()); + return DartBuildResult(codeAssets, dependencies.toList()); } Future _runDartDryRunBuild({ required FlutterNativeAssetsBuildRunner buildRunner, required Uri projectUri, required FileSystem fileSystem, - required OSImpl targetOS, + required OS targetOS, }) async { globals.logger.printTrace('Dry running native assets for $targetOS.'); - final List assets = []; + final List assets = []; final Set dependencies = {}; - - final BuildDryRunResult buildResult = await buildRunner.buildDryRun( - linkModePreference: LinkModePreferenceImpl.dynamic, - targetOS: targetOS, + final BuildDryRunResult? buildResult = await buildRunner.buildDryRun( + supportedAssetTypes: [CodeAsset.type], + configCreator: () => BuildConfigBuilder() + ..setupCodeConfig( + targetArchitecture: null, + linkModePreference: LinkModePreference.dynamic, + ), + buildValidator: (BuildConfig config, BuildOutput output) async => [ + ...await validateCodeAssetBuildOutput(config, output), + ], workingDirectory: projectUri, + targetOS: targetOS, includeParentEnvironment: true, ); - if (!buildResult.success) { + if (buildResult == null) { _throwNativeAssetsBuildDryRunFailed(); } - assets.addAll(buildResult.assets); + assets.addAll(buildResult.encodedAssets); - final List codeAssets = - assets.whereType().toList(); + final List codeAssets = assets + .where((EncodedAsset asset) => asset.type == CodeAsset.type) + .map(CodeAsset.fromEncoded) + .toList(); globals.logger.printTrace('Dry running native assets for $targetOS done.'); - return DartBuildResult(codeAssets: codeAssets, dependencies: dependencies.toList()); + return DartBuildResult( + _expandCodeAssetsToAllArchitectures(codeAssets), + dependencies.toList()); } List _targetsForOS(build_info.TargetPlatform targetPlatform, @@ -865,7 +903,7 @@ Target _getNativeTarget(build_info.TargetPlatform targetPlatform) { Future _copyNativeCodeAssetsToBundleOnWindowsLinux( Uri buildUri, - Map assetTargetLocations, + Map assetTargetLocations, build_info.BuildMode buildMode, FileSystem fileSystem, ) async { @@ -876,7 +914,7 @@ Future _copyNativeCodeAssetsToBundleOnWindowsLinux( if (!buildDir.existsSync()) { buildDir.createSync(recursive: true); } - for (final MapEntry assetMapping in assetTargetLocations.entries) { + for (final MapEntry assetMapping in assetTargetLocations.entries) { final Uri source = assetMapping.key.file!; final Uri target = (assetMapping.value.path as KernelAssetAbsolutePath).uri; final Uri targetUri = buildUri.resolveUri(target); @@ -906,35 +944,34 @@ Never _throwNativeAssetsLinkFailed() { ); } - -OSImpl _getNativeOSFromTargetPlatfrorm(build_info.TargetPlatform platform) { +OS _getNativeOSFromTargetPlatfrorm(build_info.TargetPlatform platform) { switch (platform) { case build_info.TargetPlatform.ios: - return OSImpl.iOS; + return OS.iOS; case build_info.TargetPlatform.darwin: - return OSImpl.macOS; + return OS.macOS; case build_info.TargetPlatform.linux_x64: case build_info.TargetPlatform.linux_arm64: - return OSImpl.linux; + return OS.linux; case build_info.TargetPlatform.windows_x64: case build_info.TargetPlatform.windows_arm64: - return OSImpl.windows; + return OS.windows; case build_info.TargetPlatform.fuchsia_arm64: case build_info.TargetPlatform.fuchsia_x64: - return OSImpl.fuchsia; + return OS.fuchsia; case build_info.TargetPlatform.android: case build_info.TargetPlatform.android_arm: case build_info.TargetPlatform.android_arm64: case build_info.TargetPlatform.android_x64: case build_info.TargetPlatform.android_x86: - return OSImpl.android; + return OS.android; case build_info.TargetPlatform.tester: if (const LocalPlatform().isMacOS) { - return OSImpl.macOS; + return OS.macOS; } else if (const LocalPlatform().isLinux) { - return OSImpl.linux; + return OS.linux; } else if (const LocalPlatform().isWindows) { - return OSImpl.windows; + return OS.windows; } else { throw StateError('Unknown operating system'); } @@ -984,3 +1021,52 @@ String? _emptyToNull(String? input) { } return input; } + +List _expandCodeAssetsToAllArchitectures(List codeAssets) { + assert(codeAssets.every((CodeAsset asset) => asset.architecture == null)); + return [ + for (final CodeAsset codeAsset in codeAssets) + for (final Architecture architecture in codeAsset.os.architectures) + codeAsset.copyWith(architecture: architecture), + ]; +} + +extension OSArchitectures on OS { + Set get architectures => _osTargets[this]!; +} + +const Map> _osTargets = >{ + OS.android: { + Architecture.arm, + Architecture.arm64, + Architecture.ia32, + Architecture.x64, + Architecture.riscv64, + }, + OS.fuchsia: { + Architecture.arm64, + Architecture.x64, + }, + OS.iOS: { + Architecture.arm, + Architecture.arm64, + Architecture.x64, + }, + OS.linux: { + Architecture.arm, + Architecture.arm64, + Architecture.ia32, + Architecture.riscv32, + Architecture.riscv64, + Architecture.x64, + }, + OS.macOS: { + Architecture.arm64, + Architecture.x64, + }, + OS.windows: { + Architecture.arm64, + Architecture.ia32, + Architecture.x64, + }, +}; diff --git a/packages/flutter_tools/lib/src/isolated/native_assets/windows/native_assets.dart b/packages/flutter_tools/lib/src/isolated/native_assets/windows/native_assets.dart index f61b1bc76d..2da8894873 100644 --- a/packages/flutter_tools/lib/src/isolated/native_assets/windows/native_assets.dart +++ b/packages/flutter_tools/lib/src/isolated/native_assets/windows/native_assets.dart @@ -2,12 +2,12 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import 'package:native_assets_cli/native_assets_cli_internal.dart'; +import 'package:native_assets_cli/code_assets_builder.dart'; import '../../../globals.dart' as globals; import '../../../windows/visual_studio.dart'; -Future cCompilerConfigWindows() async { +Future cCompilerConfigWindows() async { final VisualStudio visualStudio = VisualStudio( fileSystem: globals.fs, platform: globals.platform, @@ -16,7 +16,7 @@ Future cCompilerConfigWindows() async { osUtils: globals.os, ); - return CCompilerConfigImpl( + return CCompilerConfig( compiler: _toOptionalFileUri(visualStudio.clPath), linker: _toOptionalFileUri(visualStudio.linkPath), archiver: _toOptionalFileUri(visualStudio.libPath), diff --git a/packages/flutter_tools/lib/src/update_packages_pins.dart b/packages/flutter_tools/lib/src/update_packages_pins.dart index 83e8acc01d..0fe6da29bd 100644 --- a/packages/flutter_tools/lib/src/update_packages_pins.dart +++ b/packages/flutter_tools/lib/src/update_packages_pins.dart @@ -23,8 +23,8 @@ const Map kManuallyPinnedDependencies = { 'flutter_gallery_assets': '1.0.2', // Tests depend on the exact version. 'flutter_template_images': '4.2.0', // Must always exactly match flutter_tools template. 'google_mobile_ads': '5.1.0', // https://github.com/flutter/flutter/issues/156912 - 'native_assets_builder': '0.8.3', // Under active development with breaking changes until 1.0.0. Manually rolled by @dcharkes. - 'native_assets_cli': '0.8.0', // Under active development with breaking changes until 1.0.0. Manually rolled by @dcharkes. + 'native_assets_builder': '0.9.0', // Under active development with breaking changes until 1.0.0. Manually rolled by @dcharkes. + 'native_assets_cli': '0.9.0', // Under active development with breaking changes until 1.0.0. Manually rolled by @dcharkes. 'material_color_utilities': '0.11.1', // Keep pinned to latest until 1.0.0. 'leak_tracker': '10.0.8', // https://github.com/flutter/devtools/issues/3951 'leak_tracker_testing': '3.0.1', // https://github.com/flutter/devtools/issues/3951 diff --git a/packages/flutter_tools/pubspec.yaml b/packages/flutter_tools/pubspec.yaml index 2712179596..008b8347f3 100644 --- a/packages/flutter_tools/pubspec.yaml +++ b/packages/flutter_tools/pubspec.yaml @@ -54,10 +54,9 @@ dependencies: async: 2.11.0 unified_analytics: 6.1.4 - cli_config: 0.2.0 graphs: 2.3.2 - native_assets_builder: 0.8.3 - native_assets_cli: 0.8.0 + native_assets_builder: 0.9.0 + native_assets_cli: 0.9.0 # We depend on very specific internal implementation details of the # 'test' package, which change between versions, so when upgrading @@ -122,4 +121,4 @@ dartdoc: # Exclude this package from the hosted API docs. nodoc: true -# PUBSPEC CHECKSUM: 3825 +# PUBSPEC CHECKSUM: 2ec9 diff --git a/packages/flutter_tools/templates/package_ffi/pubspec.yaml.tmpl b/packages/flutter_tools/templates/package_ffi/pubspec.yaml.tmpl index da146b06d9..a14c84d5f9 100644 --- a/packages/flutter_tools/templates/package_ffi/pubspec.yaml.tmpl +++ b/packages/flutter_tools/templates/package_ffi/pubspec.yaml.tmpl @@ -7,10 +7,9 @@ environment: sdk: {{dartSdkVersionBounds}} dependencies: - cli_config: ^0.2.0 logging: ^1.2.0 - native_assets_cli: ^0.8.0 - native_toolchain_c: ^0.5.4 + native_assets_cli: ^0.9.0 + native_toolchain_c: ^0.6.0 dev_dependencies: ffi: ^2.1.3 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 587a2a47a1..1b3c95a9eb 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 @@ -16,7 +16,7 @@ import 'package:flutter_tools/src/build_system/build_system.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'; -import 'package:native_assets_cli/native_assets_cli_internal.dart'; +import 'package:native_assets_cli/code_assets_builder.dart' hide BuildMode; import 'package:package_config/package_config_types.dart'; import '../../../src/common.dart'; @@ -71,13 +71,14 @@ void main() { packagesWithNativeAssetsResult: [ Package('bar', projectUri), ], - buildResult: FakeFlutterNativeAssetsBuilderResult( - assets: [ - NativeCodeAssetImpl( - id: 'package:bar/bar.dart', - linkMode: DynamicLoadingBundledImpl(), - os: OSImpl.android, - architecture: ArchitectureImpl.arm64, + buildResult: FakeFlutterNativeAssetsBuilderResult.fromAssets( + codeAssets: [ + CodeAsset( + package: 'bar', + name: 'bar.dart', + linkMode: DynamicLoadingBundled(), + os: OS.android, + architecture: Architecture.arm64, file: Uri.file('libbar.so'), ), ], @@ -182,6 +183,6 @@ class _BuildRunnerWithoutNdk extends FakeFlutterNativeAssetsBuildRunner { }); @override - Future get ndkCCompilerConfigImpl async => + Future get ndkCCompilerConfig async => throwToolExit('Android NDK Clang could not be found.'); } 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 fc68734822..367e870809 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 @@ -13,8 +13,8 @@ import 'package:flutter_tools/src/build_system/exceptions.dart'; import 'package:flutter_tools/src/build_system/targets/native_assets.dart'; import 'package:flutter_tools/src/features.dart'; import 'package:flutter_tools/src/isolated/native_assets/native_assets.dart'; -import 'package:native_assets_cli/native_assets_cli_internal.dart' - as native_assets_cli; +import 'package:native_assets_cli/code_assets_builder.dart' hide BuildMode; +import 'package:native_assets_cli/native_assets_cli.dart' as native_assets_cli show BuildMode; import 'package:package_config/package_config.dart' show Package; import '../../../../src/common.dart'; @@ -192,13 +192,14 @@ void main() { final FlutterNativeAssetsBuildRunner buildRunner = FakeFlutterNativeAssetsBuildRunner( packagesWithNativeAssetsResult: [Package('foo', iosEnvironment.buildDir.uri)], - buildResult: FakeFlutterNativeAssetsBuilderResult( - assets: [ - native_assets_cli.NativeCodeAssetImpl( - id: 'package:foo/foo.dart', - linkMode: native_assets_cli.DynamicLoadingBundledImpl(), - os: native_assets_cli.OSImpl.iOS, - architecture: native_assets_cli.ArchitectureImpl.arm64, + buildResult: FakeFlutterNativeAssetsBuilderResult.fromAssets( + codeAssets: [ + CodeAsset( + package: 'foo', + name: 'foo.dart', + linkMode: DynamicLoadingBundled(), + os: OS.iOS, + architecture: Architecture.arm64, file: Uri.file('foo.framework/foo'), ), ], @@ -255,14 +256,15 @@ void main() { packagesWithNativeAssetsResult: [ Package('foo', androidEnvironment.buildDir.uri) ], - buildResult: FakeFlutterNativeAssetsBuilderResult( - assets: [ + buildResult: FakeFlutterNativeAssetsBuilderResult.fromAssets( + codeAssets: [ if (hasAssets) - native_assets_cli.NativeCodeAssetImpl( - id: 'package:foo/foo.dart', - linkMode: native_assets_cli.DynamicLoadingBundledImpl(), - os: native_assets_cli.OSImpl.android, - architecture: native_assets_cli.ArchitectureImpl.arm64, + CodeAsset( + package: 'foo', + name: 'foo.dart', + linkMode: DynamicLoadingBundled(), + os: OS.android, + architecture: Architecture.arm64, file: Uri.file('libfoo.so'), ), ], @@ -274,7 +276,7 @@ void main() { await NativeAssets(buildRunner: buildRunner).build(androidEnvironment); expect( buildRunner.lastBuildMode, - native_assets_cli.BuildModeImpl.release, + native_assets_cli.BuildMode.release, ); }, ); diff --git a/packages/flutter_tools/test/general.shard/isolated/fake_native_assets_build_runner.dart b/packages/flutter_tools/test/general.shard/isolated/fake_native_assets_build_runner.dart index ced45ab4b4..870fb94576 100644 --- a/packages/flutter_tools/test/general.shard/isolated/fake_native_assets_build_runner.dart +++ b/packages/flutter_tools/test/general.shard/isolated/fake_native_assets_build_runner.dart @@ -4,13 +4,12 @@ import 'package:file/file.dart'; import 'package:flutter_tools/src/base/logger.dart'; -import 'package:flutter_tools/src/build_info.dart'; +import 'package:flutter_tools/src/build_info.dart' hide BuildMode; import 'package:flutter_tools/src/isolated/native_assets/native_assets.dart'; import 'package:flutter_tools/src/resident_runner.dart'; import 'package:flutter_tools/src/run_hot.dart'; -import 'package:native_assets_builder/native_assets_builder.dart' - as native_assets_builder; -import 'package:native_assets_cli/native_assets_cli_internal.dart'; +import 'package:native_assets_builder/native_assets_builder.dart'; +import 'package:native_assets_cli/code_assets_builder.dart'; import 'package:package_config/package_config_types.dart'; /// Mocks all logic instead of using `package:native_assets_builder`, which @@ -24,71 +23,96 @@ class FakeFlutterNativeAssetsBuildRunner this.buildDryRunResult = const FakeFlutterNativeAssetsBuilderResult(), this.buildResult = const FakeFlutterNativeAssetsBuilderResult(), this.linkResult = const FakeFlutterNativeAssetsBuilderResult(), - CCompilerConfigImpl? cCompilerConfigResult, - CCompilerConfigImpl? ndkCCompilerConfigImplResult, - }) : cCompilerConfigResult = cCompilerConfigResult ?? CCompilerConfigImpl(), - ndkCCompilerConfigImplResult = - ndkCCompilerConfigImplResult ?? CCompilerConfigImpl(); + CCompilerConfig? cCompilerConfigResult, + CCompilerConfig? ndkCCompilerConfigResult, + }) : cCompilerConfigResult = cCompilerConfigResult ?? CCompilerConfig(), + ndkCCompilerConfigResult = + ndkCCompilerConfigResult ?? CCompilerConfig(); - final native_assets_builder.BuildResult Function(Target)? onBuild; - final native_assets_builder.BuildResult buildResult; - final native_assets_builder.LinkResult linkResult; - final native_assets_builder.BuildDryRunResult buildDryRunResult; + final BuildResult? Function(BuildConfig)? onBuild; + final BuildResult? buildResult; + final LinkResult? linkResult; + final BuildDryRunResult? buildDryRunResult; final bool hasPackageConfigResult; final List packagesWithNativeAssetsResult; - final CCompilerConfigImpl cCompilerConfigResult; - final CCompilerConfigImpl ndkCCompilerConfigImplResult; + final CCompilerConfig cCompilerConfigResult; + final CCompilerConfig ndkCCompilerConfigResult; int buildInvocations = 0; int buildDryRunInvocations = 0; int linkInvocations = 0; int hasPackageConfigInvocations = 0; int packagesWithNativeAssetsInvocations = 0; - BuildModeImpl? lastBuildMode; + BuildMode? lastBuildMode; @override - Future build({ + Future build({ + required List supportedAssetTypes, + required BuildConfigValidator configValidator, + required BuildConfigCreator configCreator, + required BuildValidator buildValidator, + required ApplicationAssetValidator applicationAssetValidator, required bool includeParentEnvironment, - required BuildModeImpl buildMode, - required LinkModePreferenceImpl linkModePreference, - required Target target, + required BuildMode buildMode, + required OS targetOS, required Uri workingDirectory, - CCompilerConfigImpl? cCompilerConfig, - int? targetAndroidNdkApi, - int? targetIOSVersion, - int? targetMacOSVersion, - IOSSdkImpl? targetIOSSdkImpl, required bool linkingEnabled, }) async { - buildInvocations++; - lastBuildMode = buildMode; - return onBuild?.call(target) ?? buildResult; + BuildResult? result = buildResult; + for (final Package package in packagesWithNativeAssetsResult) { + final BuildConfigBuilder configBuilder = configCreator() + ..setupHookConfig( + packageRoot: package.root, + packageName: package.name, + targetOS: targetOS, + supportedAssetTypes: supportedAssetTypes, + buildMode: buildMode, + ) + ..setupBuildConfig( + dryRun: false, + linkingEnabled: linkingEnabled, + ) + ..setupBuildRunConfig( + outputDirectory: Uri.parse('build-out-dir'), + outputDirectoryShared: Uri.parse('build-out-dir-shared'), + ); + final BuildConfig buildConfig = BuildConfig(configBuilder.json); + if (onBuild != null) { + result = onBuild!(buildConfig); + } + lastBuildMode = buildConfig.buildMode; + buildInvocations++; + } + return result; } @override - Future link({ + Future link({ + required List supportedAssetTypes, + required LinkConfigCreator configCreator, + required LinkConfigValidator configValidator, + required LinkValidator linkValidator, + required ApplicationAssetValidator applicationAssetValidator, required bool includeParentEnvironment, - required BuildModeImpl buildMode, - required LinkModePreferenceImpl linkModePreference, - required Target target, + required BuildMode buildMode, + required OS targetOS, required Uri workingDirectory, - required native_assets_builder.BuildResult buildResult, - CCompilerConfigImpl? cCompilerConfig, - int? targetAndroidNdkApi, - int? targetIOSVersion, - int? targetMacOSVersion, - IOSSdkImpl? targetIOSSdkImpl, + required BuildResult buildResult, }) async { - linkInvocations++; - lastBuildMode = buildMode; + for (final Package _ in packagesWithNativeAssetsResult) { + lastBuildMode = buildMode; + linkInvocations++; + } return linkResult; } @override - Future buildDryRun({ + Future buildDryRun({ + required List supportedAssetTypes, + required ConfigCreator configCreator, + required BuildValidator buildValidator, required bool includeParentEnvironment, - required LinkModePreferenceImpl linkModePreference, - required OSImpl targetOS, + required OS targetOS, required Uri workingDirectory, }) async { buildDryRunInvocations++; @@ -108,37 +132,38 @@ class FakeFlutterNativeAssetsBuildRunner } @override - Future get cCompilerConfig async => - cCompilerConfigResult; + Future get cCompilerConfig async => cCompilerConfigResult; @override - Future get ndkCCompilerConfigImpl async => - cCompilerConfigResult; + Future get ndkCCompilerConfig async => cCompilerConfigResult; } final class FakeFlutterNativeAssetsBuilderResult - implements - native_assets_builder.BuildResult, - native_assets_builder.BuildDryRunResult, - native_assets_builder.LinkResult { + implements BuildResult, BuildDryRunResult, LinkResult { const FakeFlutterNativeAssetsBuilderResult({ - this.assets = const [], - this.assetsForLinking = const >{}, + this.encodedAssets = const [], + this.encodedAssetsForLinking = const >{}, this.dependencies = const [], - this.success = true, }); - @override - final List assets; + factory FakeFlutterNativeAssetsBuilderResult.fromAssets({ + List codeAssets = const [], + List dependencies = const [], + }) { + return FakeFlutterNativeAssetsBuilderResult( + encodedAssets: [ + for (final CodeAsset codeAsset in codeAssets) codeAsset.encode(), + ], dependencies: dependencies); + } @override - final Map> assetsForLinking; + final List encodedAssets; + + @override + final Map> encodedAssetsForLinking; @override final List dependencies; - - @override - final bool success; } class FakeHotRunnerNativeAssetsBuilder implements HotRunnerNativeAssetsBuilder { diff --git a/packages/flutter_tools/test/general.shard/isolated/hot_test.dart b/packages/flutter_tools/test/general.shard/isolated/hot_test.dart index 5eae75909a..f1fe433f34 100644 --- a/packages/flutter_tools/test/general.shard/isolated/hot_test.dart +++ b/packages/flutter_tools/test/general.shard/isolated/hot_test.dart @@ -13,8 +13,7 @@ import 'package:flutter_tools/src/features.dart'; import 'package:flutter_tools/src/resident_devtools_handler.dart'; import 'package:flutter_tools/src/resident_runner.dart'; import 'package:flutter_tools/src/run_hot.dart'; -import 'package:native_assets_cli/native_assets_cli_internal.dart' - hide Target; +import 'package:native_assets_cli/code_assets_builder.dart'; import 'package:package_config/package_config.dart'; import 'package:unified_analytics/unified_analytics.dart'; @@ -62,20 +61,22 @@ void main() { packagesWithNativeAssetsResult: [ Package('bar', fileSystem.currentDirectory.uri), ], - buildDryRunResult: FakeFlutterNativeAssetsBuilderResult( - assets: [ - NativeCodeAssetImpl( - id: 'package:bar/bar.dart', - linkMode: DynamicLoadingBundledImpl(), - os: OSImpl.macOS, - architecture: ArchitectureImpl.arm64, + buildDryRunResult: FakeFlutterNativeAssetsBuilderResult.fromAssets( + codeAssets: [ + CodeAsset( + package: 'bar', + name: 'bar.dart', + linkMode: DynamicLoadingBundled(), + os: OS.macOS, + architecture: Architecture.arm64, file: Uri.file('bar.dylib'), ), - NativeCodeAssetImpl( - id: 'package:bar/bar.dart', - linkMode: DynamicLoadingBundledImpl(), - os: OSImpl.macOS, - architecture: ArchitectureImpl.x64, + CodeAsset( + package: 'bar', + name: 'bar.dart', + linkMode: DynamicLoadingBundled(), + os: OS.macOS, + architecture: Architecture.x64, file: Uri.file('bar.dylib'), ), ], @@ -131,20 +132,22 @@ void main() { packagesWithNativeAssetsResult: [ Package('bar', fileSystem.currentDirectory.uri), ], - buildDryRunResult: FakeFlutterNativeAssetsBuilderResult( - assets: [ - NativeCodeAssetImpl( - id: 'package:bar/bar.dart', - linkMode: DynamicLoadingBundledImpl(), - os: OSImpl.macOS, - architecture: ArchitectureImpl.arm64, + buildDryRunResult: FakeFlutterNativeAssetsBuilderResult.fromAssets( + codeAssets: [ + CodeAsset( + package: 'bar', + name: 'bar.dart', + linkMode: DynamicLoadingBundled(), + os: OS.macOS, + architecture: Architecture.arm64, file: Uri.file('bar.dylib'), ), - NativeCodeAssetImpl( - id: 'package:bar/bar.dart', - linkMode: DynamicLoadingBundledImpl(), - os: OSImpl.macOS, - architecture: ArchitectureImpl.x64, + CodeAsset( + package: 'bar', + name: 'bar.dart', + linkMode: DynamicLoadingBundled(), + os: OS.macOS, + architecture: Architecture.x64, file: Uri.file('bar.dylib'), ), ], 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 da875d8d91..0a3c7a1a4f 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 @@ -14,9 +14,7 @@ import 'package:flutter_tools/src/build_system/build_system.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'; -import 'package:native_assets_cli/native_assets_cli_internal.dart' hide Target; -import 'package:native_assets_cli/native_assets_cli_internal.dart' - as native_assets_cli; +import 'package:native_assets_cli/code_assets_builder.dart' hide BuildMode; import 'package:package_config/package_config_types.dart'; import '../../../src/common.dart'; @@ -168,22 +166,24 @@ void main() { packagesWithNativeAssetsResult: [ Package('bar', projectUri), ], - onBuild: (native_assets_cli.Target target) => - FakeFlutterNativeAssetsBuilderResult( - assets: [ - NativeCodeAssetImpl( - id: 'package:bar/bar.dart', - linkMode: DynamicLoadingBundledImpl(), - os: target.os, - architecture: target.architecture, - file: Uri.file('${target.architecture}/libbar.dylib'), + onBuild: (BuildConfig config) => + FakeFlutterNativeAssetsBuilderResult.fromAssets( + codeAssets: [ + CodeAsset( + package: 'bar', + name: 'bar.dart', + linkMode: DynamicLoadingBundled(), + os: config.targetOS, + architecture: config.codeConfig.targetArchitecture, + file: Uri.file('${config.codeConfig.targetArchitecture}/libbar.dylib'), ), - NativeCodeAssetImpl( - id: 'package:buz/buz.dart', - linkMode: DynamicLoadingBundledImpl(), - os: target.os, - architecture: target.architecture, - file: Uri.file('${target.architecture}/libbuz.dylib'), + CodeAsset( + package: 'buz', + name: 'buz.dart', + linkMode: DynamicLoadingBundled(), + os: config.targetOS, + architecture: config.codeConfig.targetArchitecture, + file: Uri.file('${config.codeConfig.targetArchitecture}/libbuz.dylib'), ), ], ), 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 978e733c47..74bf755fc4 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 @@ -15,8 +15,7 @@ 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; import 'package:flutter_tools/src/isolated/native_assets/native_assets.dart'; -import 'package:native_assets_cli/native_assets_cli_internal.dart' - hide Target; +import 'package:native_assets_cli/code_assets_builder.dart' hide BuildMode; import 'package:package_config/package_config_types.dart'; import '../../../src/common.dart'; @@ -112,13 +111,13 @@ void main() { ); final FlutterNativeAssetsBuildRunner runner = FlutterNativeAssetsBuildRunnerImpl(projectUri, packageConfigFile.path, packageConfig, fileSystem, logger); - final CCompilerConfigImpl result = await runner.cCompilerConfig; + final CCompilerConfig result = await runner.cCompilerConfig; expect(result.compiler, Uri.file('/some/path/to/clang')); }); } class _BuildRunnerWithoutClang extends FakeFlutterNativeAssetsBuildRunner { @override - Future get cCompilerConfig async => + Future get cCompilerConfig async => throwToolExit('Failed to find clang++ on the PATH.'); } diff --git a/packages/flutter_tools/test/general.shard/isolated/macos/native_assets_host_test.dart b/packages/flutter_tools/test/general.shard/isolated/macos/native_assets_host_test.dart index 765e21cca0..44c20f22bd 100644 --- a/packages/flutter_tools/test/general.shard/isolated/macos/native_assets_host_test.dart +++ b/packages/flutter_tools/test/general.shard/isolated/macos/native_assets_host_test.dart @@ -3,7 +3,7 @@ // found in the LICENSE file. import 'package:flutter_tools/src/isolated/native_assets/macos/native_assets_host.dart'; -import 'package:native_assets_cli/native_assets_cli.dart'; +import 'package:native_assets_cli/code_assets_builder.dart'; import '../../../src/common.dart'; 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 5a2ae7fad0..dfbf8987fa 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 @@ -14,9 +14,7 @@ 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; import 'package:flutter_tools/src/isolated/native_assets/native_assets.dart'; -import 'package:native_assets_cli/native_assets_cli_internal.dart' hide Target; -import 'package:native_assets_cli/native_assets_cli_internal.dart' - as native_assets_cli; +import 'package:native_assets_cli/code_assets_builder.dart' hide BuildMode; import 'package:package_config/package_config_types.dart'; import '../../../src/common.dart'; @@ -50,7 +48,7 @@ void main() { }); for (final bool flutterTester in [false, true]) { - final bool isArm64 = native_assets_cli.ArchitectureImpl.current == ArchitectureImpl.arm64; + final bool isArm64 = Architecture.current == Architecture.arm64; String testName = ''; if (flutterTester) { @@ -274,22 +272,24 @@ void main() { packagesWithNativeAssetsResult: [ Package('bar', projectUri), ], - onBuild: (native_assets_cli.Target target) => - FakeFlutterNativeAssetsBuilderResult( - assets: [ - NativeCodeAssetImpl( - id: 'package:bar/bar.dart', - linkMode: DynamicLoadingBundledImpl(), - os: target.os, - architecture: target.architecture, - file: Uri.file('${target.architecture}/libbar.dylib'), + onBuild: (BuildConfig config) => + FakeFlutterNativeAssetsBuilderResult.fromAssets( + codeAssets: [ + CodeAsset( + package: 'bar', + name: 'bar.dart', + linkMode: DynamicLoadingBundled(), + os: config.targetOS, + architecture: config.codeConfig.targetArchitecture, + file: Uri.file('${config.codeConfig.targetArchitecture}/libbar.dylib'), ), - NativeCodeAssetImpl( - id: 'package:buz/buz.dart', - linkMode: DynamicLoadingBundledImpl(), - os: target.os, - architecture: target.architecture, - file: Uri.file('${target.architecture}/libbuz.dylib'), + CodeAsset( + package: 'buz', + name: 'buz.dart', + linkMode: DynamicLoadingBundled(), + os: config.targetOS, + architecture: config.codeConfig.targetArchitecture, + file: Uri.file('${config.codeConfig.targetArchitecture}/libbuz.dylib'), ), ], ), @@ -395,7 +395,7 @@ InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault fileSystem, logger, ); - final CCompilerConfigImpl result = await runner.cCompilerConfig; + final CCompilerConfig result = await runner.cCompilerConfig; expect( result.compiler, Uri.file( 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 5710e1da10..c8beb0813d 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 @@ -13,7 +13,7 @@ import 'package:flutter_tools/src/build_system/build_system.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'; -import 'package:native_assets_cli/native_assets_cli_internal.dart'; +import 'package:native_assets_cli/code_assets_builder.dart' hide BuildMode; import 'package:package_config/package_config_types.dart'; import '../../src/common.dart'; @@ -144,13 +144,13 @@ void main() { packagesWithNativeAssetsResult: [ Package('bar', projectUri), ], - buildDryRunResult: FakeFlutterNativeAssetsBuilderResult( - assets: [ - NativeCodeAssetImpl( - id: 'package:bar/bar.dart', - linkMode: DynamicLoadingBundledImpl(), - os: OSImpl.windows, - architecture: ArchitectureImpl.x64, + buildDryRunResult: FakeFlutterNativeAssetsBuilderResult.fromAssets( + codeAssets: [ + CodeAsset( + package: 'bar', + name: 'bar.dart', + linkMode: DynamicLoadingBundled(), + os: OS.windows, file: Uri.file('bar.dll'), ), ], @@ -259,9 +259,7 @@ void main() { packagesWithNativeAssetsResult: [ Package('bar', projectUri), ], - buildDryRunResult: const FakeFlutterNativeAssetsBuilderResult( - success: false, - ), + buildDryRunResult: null, ), ), throwsToolExit( @@ -293,9 +291,7 @@ void main() { packagesWithNativeAssetsResult: [ Package('bar', projectUri), ], - buildResult: const FakeFlutterNativeAssetsBuilderResult( - success: false, - ), + buildResult: null, ), ), throwsToolExit( @@ -304,5 +300,4 @@ void main() { ), ); }); - } 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 2eb7bf9b76..b3a6bca1a4 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 @@ -14,7 +14,7 @@ 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; import 'package:flutter_tools/src/isolated/native_assets/native_assets.dart'; -import 'package:native_assets_cli/native_assets_cli_internal.dart'; +import 'package:native_assets_cli/code_assets_builder.dart' hide BuildMode; import 'package:native_assets_cli/native_assets_cli_internal.dart' as native_assets_cli; import 'package:package_config/package_config_types.dart'; @@ -81,13 +81,14 @@ void main() { packagesWithNativeAssetsResult: [ Package('bar', projectUri), ], - buildResult: FakeFlutterNativeAssetsBuilderResult( - assets: [ - NativeCodeAssetImpl( - id: 'package:bar/bar.dart', - linkMode: DynamicLoadingBundledImpl(), - os: OSImpl.windows, - architecture: ArchitectureImpl.x64, + buildResult: FakeFlutterNativeAssetsBuilderResult.fromAssets( + codeAssets: [ + CodeAsset( + package: 'bar', + name: 'bar.dart', + linkMode: DynamicLoadingBundled(), + os: OS.windows, + architecture: Architecture.x64, file: dylibAfterCompiling.uri, ), ], @@ -116,7 +117,7 @@ void main() { ]), ); final String expectedDirectory = flutterTester - ? native_assets_cli.OSImpl.current.toString() + ? native_assets_cli.OS.current.toString() : 'windows'; expect(nativeAssetsYaml, flutterTester @@ -246,7 +247,7 @@ void main() { fileSystem, logger, ); - final CCompilerConfigImpl result = await runner.cCompilerConfig; + final CCompilerConfig result = await runner.cCompilerConfig; expect( result.compiler?.toFilePath(), msvcBinDir.childFile('cl.exe').uri.toFilePath(), diff --git a/packages/flutter_tools/test/integration.shard/isolated/native_assets_test.dart b/packages/flutter_tools/test/integration.shard/isolated/native_assets_test.dart index cb5890a224..5c60634552 100644 --- a/packages/flutter_tools/test/integration.shard/isolated/native_assets_test.dart +++ b/packages/flutter_tools/test/integration.shard/isolated/native_assets_test.dart @@ -19,7 +19,7 @@ import 'package:file/file.dart'; import 'package:file_testing/file_testing.dart'; import 'package:flutter_tools/src/base/logger.dart'; import 'package:flutter_tools/src/base/os.dart'; -import 'package:native_assets_cli/native_assets_cli_internal.dart'; +import 'package:native_assets_cli/code_assets_builder.dart'; import '../../src/common.dart'; import '../test_utils.dart' show fileSystem, platform; @@ -222,47 +222,6 @@ void main() { }); }); } - - // This could be an hermetic unit test if the native_assets_builder - // could mock process runs and file system. - // https://github.com/dart-lang/native/issues/90. - testWithoutContext('flutter build $buildSubcommand error on static libraries', () async { - await inTempDir((Directory tempDirectory) async { - final Directory packageDirectory = await createTestProject(packageName, tempDirectory); - final File buildDotDart = - packageDirectory.childDirectory('hook').childFile('build.dart'); - final String buildDotDartContents = await buildDotDart.readAsString(); - // Overrides the build to output static libraries. - final String buildDotDartContentsNew = buildDotDartContents.replaceFirst( - 'await build(args, (config, output) async {', - ''' - await build([ - '-D${LinkModePreferenceImpl.configKey}=${LinkModePreferenceImpl.static}', - ...args, - ], (config, output) async { -''', - ); - expect(buildDotDartContentsNew, isNot(buildDotDartContents)); - await buildDotDart.writeAsString(buildDotDartContentsNew); - final Directory exampleDirectory = packageDirectory.childDirectory('example'); - - final ProcessResult result = processManager.runSync( - [ - flutterBin, - 'build', - buildSubcommand, - if (buildSubcommand == 'ios') '--no-codesign', - '-v', // Requires verbose mode for error. - ], - workingDirectory: exampleDirectory.path, - ); - expect( - (result.stdout as String) + (result.stderr as String), - contains('has a link mode "static", which is not allowed by by the config link mode preference "dynamic"'), - ); - expect(result.exitCode, isNot(0)); - }); - }); } for (final String add2appBuildSubcommand in add2appBuildSubcommands) { @@ -421,7 +380,7 @@ void expectDylibIsBundledIos(Directory appDirectory, String buildMode) { /// Sample path: build/linux/x64/release/bundle/lib/libmy_package.so void expectDylibIsBundledLinux(Directory appDirectory, String buildMode) { // Linux does not support cross compilation, so always only check current architecture. - final String architecture = ArchitectureImpl.current.dartPlatform; + final String architecture = Architecture.current.name; final Directory appBundle = appDirectory .childDirectory('build') .childDirectory(hostOs) @@ -432,7 +391,7 @@ void expectDylibIsBundledLinux(Directory appDirectory, String buildMode) { final Directory dylibsFolder = appBundle.childDirectory('lib'); expect(dylibsFolder, exists); final File dylib = - dylibsFolder.childFile(OSImpl.linux.dylibFileName(packageName)); + dylibsFolder.childFile(OS.linux.dylibFileName(packageName)); expect(dylib, exists); } @@ -441,7 +400,7 @@ void expectDylibIsBundledLinux(Directory appDirectory, String buildMode) { /// Sample path: build\windows\x64\runner\Debug\my_package_example.exe void expectDylibIsBundledWindows(Directory appDirectory, String buildMode) { // Linux does not support cross compilation, so always only check current architecture. - final String architecture = ArchitectureImpl.current.dartPlatform; + final String architecture = Architecture.current.name; final Directory appBundle = appDirectory .childDirectory('build') .childDirectory(hostOs) @@ -450,7 +409,7 @@ void expectDylibIsBundledWindows(Directory appDirectory, String buildMode) { .childDirectory(buildMode.upperCaseFirst()); expect(appBundle, exists); final File dylib = - appBundle.childFile(OSImpl.windows.dylibFileName(packageName)); + appBundle.childFile(OS.windows.dylibFileName(packageName)); expect(dylib, exists); } @@ -481,7 +440,7 @@ void expectDylibIsBundledAndroid(Directory appDirectory, String buildMode) { expect(archDir.childFile('libapp.so'), exists); } final File dylib = - archDir.childFile(OSImpl.android.dylibFileName(packageName)); + archDir.childFile(OS.android.dylibFileName(packageName)); expect(dylib, exists); } } @@ -504,6 +463,13 @@ void expectDylibIsBundledWithFrameworks(Directory appDirectory, String buildMode void expectCCompilerIsConfigured(Directory appDirectory) { final Directory nativeAssetsBuilderDir = appDirectory.childDirectory('.dart_tool/native_assets_builder/'); for (final Directory subDir in nativeAssetsBuilderDir.listSync().whereType()) { + // We only want to look at build/link hook invocation directories. The + // `/shared/*` directory allows the individual hooks to store data that is + // reusable across different build/link confiurations. + if (subDir.path.endsWith('shared')) { + continue; + } + final File config = subDir.childFile('config.json'); expect(config, exists); final String contents = config.readAsStringSync();