From 534b250a562c9a90bc0f5d7119a2e8c973695b8d Mon Sep 17 00:00:00 2001 From: Daco Harkes Date: Wed, 21 May 2025 18:54:42 +0200 Subject: [PATCH] [native assets] Graduate to preview (#169194) This PR enables native assets on the main and dev channel by default, and make native assets available on the beta channel. This PR removes the flag from invocations. The helper packages (`package:hooks` and `package:code_assets`) will stay 0.x for now, until the SDK constraint can be bumped to a beta release and we're happy with the Dart API. Corresponding Dart CL: https://dart-review.googlesource.com/c/sdk/+/429920 Issue: * https://github.com/flutter/flutter/issues/129757 Project: https://github.com/orgs/dart-lang/projects/99/ --- ...uild_android_host_app_with_module_aar.dart | 7 ----- ...d_android_host_app_with_module_source.dart | 7 ----- dev/devicelab/bin/tasks/module_test_ios.dart | 2 -- .../lib/tasks/native_assets_test.dart | 14 --------- packages/flutter_tools/lib/src/features.dart | 5 +-- .../isolated/native_assets/native_assets.dart | 8 ++++- .../hermetic/create_usage_test.dart | 1 - .../test/general.shard/features_test.dart | 4 +-- .../flutter_project_metadata_test.dart | 31 ++++++++++--------- .../isolated/android/native_assets_test.dart | 10 ++---- .../targets/native_assets_test.dart | 2 -- .../isolated/ios/native_assets_test.dart | 3 -- .../isolated/linux/native_assets_test.dart | 8 +---- .../isolated/macos/native_assets_test.dart | 4 --- .../isolated/native_assets_test.dart | 26 ++++++---------- .../isolated/windows/native_assets_test.dart | 8 +---- .../native_assets_agp_version_test.dart | 4 --- .../isolated/native_assets_test.dart | 4 --- ...e_assets_without_cbuild_assemble_test.dart | 4 --- 19 files changed, 42 insertions(+), 110 deletions(-) diff --git a/dev/devicelab/bin/tasks/build_android_host_app_with_module_aar.dart b/dev/devicelab/bin/tasks/build_android_host_app_with_module_aar.dart index e8da1285063..ddd685646be 100644 --- a/dev/devicelab/bin/tasks/build_android_host_app_with_module_aar.dart +++ b/dev/devicelab/bin/tasks/build_android_host_app_with_module_aar.dart @@ -72,13 +72,6 @@ class ModuleTest { section('Create package with native assets'); - await flutter( - 'config', - options: ['--enable-native-assets'], - output: stdout, - stderr: stderr, - ); - const String ffiPackageName = 'ffi_package'; await createFfiPackage(ffiPackageName, tempDir); diff --git a/dev/devicelab/bin/tasks/build_android_host_app_with_module_source.dart b/dev/devicelab/bin/tasks/build_android_host_app_with_module_source.dart index c9ab35b97bc..e71f8ad3f0f 100644 --- a/dev/devicelab/bin/tasks/build_android_host_app_with_module_source.dart +++ b/dev/devicelab/bin/tasks/build_android_host_app_with_module_source.dart @@ -66,13 +66,6 @@ class ModuleTest { section('Create package with native assets'); - await flutter( - 'config', - options: ['--enable-native-assets'], - output: stdout, - stderr: stderr, - ); - const String ffiPackageName = 'ffi_package'; await createFfiPackage(ffiPackageName, tempDir); diff --git a/dev/devicelab/bin/tasks/module_test_ios.dart b/dev/devicelab/bin/tasks/module_test_ios.dart index d26643ffb1d..e788a1141d7 100644 --- a/dev/devicelab/bin/tasks/module_test_ios.dart +++ b/dev/devicelab/bin/tasks/module_test_ios.dart @@ -68,8 +68,6 @@ Future main() async { section('Create package with native assets'); - await flutter('config', options: ['--enable-native-assets']); - const String ffiPackageName = 'ffi_package'; await createFfiPackage(ffiPackageName, tempDir); diff --git a/dev/devicelab/lib/tasks/native_assets_test.dart b/dev/devicelab/lib/tasks/native_assets_test.dart index 99face062ef..236af7d1a2d 100644 --- a/dev/devicelab/lib/tasks/native_assets_test.dart +++ b/dev/devicelab/lib/tasks/native_assets_test.dart @@ -29,8 +29,6 @@ TaskFunction createNativeAssetsTest({ deviceIdOverride = device.deviceId; } - await enableNativeAssets(); - for (final String buildMode in _buildModes) { if (buildMode != 'debug' && isIosSimulator) { continue; @@ -149,18 +147,6 @@ Future runFlutter({ final String _flutterBin = path.join(flutterDirectory.path, 'bin', 'flutter'); -Future enableNativeAssets() async { - print('Enabling configs for native assets...'); - final int configResult = await exec(_flutterBin, [ - 'config', - '-v', - '--enable-native-assets', - ], canFail: true); - if (configResult != 0) { - print('Failed to enable configuration, tasks may not run.'); - } -} - Future createTestProject(String packageName, Directory tempDirectory) async { await exec(_flutterBin, [ 'create', diff --git a/packages/flutter_tools/lib/src/features.dart b/packages/flutter_tools/lib/src/features.dart index fed0b16ec70..fa95dbba2be 100644 --- a/packages/flutter_tools/lib/src/features.dart +++ b/packages/flutter_tools/lib/src/features.dart @@ -48,7 +48,7 @@ abstract class FeatureFlags { bool get isCliAnimationEnabled => true; /// Whether native assets compilation and bundling is enabled. - bool get isNativeAssetsEnabled => false; + bool get isNativeAssetsEnabled => true; /// Whether Swift Package Manager dependency management is enabled. bool get isSwiftPackageManagerEnabled => false; @@ -154,7 +154,8 @@ const Feature nativeAssets = Feature( name: 'native assets compilation and bundling', configSetting: 'enable-native-assets', environmentOverride: 'FLUTTER_NATIVE_ASSETS', - master: FeatureChannelSetting(available: true), + master: FeatureChannelSetting(available: true, enabledByDefault: true), + beta: FeatureChannelSetting(available: true, enabledByDefault: true), ); /// Enable Swift Package Manager as a darwin dependency manager. 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 c0819e11e18..83f36829498 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 @@ -657,7 +657,13 @@ Future _runDartBuild({ dependencies.addAll(linkResult.dependencies); } } - + if (codeAssets.isNotEmpty) { + globals.logger.printTrace( + 'Note: You are using the dart build hooks feature which is currently ' + 'in preview. Please see ' + 'https://dart.dev/interop/c-interop#native-assets for more details.', + ); + } globals.logger.printTrace('Building native assets for $targetOS $architectureString done.'); return DartBuildResult(codeAssets, dependencies.toList()); } diff --git a/packages/flutter_tools/test/commands.shard/hermetic/create_usage_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/create_usage_test.dart index 29efc876e04..dfddc525145 100644 --- a/packages/flutter_tools/test/commands.shard/hermetic/create_usage_test.dart +++ b/packages/flutter_tools/test/commands.shard/hermetic/create_usage_test.dart @@ -178,7 +178,6 @@ void main() { }, overrides: { DoctorValidatorsProvider: () => FakeDoctorValidatorsProvider(), - FeatureFlags: () => TestFeatureFlags(isNativeAssetsEnabled: true), }, ); }); diff --git a/packages/flutter_tools/test/general.shard/features_test.dart b/packages/flutter_tools/test/general.shard/features_test.dart index b3f39cc1791..b79b0cb4a4d 100644 --- a/packages/flutter_tools/test/general.shard/features_test.dart +++ b/packages/flutter_tools/test/general.shard/features_test.dart @@ -312,9 +312,9 @@ void main() { expect( nativeAssets, allOf([ - _onChannelIs('master', available: true, enabledByDefault: false), + _onChannelIs('master', available: true, enabledByDefault: true), _onChannelIs('stable', available: false, enabledByDefault: false), - _onChannelIs('beta', available: false, enabledByDefault: false), + _onChannelIs('beta', available: true, enabledByDefault: true), ]), ); }); diff --git a/packages/flutter_tools/test/general.shard/flutter_project_metadata_test.dart b/packages/flutter_tools/test/general.shard/flutter_project_metadata_test.dart index 5c50f797d7b..a594a57668a 100644 --- a/packages/flutter_tools/test/general.shard/flutter_project_metadata_test.dart +++ b/packages/flutter_tools/test/general.shard/flutter_project_metadata_test.dart @@ -239,29 +239,32 @@ migration: expect(logger.traceText, contains('The key `create_revision` was not found')); }); - testUsingContext('enabledValues does not contain packageFfi if native-assets not enabled', () { - expect( - ParsedFlutterTemplateType.enabledValues(featureFlags), - isNot(contains(FlutterTemplateType.packageFfi)), - ); - expect( - ParsedFlutterTemplateType.enabledValues(featureFlags), - contains(FlutterTemplateType.plugin), - ); - }); - testUsingContext( - 'enabledValues contains packageFfi if natives-assets enabled', + 'enabledValues does not contain packageFfi if native-assets not enabled', () { expect( ParsedFlutterTemplateType.enabledValues(featureFlags), - contains(FlutterTemplateType.packageFfi), + isNot(contains(FlutterTemplateType.packageFfi)), ); expect( ParsedFlutterTemplateType.enabledValues(featureFlags), contains(FlutterTemplateType.plugin), ); }, - overrides: {FeatureFlags: () => TestFeatureFlags(isNativeAssetsEnabled: true)}, + overrides: { + // ignore: avoid_redundant_argument_values + FeatureFlags: () => TestFeatureFlags(isNativeAssetsEnabled: false), + }, ); + + testUsingContext('enabledValues contains packageFfi if natives-assets enabled', () { + expect( + ParsedFlutterTemplateType.enabledValues(featureFlags), + contains(FlutterTemplateType.packageFfi), + ); + expect( + ParsedFlutterTemplateType.enabledValues(featureFlags), + contains(FlutterTemplateType.plugin), + ); + }); } 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 d044ad15ba4..dc4d0eee200 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 @@ -54,10 +54,7 @@ void main() { 'build with assets $buildMode', // [intended] Backslashes in commands, but we will never run these commands on Windows. skip: const LocalPlatform().isWindows, - overrides: { - FeatureFlags: () => TestFeatureFlags(isNativeAssetsEnabled: true), - ProcessManager: () => FakeProcessManager.empty(), - }, + overrides: {ProcessManager: () => FakeProcessManager.empty()}, () async { final File packageConfig = environment.projectDir.childFile( '.dart_tool/package_config.json', @@ -121,10 +118,7 @@ void main() { // assets have to be build. testUsingContext( 'does not throw if NDK not present but no native assets present', - overrides: { - FeatureFlags: () => TestFeatureFlags(isNativeAssetsEnabled: true), - ProcessManager: () => FakeProcessManager.empty(), - }, + overrides: {ProcessManager: () => FakeProcessManager.empty()}, () async { final File packageConfig = environment.projectDir.childFile('.dart_tool/package_config.json'); await packageConfig.create(recursive: true); 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 0428ac2ba4c..d0dd9f90c4d 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 @@ -189,7 +189,6 @@ void main() { ], ), ]), - FeatureFlags: () => TestFeatureFlags(isNativeAssetsEnabled: true), }, () async { writePackageConfigFiles(directory: iosEnvironment.projectDir, mainLibName: 'my_app'); @@ -252,7 +251,6 @@ void main() { overrides: { FileSystem: () => fileSystem, ProcessManager: () => processManager, - FeatureFlags: () => TestFeatureFlags(isNativeAssetsEnabled: true), }, () async { writePackageConfigFiles(directory: androidEnvironment.projectDir, mainLibName: 'my_app'); 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 b3a51c41d1e..28bcd6ed726 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 @@ -13,14 +13,12 @@ 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'; import 'package:hooks/hooks.dart'; import '../../../src/common.dart'; import '../../../src/context.dart'; -import '../../../src/fakes.dart'; import '../fake_native_assets_build_runner.dart'; void main() { @@ -52,7 +50,6 @@ void main() { testUsingContext( 'build with assets $buildMode', overrides: { - FeatureFlags: () => TestFeatureFlags(isNativeAssetsEnabled: true), ProcessManager: () => FakeProcessManager.list([ const FakeCommand( 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 31f04b606c9..c4e383afc5a 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 @@ -13,14 +13,12 @@ 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/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:package_config/package_config_types.dart'; import '../../../src/common.dart'; import '../../../src/context.dart'; -import '../../../src/fakes.dart'; import '../../../src/package_config.dart'; import '../fake_native_assets_build_runner.dart'; @@ -53,10 +51,7 @@ void main() { testUsingContext( 'does not throw if clang not present but no native assets present', - overrides: { - FeatureFlags: () => TestFeatureFlags(isNativeAssetsEnabled: true), - ProcessManager: () => FakeProcessManager.empty(), - }, + overrides: {ProcessManager: () => FakeProcessManager.empty()}, () async { final File packageConfig = environment.projectDir.childFile('.dart_tool/package_config.json'); await packageConfig.create(recursive: true); @@ -81,7 +76,6 @@ void main() { testUsingContext( 'NativeAssetsBuildRunnerImpl.cCompilerConfig', overrides: { - FeatureFlags: () => TestFeatureFlags(isNativeAssetsEnabled: true), ProcessManager: () => FakeProcessManager.list([ const FakeCommand( 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 71274caf04b..4f9633a6ddd 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 @@ -13,7 +13,6 @@ 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; import 'package:flutter_tools/src/isolated/native_assets/native_assets.dart'; import 'package:hooks/hooks.dart'; @@ -21,7 +20,6 @@ import 'package:package_config/package_config_types.dart'; import '../../../src/common.dart'; import '../../../src/context.dart'; -import '../../../src/fakes.dart'; import '../../../src/package_config.dart'; import '../fake_native_assets_build_runner.dart'; @@ -84,7 +82,6 @@ void main() { testUsingContext( 'build with assets $buildMode$testName', overrides: { - FeatureFlags: () => TestFeatureFlags(isNativeAssetsEnabled: true), ProcessManager: () => FakeProcessManager.list([ if (flutterTester) ...[ @@ -371,7 +368,6 @@ void main() { testUsingContext( 'NativeAssetsBuildRunnerImpl.cCompilerConfig', overrides: { - FeatureFlags: () => TestFeatureFlags(isNativeAssetsEnabled: true), ProcessManager: () => FakeProcessManager.list([ const FakeCommand( 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 92715859512..e1a97f060f6 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 @@ -47,10 +47,7 @@ void main() { testUsingContext( 'Native assets: non-bundled libraries require no copying', - overrides: { - FeatureFlags: () => TestFeatureFlags(isNativeAssetsEnabled: true), - ProcessManager: () => FakeProcessManager.empty(), - }, + overrides: {ProcessManager: () => FakeProcessManager.empty()}, () async { final File packageConfig = environment.projectDir.childFile('.dart_tool/package_config.json'); final Uri nonFlutterTesterAssetUri = environment.buildDir.childFile('native_assets.json').uri; @@ -96,7 +93,11 @@ void main() { testUsingContext( 'build with assets but not enabled', - overrides: {ProcessManager: () => FakeProcessManager.empty()}, + overrides: { + // ignore: avoid_redundant_argument_values + FeatureFlags: () => TestFeatureFlags(isNativeAssetsEnabled: false), + ProcessManager: () => FakeProcessManager.empty(), + }, () async { final File packageConfig = environment.projectDir.childFile('.dart_tool/package_config.json'); await packageConfig.parent.create(); @@ -122,10 +123,7 @@ void main() { testUsingContext( 'build no assets', - overrides: { - FeatureFlags: () => TestFeatureFlags(isNativeAssetsEnabled: true), - ProcessManager: () => FakeProcessManager.empty(), - }, + overrides: {ProcessManager: () => FakeProcessManager.empty()}, () async { final File packageConfig = environment.projectDir.childFile('.dart_tool/package_config.json'); final Uri nonFlutterTesterAssetUri = @@ -169,10 +167,7 @@ void main() { testUsingContext( 'Native assets build error', - overrides: { - FeatureFlags: () => TestFeatureFlags(isNativeAssetsEnabled: true), - ProcessManager: () => FakeProcessManager.empty(), - }, + overrides: {ProcessManager: () => FakeProcessManager.empty()}, () async { final File packageConfig = environment.projectDir.childFile('.dart_tool/package_config.json'); await packageConfig.parent.create(); @@ -195,10 +190,7 @@ void main() { testUsingContext( 'Native assets: no duplicate assets with linking', - overrides: { - FeatureFlags: () => TestFeatureFlags(isNativeAssetsEnabled: true), - ProcessManager: () => FakeProcessManager.empty(), - }, + overrides: {ProcessManager: () => FakeProcessManager.empty()}, () async { final File packageConfig = environment.projectDir.childFile('.dart_tool/package_config.json'); await packageConfig.parent.create(); 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 a0292fb315e..923ad397a32 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,14 +14,12 @@ 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; import 'package:flutter_tools/src/isolated/native_assets/native_assets.dart'; import 'package:package_config/package_config_types.dart'; import '../../../src/common.dart'; import '../../../src/context.dart'; -import '../../../src/fakes.dart'; import '../../../src/package_config.dart'; import '../fake_native_assets_build_runner.dart'; @@ -72,10 +70,7 @@ void main() { testUsingContext( 'build with assets $buildMode$testName', - overrides: { - FeatureFlags: () => TestFeatureFlags(isNativeAssetsEnabled: true), - ProcessManager: () => FakeProcessManager.empty(), - }, + overrides: {ProcessManager: () => FakeProcessManager.empty()}, () async { writePackageConfigFiles(directory: environment.projectDir, mainLibName: 'my_app'); final Uri nonFlutterTesterAssetUri = @@ -165,7 +160,6 @@ void main() { testUsingContext( 'NativeAssetsBuildRunnerImpl.cCompilerConfig', overrides: { - FeatureFlags: () => TestFeatureFlags(isNativeAssetsEnabled: true), ProcessManager: () => FakeProcessManager.list([ FakeCommand( diff --git a/packages/flutter_tools/test/integration.shard/isolated/native_assets_agp_version_test.dart b/packages/flutter_tools/test/integration.shard/isolated/native_assets_agp_version_test.dart index 94d2d6d6dce..c1b55db66a1 100644 --- a/packages/flutter_tools/test/integration.shard/isolated/native_assets_agp_version_test.dart +++ b/packages/flutter_tools/test/integration.shard/isolated/native_assets_agp_version_test.dart @@ -30,10 +30,6 @@ void main() { return; } - setUpAll(() { - processManager.runSync([flutterBin, 'config', '--enable-native-assets']); - }); - for (final String agpVersion in agpVersions) { for (final String buildMode in buildModes) { testWithoutContext( 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 8d78631f450..88fd035c765 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 @@ -53,10 +53,6 @@ void main() { return; } - setUpAll(() { - processManager.runSync([flutterBin, 'config', '--enable-native-assets']); - }); - for (final String device in devices) { for (final String buildMode in buildModes) { if (device == 'flutter-tester' && buildMode != 'debug') { diff --git a/packages/flutter_tools/test/integration.shard/isolated/native_assets_without_cbuild_assemble_test.dart b/packages/flutter_tools/test/integration.shard/isolated/native_assets_without_cbuild_assemble_test.dart index 81f6478208d..683477ee09d 100644 --- a/packages/flutter_tools/test/integration.shard/isolated/native_assets_without_cbuild_assemble_test.dart +++ b/packages/flutter_tools/test/integration.shard/isolated/native_assets_without_cbuild_assemble_test.dart @@ -36,10 +36,6 @@ void main() { const ProcessManager processManager = LocalProcessManager(); final String constraint = _getPackageFfiTemplatePubspecVersion(); - setUpAll(() { - processManager.runSync([flutterBin, 'config', '--enable-native-assets']); - }); - // Test building a host, iOS, and APK (Android) target where possible. for (final String buildCommand in [ // Current (Host) OS.