Visitar URL original
[record_use] Add recorded uses to link hooks · flutter/flutter@a7e7dad · GitHub
Skip to content

Commit a7e7dad

Browse files
committed
[record_use] Add recorded uses to link hooks
1 parent c6f719d commit a7e7dad

4 files changed

Lines changed: 28 additions & 11 deletions

File tree

‎packages/flutter_tools/lib/src/build_system/targets/common.dart‎

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import 'dart_plugin_registrant.dart';
2525
import 'icon_tree_shaker.dart';
2626
import 'localizations.dart';
2727
import 'native_assets.dart';
28+
import '../../features.dart';
2829

2930
/// Copies the pre-built flutter bundle.
3031
// This is a one-off rule for implementing build bundle in terms of assemble.
@@ -154,9 +155,10 @@ class KernelSnapshot extends Target {
154155
];
155156

156157
@override
157-
List<Source> get outputs => const <Source>[
158-
Source.pattern('{BUILD_DIR}/${KernelSnapshot.dillName}'),
159-
// TODO(mosuem): Should output resources.json. https://github.com/flutter/flutter/issues/146263
158+
List<Source> get outputs => <Source>[
159+
const Source.pattern('{BUILD_DIR}/${KernelSnapshot.dillName}'),
160+
if (featureFlags.isRecordUseEnabled)
161+
const Source.pattern('{BUILD_DIR}/recorded_uses.json'),
160162
];
161163

162164
static const depfile = 'kernel_snapshot_program.d';
@@ -204,6 +206,10 @@ class KernelSnapshot extends Target {
204206
environment.defines,
205207
kExtraFrontEndOptions,
206208
);
209+
if (featureFlags.isRecordUseEnabled && buildMode.isPrecompiled) {
210+
final File recordedUsesFile = environment.buildDir.childFile('recorded_uses.json');
211+
extraFrontEndOptions.add('--recorded-uses=${recordedUsesFile.path}');
212+
}
207213
final List<String>? fileSystemRoots = environment.defines[kFileSystemRoots]?.split(',');
208214
final String? fileSystemScheme = environment.defines[kFileSystemScheme];
209215

‎packages/flutter_tools/lib/src/build_system/targets/native_assets.dart‎

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import 'package:package_config/package_config_types.dart';
1717

1818
import '../../base/common.dart';
1919
import '../../base/file_system.dart';
20+
import '../../features.dart';
2021
import '../../build_info.dart';
2122
import '../../convert.dart';
2223
import '../../dart/package_map.dart';
@@ -25,6 +26,7 @@ import '../../isolated/native_assets/native_assets.dart';
2526
import '../build_system.dart';
2627
import '../depfile.dart';
2728
import '../exceptions.dart' show MissingDefineException;
29+
import 'common.dart';
2830

2931
/// Runs the dart build of the app.
3032
class DartBuild extends Target {
@@ -53,6 +55,7 @@ class DartBuild extends Target {
5355
}
5456
final FlutterNativeAssetsBuildRunner buildRunner =
5557
_buildRunner ?? await createFlutterNativeAssetsBuildRunner(environment);
58+
final File recordedUsesFile = environment.buildDir.childFile('recorded_uses.json');
5659
result = await runFlutterSpecificHooks(
5760
environmentDefines: environment.defines,
5861
buildRunner: buildRunner,
@@ -61,6 +64,7 @@ class DartBuild extends Target {
6164
fileSystem: fileSystem,
6265
buildCodeAssets: BuildCodeAssetsOptions(appBuildDirectory: environment.outputDir),
6366
buildDataAssets: true,
67+
recordedUsesFile: recordedUsesFile.existsSync() ? recordedUsesFile : null,
6468
);
6569
final File dartHookResultJsonFile = environment.buildDir.childFile(dartHookResultFilename);
6670
if (!dartHookResultJsonFile.parent.existsSync()) {
@@ -129,9 +133,12 @@ class DartBuild extends Target {
129133
class DartBuildForNative extends DartBuild {
130134
const DartBuildForNative({@visibleForTesting super.buildRunner});
131135

132-
// TODO(dcharkes): Add `KernelSnapshot()` for AOT builds only when adding tree-shaking information. https://github.com/dart-lang/native/issues/153
136+
// TODO(dacoharkes): Split the target in two. The build hooks target to run parallel with dart kernel compilation and the link hooks target to run afterwards.
133137
@override
134-
List<Target> get dependencies => const <Target>[];
138+
List<Target> get dependencies => <Target>[
139+
if (featureFlags.isRecordUseEnabled)
140+
const KernelSnapshot(),
141+
];
135142
}
136143

137144
/// Installs the code assets from a [DartBuild] Flutter app.

‎packages/flutter_tools/lib/src/isolated/native_assets/native_assets.dart‎

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ Future<DartHooksResult> runFlutterSpecificHooks({
6969
required FileSystem fileSystem,
7070
required BuildCodeAssetsOptions? buildCodeAssets,
7171
required bool buildDataAssets,
72+
File? recordedUsesFile,
7273
}) async {
7374
if (!await _hookRunRequired(buildRunner)) {
7475
return DartHooksResult.empty();
@@ -109,6 +110,7 @@ Future<DartHooksResult> runFlutterSpecificHooks({
109110
projectUri: projectUri,
110111
linkingEnabled: linkingEnabled,
111112
targets: targets,
113+
recordedUsesFile: recordedUsesFile,
112114
);
113115
}
114116

@@ -167,6 +169,7 @@ abstract interface class FlutterNativeAssetsBuildRunner {
167169
Future<LinkResult?> link({
168170
required List<ProtocolExtension> extensions,
169171
required BuildResult buildResult,
172+
File? recordedUsesFile,
170173
});
171174

172175
Future<void> setCCompilerConfig(CodeAssetTarget target);
@@ -263,10 +266,12 @@ class FlutterNativeAssetsBuildRunnerImpl implements FlutterNativeAssetsBuildRunn
263266
Future<LinkResult?> link({
264267
required List<ProtocolExtension> extensions,
265268
required BuildResult buildResult,
269+
File? recordedUsesFile,
266270
}) async {
267271
final Result<LinkResult, HooksRunnerFailure> result = await _buildRunner.link(
268272
extensions: extensions,
269273
buildResult: buildResult,
274+
resourceIdentifiers: recordedUsesFile?.uri,
270275
);
271276
if (result.isSuccess) {
272277
return result.success;
@@ -534,6 +539,7 @@ Future<DartHooksResult> _runDartHooks({
534539
required List<AssetBuildTarget> targets,
535540
required Uri projectUri,
536541
required bool linkingEnabled,
542+
File? recordedUsesFile,
537543
}) async {
538544
final buildStart = DateTime.now();
539545

@@ -559,7 +565,7 @@ Future<DartHooksResult> _runDartHooks({
559565

560566
LinkResult? linkResult;
561567
if (linkingEnabled) {
562-
linkResult = await _link(buildRunner, extensions, buildResult);
568+
linkResult = await _link(buildRunner, extensions, buildResult, recordedUsesFile);
563569
if (target is CodeAssetTarget) {
564570
codeAssets.addAll(
565571
_filterCodeAssets(
@@ -635,10 +641,12 @@ Future<LinkResult> _link(
635641
FlutterNativeAssetsBuildRunner buildRunner,
636642
List<ProtocolExtension> extensions,
637643
BuildResult buildResult,
644+
File? recordedUsesFile,
638645
) async {
639646
final LinkResult? linkResult = await buildRunner.link(
640647
extensions: extensions,
641648
buildResult: buildResult,
649+
recordedUsesFile: recordedUsesFile,
642650
);
643651
if (linkResult == null) {
644652
_throwNativeAssetsLinkFailed();

‎packages/flutter_tools/test/integration.shard/isolated/record_use_test.dart‎

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ void main() {
6868
});
6969

7070
// TODO(dcharkes): Implement record-use in Flutter, this number should be two.
71-
const expectedTranslationCount = 4;
71+
const expectedTranslationCount = 2;
7272

7373
group('record use', () {
7474
// This test relies on running the flutter app and capturing `print()`s
@@ -114,10 +114,6 @@ void main() {
114114
['web'],
115115
['web', '--wasm'],
116116
]) {
117-
if (target.first == 'web') {
118-
// TODO(dcharkes): Fix compiler crash in dart2js, https://github.com/dart-lang/sdk/issues/63131.
119-
continue;
120-
}
121117
testWithoutContext('flutter build ${target.join(' ')} --release', () async {
122118
final ProcessTestResult result = await runFlutter(
123119
<String>['build', '-v', ...target, '--release'],

0 commit comments

Comments
 (0)