From 616a0260feed4e726b46475623aa344434a404a4 Mon Sep 17 00:00:00 2001 From: Martin Kustermann Date: Tue, 27 Feb 2024 21:21:42 +0100 Subject: [PATCH] [web] Make flutter web profile builds always keep wasm symbols (#144130) So far `flutter build web --wasm` was always stripping wasm symbols except if `--no-strip-wasm` is passed. => Ensure that in profile mode we also keep the symbols --- .../lib/src/build_system/targets/web.dart | 5 +- .../lib/src/web/compiler_config.dart | 9 +- .../build_system/targets/web_test.dart | 82 ++++++++++--------- 3 files changed, 50 insertions(+), 46 deletions(-) diff --git a/packages/flutter_tools/lib/src/build_system/targets/web.dart b/packages/flutter_tools/lib/src/build_system/targets/web.dart index 626ebd00659..2b66ffaf5b2 100644 --- a/packages/flutter_tools/lib/src/build_system/targets/web.dart +++ b/packages/flutter_tools/lib/src/build_system/targets/web.dart @@ -196,8 +196,7 @@ class Dart2JSTarget extends Dart2WebTarget { throwOnError: true, [ ...sharedCommandOptions, - if (buildMode == BuildMode.profile) '--no-minify', - ...compilerConfig.toCommandOptions(), + ...compilerConfig.toCommandOptions(buildMode), '-o', outputJSFile.path, environment.buildDir.childFile('app.dill').path, // dartfile @@ -279,7 +278,7 @@ class Dart2WasmTarget extends Dart2WebTarget { '-D$dartDefine', '--extra-compiler-option=--depfile=${depFile.path}', - ...compilerConfig.toCommandOptions(), + ...compilerConfig.toCommandOptions(buildMode), '-o', outputWasmFile.path, environment.buildDir.childFile('main.dart').path, // dartfile diff --git a/packages/flutter_tools/lib/src/web/compiler_config.dart b/packages/flutter_tools/lib/src/web/compiler_config.dart index d99f4357d81..79206ad2381 100644 --- a/packages/flutter_tools/lib/src/web/compiler_config.dart +++ b/packages/flutter_tools/lib/src/web/compiler_config.dart @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import '../build_info.dart' show BuildMode; import '../convert.dart'; import 'compile.dart'; @@ -106,7 +107,8 @@ class JsCompilerConfig extends WebCompilerConfig { /// Arguments to use in the full JS compile, but not CFE-only. /// /// Includes the contents of [toSharedCommandOptions]. - List toCommandOptions() => [ + List toCommandOptions(BuildMode buildMode) => [ + if (buildMode == BuildMode.profile) '--no-minify', ...toSharedCommandOptions(), '-O$optimizationLevel', if (dumpInfo) '--dump-info', @@ -145,10 +147,11 @@ class WasmCompilerConfig extends WebCompilerConfig { @override CompileTarget get compileTarget => CompileTarget.wasm; - List toCommandOptions() { + List toCommandOptions(BuildMode buildMode) { + final bool stripSymbols = buildMode == BuildMode.release && stripWasm; return [ '-O$optimizationLevel', - '--${stripWasm? 'no-' : ''}name-section', + '--${stripSymbols ? 'no-' : ''}name-section', ]; } diff --git a/packages/flutter_tools/test/general.shard/build_system/targets/web_test.dart b/packages/flutter_tools/test/general.shard/build_system/targets/web_test.dart index 3fb3c81e5a6..4c2bd93d438 100644 --- a/packages/flutter_tools/test/general.shard/build_system/targets/web_test.dart +++ b/packages/flutter_tools/test/general.shard/build_system/targets/web_test.dart @@ -904,54 +904,56 @@ void main() { for (int level = 1; level <= 4; level++) { for (final bool strip in [true, false]) { for (final List defines in const >[[], ['FOO=bar', 'BAZ=qux']]) { - test('Dart2WasmTarget invokes dart2wasm with renderer=$renderer, -O$level, stripping=$strip, defines=$defines', () => testbed.run(() async { - environment.defines[kBuildMode] = 'release'; - environment.defines[kDartDefines] = encodeDartDefines(defines); + for (final String buildMode in const ['profile', 'release']) { + test('Dart2WasmTarget invokes dart2wasm with renderer=$renderer, -O$level, stripping=$strip, defines=$defines, modeMode=$buildMode', () => testbed.run(() async { + environment.defines[kBuildMode] = buildMode; + environment.defines[kDartDefines] = encodeDartDefines(defines); - final File depFile = environment.buildDir.childFile('dart2wasm.d'); + final File depFile = environment.buildDir.childFile('dart2wasm.d'); - final File outputJsFile = environment.buildDir.childFile('main.dart.mjs'); - processManager.addCommand(FakeCommand( - command: [ - ..._kDart2WasmLinuxArgs, - if (renderer == WebRendererMode.skwasm) ...[ - '--extra-compiler-option=--import-shared-memory', - '--extra-compiler-option=--shared-memory-max-pages=32768', + final File outputJsFile = environment.buildDir.childFile('main.dart.mjs'); + processManager.addCommand(FakeCommand( + command: [ + ..._kDart2WasmLinuxArgs, + if (renderer == WebRendererMode.skwasm) ...[ + '--extra-compiler-option=--import-shared-memory', + '--extra-compiler-option=--shared-memory-max-pages=32768', + ], + '-Ddart.vm.${buildMode == 'release' ? 'product' : 'profile' }=true', + ...defines.map((String define) => '-D$define'), + if (renderer == WebRendererMode.skwasm) ...[ + '-DFLUTTER_WEB_AUTO_DETECT=false', + '-DFLUTTER_WEB_USE_SKIA=false', + '-DFLUTTER_WEB_USE_SKWASM=true', + ], + if (renderer == WebRendererMode.canvaskit) ...[ + '-DFLUTTER_WEB_AUTO_DETECT=false', + '-DFLUTTER_WEB_USE_SKIA=true', + ], + '--extra-compiler-option=--depfile=${depFile.absolute.path}', + '-O$level', + if (strip && buildMode == 'release') '--no-name-section' else '--name-section', + '-o', + environment.buildDir.childFile('main.dart.wasm').absolute.path, + environment.buildDir.childFile('main.dart').absolute.path, ], - '-Ddart.vm.product=true', - ...defines.map((String define) => '-D$define'), - if (renderer == WebRendererMode.skwasm) ...[ - '-DFLUTTER_WEB_AUTO_DETECT=false', - '-DFLUTTER_WEB_USE_SKIA=false', - '-DFLUTTER_WEB_USE_SKWASM=true', - ], - if (renderer == WebRendererMode.canvaskit) ...[ - '-DFLUTTER_WEB_AUTO_DETECT=false', - '-DFLUTTER_WEB_USE_SKIA=true', - ], - '--extra-compiler-option=--depfile=${depFile.absolute.path}', - '-O$level', - if (strip) '--no-name-section' else '--name-section', - '-o', - environment.buildDir.childFile('main.dart.wasm').absolute.path, - environment.buildDir.childFile('main.dart').absolute.path, - ], - onRun: (_) => outputJsFile..createSync()..writeAsStringSync('foo')) - ); + onRun: (_) => outputJsFile..createSync()..writeAsStringSync('foo')) + ); - await Dart2WasmTarget( - WasmCompilerConfig( - optimizationLevel: level, - stripWasm: strip, - renderer: renderer, - ) - ).build(environment); + await Dart2WasmTarget( + WasmCompilerConfig( + optimizationLevel: level, + stripWasm: strip, + renderer: renderer, + ) + ).build(environment); - expect(outputJsFile.existsSync(), isTrue); - }, overrides: { + expect(outputJsFile.existsSync(), isTrue); + }, overrides: { ProcessManager: () => processManager, })); } + } } } }