diff --git a/packages/flutter_tools/bin/tool_backend.dart b/packages/flutter_tools/bin/tool_backend.dart index 813a3e8ff5..ee1e61cd53 100644 --- a/packages/flutter_tools/bin/tool_backend.dart +++ b/packages/flutter_tools/bin/tool_backend.dart @@ -56,7 +56,6 @@ or ]); final String bundlePlatform = targetPlatform == 'windows-x64' ? 'windows' : 'linux'; final String target = '${buildMode}_bundle_${bundlePlatform}_assets'; - final Process assembleProcess = await Process.start( flutterExecutable, [ diff --git a/packages/flutter_tools/lib/src/android/gradle.dart b/packages/flutter_tools/lib/src/android/gradle.dart index 026061cc0e..1a3dd4b0e0 100644 --- a/packages/flutter_tools/lib/src/android/gradle.dart +++ b/packages/flutter_tools/lib/src/android/gradle.dart @@ -308,15 +308,8 @@ Future buildGradleApp({ if (target != null) { command.add('-Ptarget=$target'); } - assert(buildInfo.trackWidgetCreation != null); - command.add('-Ptrack-widget-creation=${buildInfo.trackWidgetCreation}'); + command.addAll(androidBuildInfo.buildInfo.toGradleConfig()); - if (buildInfo.extraFrontEndOptions != null) { - command.add('-Pextra-front-end-options=${encodeDartDefines(buildInfo.extraFrontEndOptions)}'); - } - if (buildInfo.extraGenSnapshotOptions != null) { - command.add('-Pextra-gen-snapshot-options=${encodeDartDefines(buildInfo.extraGenSnapshotOptions)}'); - } if (buildInfo.fileSystemRoots != null && buildInfo.fileSystemRoots.isNotEmpty) { command.add('-Pfilesystem-roots=${buildInfo.fileSystemRoots.join('|')}'); } @@ -326,9 +319,6 @@ Future buildGradleApp({ if (androidBuildInfo.splitPerAbi) { command.add('-Psplit-per-abi=true'); } - if (androidBuildInfo.buildInfo.dartDefines?.isNotEmpty ?? false) { - command.add('-Pdart-defines=${encodeDartDefines(androidBuildInfo.buildInfo.dartDefines)}'); - } if (shouldBuildPluginAsAar) { // Pass a system flag instead of a project flag, so this flag can be // read from include_flutter.groovy. @@ -339,24 +329,6 @@ Future buildGradleApp({ if (androidBuildInfo.fastStart) { command.add('-Pfast-start=true'); } - if (androidBuildInfo.buildInfo.splitDebugInfoPath != null) { - command.add('-Psplit-debug-info=${androidBuildInfo.buildInfo.splitDebugInfoPath}'); - } - if (androidBuildInfo.buildInfo.treeShakeIcons) { - command.add('-Ptree-shake-icons=true'); - } - if (androidBuildInfo.buildInfo.dartObfuscation) { - command.add('-Pdart-obfuscation=true'); - } - if (androidBuildInfo.buildInfo.bundleSkSLPath != null) { - command.add('-Pbundle-sksl-path=${androidBuildInfo.buildInfo.bundleSkSLPath}'); - } - if (androidBuildInfo.buildInfo.performanceMeasurementFile != null) { - command.add('-Pperformance-measurement-file=${androidBuildInfo.buildInfo.performanceMeasurementFile}'); - } - if (buildInfo.codeSizeDirectory != null) { - command.add('-Pcode-size-directory=${buildInfo.codeSizeDirectory}'); - } command.add(assembleTask); GradleHandledError detectedGradleError; @@ -611,18 +583,12 @@ Future buildGradleAar({ if (target != null && target.isNotEmpty) { command.add('-Ptarget=$target'); } - if (buildInfo.splitDebugInfoPath != null) { - command.add('-Psplit-debug-info=${buildInfo.splitDebugInfoPath}'); - } - if (buildInfo.treeShakeIcons) { - command.add('-Pfont-subset=true'); - } - if (buildInfo.dartObfuscation) { - if (buildInfo.mode == BuildMode.debug || buildInfo.mode == BuildMode.profile) { - globals.printStatus('Dart obfuscation is not supported in ${toTitleCase(buildInfo.friendlyModeName)} mode, building as un-obfuscated.'); - } else { - command.add('-Pdart-obfuscation=true'); - } + command.addAll(androidBuildInfo.buildInfo.toGradleConfig()); + if (buildInfo.dartObfuscation && buildInfo.mode != BuildMode.release) { + globals.printStatus( + 'Dart obfuscation is not supported in ${toTitleCase(buildInfo.friendlyModeName)}' + ' mode, building as un-obfuscated.', + ); } if (globals.artifacts is LocalEngineArtifacts) { diff --git a/packages/flutter_tools/lib/src/build_info.dart b/packages/flutter_tools/lib/src/build_info.dart index b24033a603..c0fa736713 100644 --- a/packages/flutter_tools/lib/src/build_info.dart +++ b/packages/flutter_tools/lib/src/build_info.dart @@ -13,6 +13,7 @@ import 'base/file_system.dart'; import 'base/logger.dart'; import 'base/utils.dart'; import 'build_system/targets/icon_tree_shaker.dart'; +import 'convert.dart'; import 'globals.dart' as globals; /// Information about a build to be performed or used. @@ -192,9 +193,9 @@ class BuildInfo { if (dartObfuscation != null) 'DART_OBFUSCATION': dartObfuscation.toString(), if (extraFrontEndOptions?.isNotEmpty ?? false) - 'EXTRA_FRONT_END_OPTIONS': encodeDartDefines(extraFrontEndOptions), + 'EXTRA_FRONT_END_OPTIONS': extraFrontEndOptions?.join(','), if (extraGenSnapshotOptions?.isNotEmpty ?? false) - 'EXTRA_GEN_SNAPSHOT_OPTIONS': encodeDartDefines(extraGenSnapshotOptions), + 'EXTRA_GEN_SNAPSHOT_OPTIONS': extraGenSnapshotOptions?.join(','), if (splitDebugInfoPath != null) 'SPLIT_DEBUG_INFO': splitDebugInfoPath, if (trackWidgetCreation != null) @@ -211,6 +212,34 @@ class BuildInfo { 'CODE_SIZE_DIRECTORY': codeSizeDirectory, }; } + + /// Convert this config to a series of project level arguments to be passed + /// on the command line to gradle. + List toGradleConfig() { + // PACKAGE_CONFIG not currently supported. + return [ + if (dartDefines?.isNotEmpty ?? false) + '-Pdart-defines=${encodeDartDefines(dartDefines)}', + if (dartObfuscation != null) + '-Pdart-obfuscation=$dartObfuscation', + if (extraFrontEndOptions?.isNotEmpty ?? false) + '-Pextra-front-end-options=${extraFrontEndOptions?.join(',')}', + if (extraGenSnapshotOptions?.isNotEmpty ?? false) + '-Pextra-gen-snapshot-options=${extraGenSnapshotOptions?.join(',')}', + if (splitDebugInfoPath != null) + '-Psplit-debug-info=$splitDebugInfoPath', + if (trackWidgetCreation != null) + '-Ptrack-widget-creation=$trackWidgetCreation', + if (treeShakeIcons != null) + '-Ptree-shake-icons=$treeShakeIcons', + if (performanceMeasurementFile != null) + '-Pperformance-measurement-file=$performanceMeasurementFile', + if (bundleSkSLPath != null) + '-Pbundle-sksl-path=$bundleSkSLPath', + if (codeSizeDirectory != null) + '-Pcode-size-directory=$codeSizeDirectory', + ]; + } } /// Information about an Android build to be performed or used. @@ -737,9 +766,32 @@ String getFuchsiaBuildDirectory() { /// These values are URI-encoded and then combined into a comma-separated string. const String kDartDefines = 'DartDefines'; -/// Encode a List of dart defines in a URI string. +final Converter _defineEncoder = utf8.encoder.fuse(base64.encoder); +final Converter _defineDecoder = base64.decoder.fuse(utf8.decoder); + +/// Encode a List of dart defines in a base64 string. +/// +/// This encoding does not include `,`, which is used to distinguish +/// the individual entries, nor does it include `%` which is often a +/// control character on windows command lines. +/// +/// When decoding this string, it can be safely split on commas, since any +/// user provided commans will still be encoded. +/// +/// If the presence of the `/` character ends up being an issue, this can +/// be changed to use base32 instead. String encodeDartDefines(List defines) { - return defines.map(Uri.encodeComponent).join(','); + return defines.map(_defineEncoder.convert).join(','); +} + +List decodeCommaSeparated(Map environmentDefines, String key) { + if (!environmentDefines.containsKey(key) || environmentDefines[key].isEmpty) { + return []; + } + return environmentDefines[key] + .split(',') + .cast() + .toList(); } /// Dart defines are encoded inside [environmentDefines] as a comma-separated list. @@ -749,7 +801,7 @@ List decodeDartDefines(Map environmentDefines, String ke } return environmentDefines[key] .split(',') - .map(Uri.decodeComponent) + .map(_defineDecoder.convert) .cast() .toList(); } diff --git a/packages/flutter_tools/lib/src/build_system/targets/android.dart b/packages/flutter_tools/lib/src/build_system/targets/android.dart index 6b03abf9bb..e7d4e3cd9e 100644 --- a/packages/flutter_tools/lib/src/build_system/targets/android.dart +++ b/packages/flutter_tools/lib/src/build_system/targets/android.dart @@ -215,7 +215,7 @@ class AndroidAot extends AotElfBase { if (!output.existsSync()) { output.createSync(recursive: true); } - final List extraGenSnapshotOptions = decodeDartDefines(environment.defines, kExtraGenSnapshotOptions); + final List extraGenSnapshotOptions = decodeCommaSeparated(environment.defines, kExtraGenSnapshotOptions); final BuildMode buildMode = getBuildModeForName(environment.defines[kBuildMode]); final bool dartObfuscation = environment.defines[kDartObfuscation] == 'true'; final String codeSizeDirectory = environment.defines[kCodeSizeDirectory]; diff --git a/packages/flutter_tools/lib/src/build_system/targets/common.dart b/packages/flutter_tools/lib/src/build_system/targets/common.dart index a9803a87b3..2511413e31 100644 --- a/packages/flutter_tools/lib/src/build_system/targets/common.dart +++ b/packages/flutter_tools/lib/src/build_system/targets/common.dart @@ -227,7 +227,7 @@ class KernelSnapshot extends Target { final TargetPlatform targetPlatform = getTargetPlatformForName(environment.defines[kTargetPlatform]); // This configuration is all optional. - final List extraFrontEndOptions = decodeDartDefines(environment.defines, kExtraFrontEndOptions); + final List extraFrontEndOptions = decodeCommaSeparated(environment.defines, kExtraFrontEndOptions); final List fileSystemRoots = environment.defines[kFileSystemRoots]?.split(','); final String fileSystemScheme = environment.defines[kFileSystemScheme]; @@ -306,7 +306,7 @@ abstract class AotElfBase extends Target { if (environment.defines[kTargetPlatform] == null) { throw MissingDefineException(kTargetPlatform, 'aot_elf'); } - final List extraGenSnapshotOptions = decodeDartDefines(environment.defines, kExtraGenSnapshotOptions); + final List extraGenSnapshotOptions = decodeCommaSeparated(environment.defines, kExtraGenSnapshotOptions); final BuildMode buildMode = getBuildModeForName(environment.defines[kBuildMode]); final TargetPlatform targetPlatform = getTargetPlatformForName(environment.defines[kTargetPlatform]); final String splitDebugInfo = environment.defines[kSplitDebugInfo]; diff --git a/packages/flutter_tools/lib/src/build_system/targets/ios.dart b/packages/flutter_tools/lib/src/build_system/targets/ios.dart index 24f0dd16ac..61d71be37a 100644 --- a/packages/flutter_tools/lib/src/build_system/targets/ios.dart +++ b/packages/flutter_tools/lib/src/build_system/targets/ios.dart @@ -54,7 +54,7 @@ abstract class AotAssemblyBase extends Target { throw MissingDefineException(kSdkRoot, 'aot_assembly'); } - final List extraGenSnapshotOptions = decodeDartDefines(environment.defines, kExtraGenSnapshotOptions); + final List extraGenSnapshotOptions = decodeCommaSeparated(environment.defines, kExtraGenSnapshotOptions); final bool bitcode = environment.defines[kBitcodeFlag] == 'true'; final BuildMode buildMode = getBuildModeForName(environment.defines[kBuildMode]); final TargetPlatform targetPlatform = getTargetPlatformForName(environment.defines[kTargetPlatform]); diff --git a/packages/flutter_tools/lib/src/build_system/targets/macos.dart b/packages/flutter_tools/lib/src/build_system/targets/macos.dart index 7621d1e72e..c5e849e928 100644 --- a/packages/flutter_tools/lib/src/build_system/targets/macos.dart +++ b/packages/flutter_tools/lib/src/build_system/targets/macos.dart @@ -180,7 +180,7 @@ class CompileMacOSFramework extends Target { final String codeSizeDirectory = environment.defines[kCodeSizeDirectory]; final String splitDebugInfo = environment.defines[kSplitDebugInfo]; final bool dartObfuscation = environment.defines[kDartObfuscation] == 'true'; - final List extraGenSnapshotOptions = decodeDartDefines(environment.defines, kExtraGenSnapshotOptions); + final List extraGenSnapshotOptions = decodeCommaSeparated(environment.defines, kExtraGenSnapshotOptions); if (codeSizeDirectory != null) { final File codeSizeFile = environment.fileSystem 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 2fe6288a0d..c2eaaf228a 100644 --- a/packages/flutter_tools/lib/src/build_system/targets/web.dart +++ b/packages/flutter_tools/lib/src/build_system/targets/web.dart @@ -202,7 +202,7 @@ class Dart2JSTarget extends Target { '--disable-dart-dev', globals.artifacts.getArtifactPath(Artifact.dart2jsSnapshot), '--libraries-spec=${globals.fs.path.join(globals.artifacts.getArtifactPath(Artifact.flutterWebSdk), 'libraries.json')}', - ...?decodeDartDefines(environment.defines, kExtraFrontEndOptions), + ...?decodeCommaSeparated(environment.defines, kExtraFrontEndOptions), if (nativeNullAssertions) '--native-null-assertions', if (buildMode == BuildMode.profile) diff --git a/packages/flutter_tools/lib/src/commands/build_ios_framework.dart b/packages/flutter_tools/lib/src/commands/build_ios_framework.dart index 561dcc7c40..f650b0955d 100644 --- a/packages/flutter_tools/lib/src/commands/build_ios_framework.dart +++ b/packages/flutter_tools/lib/src/commands/build_ios_framework.dart @@ -20,7 +20,6 @@ import '../build_system/targets/common.dart'; import '../build_system/targets/icon_tree_shaker.dart'; import '../build_system/targets/ios.dart'; import '../cache.dart'; -import '../convert.dart'; import '../globals.dart' as globals; import '../macos/cocoapod_utils.dart'; import '../plugins.dart'; @@ -367,7 +366,7 @@ end kBuildMode: getNameForBuildMode(buildInfo.mode), kTargetPlatform: getNameForTargetPlatform(TargetPlatform.ios), kIconTreeShakerFlag: buildInfo.treeShakeIcons.toString(), - kDartDefines: jsonEncode(buildInfo.dartDefines), + kDartDefines: encodeDartDefines(buildInfo.dartDefines), kBitcodeFlag: 'true', if (buildInfo?.extraGenSnapshotOptions?.isNotEmpty ?? false) kExtraGenSnapshotOptions: diff --git a/packages/flutter_tools/lib/src/web/compile.dart b/packages/flutter_tools/lib/src/web/compile.dart index 6038971d34..4edfb19441 100644 --- a/packages/flutter_tools/lib/src/web/compile.dart +++ b/packages/flutter_tools/lib/src/web/compile.dart @@ -58,7 +58,7 @@ Future buildWeb( if (serviceWorkerStrategy != null) kServiceWorkerStrategy: serviceWorkerStrategy, if (buildInfo.extraFrontEndOptions?.isNotEmpty ?? false) - kExtraFrontEndOptions: encodeDartDefines(buildInfo.extraFrontEndOptions), + kExtraFrontEndOptions: buildInfo.extraFrontEndOptions.join(','), }, artifacts: globals.artifacts, fileSystem: globals.fs, diff --git a/packages/flutter_tools/test/commands.shard/hermetic/build_linux_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/build_linux_test.dart index 3ef45eda71..e614b936f6 100644 --- a/packages/flutter_tools/test/commands.shard/hermetic/build_linux_test.dart +++ b/packages/flutter_tools/test/commands.shard/hermetic/build_linux_test.dart @@ -368,10 +368,10 @@ ERROR: No file or variants found for asset: images/a_dot_burr.jpeg expect(configLines, containsAll([ 'file(TO_CMAKE_PATH "$_kTestFlutterRoot" FLUTTER_ROOT)', 'file(TO_CMAKE_PATH "${fileSystem.currentDirectory.path}" PROJECT_DIR)', - ' "DART_DEFINES=foo.bar%3D2,fizz.far%3D3"', + ' "DART_DEFINES=Zm9vLmJhcj0y,Zml6ei5mYXI9Mw=="', ' "DART_OBFUSCATION=true"', - ' "EXTRA_FRONT_END_OPTIONS=--enable-experiment%3Dnon-nullable"', - ' "EXTRA_GEN_SNAPSHOT_OPTIONS=--enable-experiment%3Dnon-nullable"', + ' "EXTRA_FRONT_END_OPTIONS=--enable-experiment=non-nullable"', + ' "EXTRA_GEN_SNAPSHOT_OPTIONS=--enable-experiment=non-nullable"', ' "SPLIT_DEBUG_INFO=foo/"', ' "TRACK_WIDGET_CREATION=true"', ' "TREE_SHAKE_ICONS=true"', diff --git a/packages/flutter_tools/test/commands.shard/hermetic/build_macos_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/build_macos_test.dart index d42e24f539..72c15d0681 100644 --- a/packages/flutter_tools/test/commands.shard/hermetic/build_macos_test.dart +++ b/packages/flutter_tools/test/commands.shard/hermetic/build_macos_test.dart @@ -257,16 +257,21 @@ void main() { .readAsLinesSync(); expect(contents, containsAll([ - 'DART_DEFINES=foo.bar%3D2,fizz.far%3D3', + 'FLUTTER_APPLICATION_PATH=/', + 'FLUTTER_TARGET=lib/other.dart', + 'FLUTTER_BUILD_DIR=build', + 'FLUTTER_BUILD_NAME=1.0.0', + 'FLUTTER_BUILD_NUMBER=1', + 'EXCLUDED_ARCHS=arm64', + 'DART_DEFINES=Zm9vLmJhcj0y,Zml6ei5mYXI9Mw==', 'DART_OBFUSCATION=true', - 'EXTRA_FRONT_END_OPTIONS=--enable-experiment%3Dnon-nullable', - 'EXTRA_GEN_SNAPSHOT_OPTIONS=--enable-experiment%3Dnon-nullable', + 'EXTRA_FRONT_END_OPTIONS=--enable-experiment=non-nullable', + 'EXTRA_GEN_SNAPSHOT_OPTIONS=--enable-experiment=non-nullable', 'SPLIT_DEBUG_INFO=foo/', 'TRACK_WIDGET_CREATION=true', 'TREE_SHAKE_ICONS=true', - 'FLUTTER_TARGET=lib/other.dart', 'BUNDLE_SKSL_PATH=foo/bar.sksl.json', - 'EXCLUDED_ARCHS=arm64', + 'PACKAGE_CONFIG=/.dart_tool/package_config.json' ])); }, overrides: { FileSystem: () => fileSystem, diff --git a/packages/flutter_tools/test/commands.shard/hermetic/build_windows_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/build_windows_test.dart index b577778349..06b06a311f 100644 --- a/packages/flutter_tools/test/commands.shard/hermetic/build_windows_test.dart +++ b/packages/flutter_tools/test/commands.shard/hermetic/build_windows_test.dart @@ -317,10 +317,10 @@ C:\foo\windows\runner\main.cpp(17,1): error C2065: 'Baz': undeclared identifier expect(configLines, containsAll([ r'file(TO_CMAKE_PATH "C:\\flutter" FLUTTER_ROOT)', r'file(TO_CMAKE_PATH "C:\\" PROJECT_DIR)', - r' "DART_DEFINES=foo%3Da,bar%3Db"', + r' "DART_DEFINES=Zm9vPWE=,YmFyPWI="', r' "DART_OBFUSCATION=true"', - r' "EXTRA_FRONT_END_OPTIONS=--enable-experiment%3Dnon-nullable"', - r' "EXTRA_GEN_SNAPSHOT_OPTIONS=--enable-experiment%3Dnon-nullable"', + r' "EXTRA_FRONT_END_OPTIONS=--enable-experiment=non-nullable"', + r' "EXTRA_GEN_SNAPSHOT_OPTIONS=--enable-experiment=non-nullable"', r' "SPLIT_DEBUG_INFO=C:\\foo\\"', r' "TRACK_WIDGET_CREATION=true"', r' "TREE_SHAKE_ICONS=true"', diff --git a/packages/flutter_tools/test/commands.shard/permeable/build_apk_test.dart b/packages/flutter_tools/test/commands.shard/permeable/build_apk_test.dart index 2fe05d1b3f..4984b8b43c 100644 --- a/packages/flutter_tools/test/commands.shard/permeable/build_apk_test.dart +++ b/packages/flutter_tools/test/commands.shard/permeable/build_apk_test.dart @@ -237,6 +237,7 @@ void main() { '-q', '-Ptarget-platform=android-arm,android-arm64,android-x64', '-Ptarget=${globals.fs.path.join(tempDir.path, 'flutter_project', 'lib', 'main.dart')}', + '-Pdart-obfuscation=false', '-Ptrack-widget-creation=true', '-Ptree-shake-icons=true', 'assembleRelease', @@ -265,8 +266,9 @@ void main() { '-q', '-Ptarget-platform=android-arm,android-arm64,android-x64', '-Ptarget=${globals.fs.path.join(tempDir.path, 'flutter_project', 'lib', 'main.dart')}', - '-Ptrack-widget-creation=true', + '-Pdart-obfuscation=false', '-Psplit-debug-info=${tempDir.path}', + '-Ptrack-widget-creation=true', '-Ptree-shake-icons=true', 'assembleRelease', ], @@ -297,8 +299,9 @@ void main() { '-q', '-Ptarget-platform=android-arm,android-arm64,android-x64', '-Ptarget=${globals.fs.path.join(tempDir.path, 'flutter_project', 'lib', 'main.dart')}', - '-Ptrack-widget-creation=true', + '-Pdart-obfuscation=false', '-Pextra-front-end-options=foo,bar', + '-Ptrack-widget-creation=true', '-Ptree-shake-icons=true', 'assembleRelease', ], @@ -329,6 +332,7 @@ void main() { '-q', '-Ptarget-platform=android-arm,android-arm64,android-x64', '-Ptarget=${globals.fs.path.join(tempDir.path, 'flutter_project', 'lib', 'main.dart')}', + '-Pdart-obfuscation=false', '-Ptrack-widget-creation=true', '-Ptree-shake-icons=true', 'assembleRelease', @@ -353,6 +357,7 @@ void main() { '-q', '-Ptarget-platform=android-arm,android-arm64,android-x64', '-Ptarget=${globals.fs.path.join(tempDir.path, 'flutter_project', 'lib', 'main.dart')}', + '-Pdart-obfuscation=false', '-Ptrack-widget-creation=true', '-Ptree-shake-icons=true', 'assembleRelease', @@ -422,6 +427,7 @@ void main() { '-q', '-Ptarget-platform=android-arm,android-arm64,android-x64', '-Ptarget=${globals.fs.path.join(tempDir.path, 'flutter_project', 'lib', 'main.dart')}', + '-Pdart-obfuscation=false', '-Ptrack-widget-creation=true', '-Ptree-shake-icons=true', 'assembleRelease', @@ -481,6 +487,7 @@ void main() { '-q', '-Ptarget-platform=android-arm,android-arm64,android-x64', '-Ptarget=${globals.fs.path.join(tempDir.path, 'flutter_project', 'lib', 'main.dart')}', + '-Pdart-obfuscation=false', '-Ptrack-widget-creation=true', '-Ptree-shake-icons=true', 'assembleRelease', diff --git a/packages/flutter_tools/test/general.shard/android/gradle_test.dart b/packages/flutter_tools/test/general.shard/android/gradle_test.dart index 24a19002dc..c7dfa2ba10 100644 --- a/packages/flutter_tools/test/general.shard/android/gradle_test.dart +++ b/packages/flutter_tools/test/general.shard/android/gradle_test.dart @@ -916,7 +916,9 @@ plugin2=${plugin2.path} '-Pis-plugin=true', '-PbuildNumber=1.0', '-q', - '-Pfont-subset=true', + '-Pdart-obfuscation=false', + '-Ptrack-widget-creation=false', + '-Ptree-shake-icons=true', '-Ptarget-platform=android-arm,android-arm64,android-x64', 'assembleAarRelease', ], @@ -931,7 +933,9 @@ plugin2=${plugin2.path} '-Pis-plugin=true', '-PbuildNumber=1.0', '-q', - '-Pfont-subset=true', + '-Pdart-obfuscation=false', + '-Ptrack-widget-creation=false', + '-Ptree-shake-icons=true', '-Ptarget-platform=android-arm,android-arm64,android-x64', 'assembleAarRelease', ], @@ -2103,7 +2107,9 @@ plugin1=${plugin1.path} '--no-daemon', '-Ptarget-platform=android-arm,android-arm64,android-x64', '-Ptarget=lib/main.dart', + '-Pdart-obfuscation=false', '-Ptrack-widget-creation=false', + '-Ptree-shake-icons=false', 'assembleRelease' ], )); diff --git a/packages/flutter_tools/test/general.shard/build_info_test.dart b/packages/flutter_tools/test/general.shard/build_info_test.dart index c4c116c176..64b8bda1af 100644 --- a/packages/flutter_tools/test/general.shard/build_info_test.dart +++ b/packages/flutter_tools/test/general.shard/build_info_test.dart @@ -115,40 +115,67 @@ void main() { expect(buildInfo.toEnvironmentConfig(), { 'TREE_SHAKE_ICONS': 'true', 'TRACK_WIDGET_CREATION': 'true', - 'DART_DEFINES': 'foo%3D2,bar%3D2', + 'DART_DEFINES': 'Zm9vPTI=,YmFyPTI=', 'DART_OBFUSCATION': 'true', 'SPLIT_DEBUG_INFO': 'foo/', - 'EXTRA_FRONT_END_OPTIONS': '--enable-experiment%3Dnon-nullable,bar', - 'EXTRA_GEN_SNAPSHOT_OPTIONS': '--enable-experiment%3Dnon-nullable,fizz', + 'EXTRA_FRONT_END_OPTIONS': '--enable-experiment=non-nullable,bar', + 'EXTRA_GEN_SNAPSHOT_OPTIONS': '--enable-experiment=non-nullable,fizz', 'BUNDLE_SKSL_PATH': 'foo/bar/baz.sksl.json', 'PACKAGE_CONFIG': 'foo/.packages', 'CODE_SIZE_DIRECTORY': 'foo/code-size', }); }); - testWithoutContext('encodeDartDefines encodes define values with URI encode compnents', () { - expect(encodeDartDefines(['"hello"']), '%22hello%22'); - expect(encodeDartDefines(['https://www.google.com']), 'https%3A%2F%2Fwww.google.com'); - expect(encodeDartDefines(['2,3,4', '5']), '2%2C3%2C4,5'); - expect(encodeDartDefines(['true', 'false', 'flase']), 'true,false,flase'); - expect(encodeDartDefines(['1232,456', '2']), '1232%2C456,2'); + testWithoutContext('toGradleConfig encoding of standard values', () { + const BuildInfo buildInfo = BuildInfo(BuildMode.debug, '', + treeShakeIcons: true, + trackWidgetCreation: true, + dartDefines: ['foo=2', 'bar=2'], + dartObfuscation: true, + splitDebugInfoPath: 'foo/', + extraFrontEndOptions: ['--enable-experiment=non-nullable', 'bar'], + extraGenSnapshotOptions: ['--enable-experiment=non-nullable', 'fizz'], + bundleSkSLPath: 'foo/bar/baz.sksl.json', + packagesPath: 'foo/.packages', + codeSizeDirectory: 'foo/code-size', + ); + + expect(buildInfo.toGradleConfig(), [ + '-Pdart-defines=Zm9vPTI=,YmFyPTI=', + '-Pdart-obfuscation=true', + '-Pextra-front-end-options=--enable-experiment=non-nullable,bar', + '-Pextra-gen-snapshot-options=--enable-experiment=non-nullable,fizz', + '-Psplit-debug-info=foo/', + '-Ptrack-widget-creation=true', + '-Ptree-shake-icons=true', + '-Pbundle-sksl-path=foo/bar/baz.sksl.json', + '-Pcode-size-directory=foo/code-size' + ]); }); - testWithoutContext('decodeDartDefines decodes URI encoded dart defines', () { + testWithoutContext('encodeDartDefines encodes define values with base64 encoded compnents', () { + expect(encodeDartDefines(['"hello"']), 'ImhlbGxvIg=='); + expect(encodeDartDefines(['https://www.google.com']), 'aHR0cHM6Ly93d3cuZ29vZ2xlLmNvbQ=='); + expect(encodeDartDefines(['2,3,4', '5']), 'MiwzLDQ=,NQ=='); + expect(encodeDartDefines(['true', 'false', 'flase']), 'dHJ1ZQ==,ZmFsc2U=,Zmxhc2U='); + expect(encodeDartDefines(['1232,456', '2']), 'MTIzMiw0NTY=,Mg=='); + }); + + testWithoutContext('decodeDartDefines decodes base64 encoded dart defines', () { expect(decodeDartDefines({ - kDartDefines: '%22hello%22' + kDartDefines: 'ImhlbGxvIg==' }, kDartDefines), ['"hello"']); expect(decodeDartDefines({ - kDartDefines: 'https%3A%2F%2Fwww.google.com' + kDartDefines: 'aHR0cHM6Ly93d3cuZ29vZ2xlLmNvbQ==' }, kDartDefines), ['https://www.google.com']); expect(decodeDartDefines({ - kDartDefines: '2%2C3%2C4,5' + kDartDefines: 'MiwzLDQ=,NQ==' }, kDartDefines), ['2,3,4', '5']); expect(decodeDartDefines({ - kDartDefines: 'true,false,flase' + kDartDefines: 'dHJ1ZQ==,ZmFsc2U=,Zmxhc2U=' }, kDartDefines), ['true', 'false', 'flase']); expect(decodeDartDefines({ - kDartDefines: '1232%2C456,2' + kDartDefines: 'MTIzMiw0NTY=,Mg==' }, kDartDefines), ['1232,456', '2']); }); } 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 188d501f4b..60201dbb55 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 @@ -481,7 +481,7 @@ void main() { test('Dart2JSTarget calls dart2js with Dart defines in release mode', () => testbed.run(() async { environment.defines[kBuildMode] = 'release'; - environment.defines[kDartDefines] = 'FOO=bar,BAZ=qux'; + environment.defines[kDartDefines] = encodeDartDefines(['FOO=bar', 'BAZ=qux']); processManager.addCommand(FakeCommand( command: [ ...kDart2jsLinuxArgs, @@ -548,7 +548,7 @@ void main() { test('Dart2JSTarget calls dart2js with Dart defines in profile mode', () => testbed.run(() async { environment.defines[kBuildMode] = 'profile'; - environment.defines[kDartDefines] = 'FOO=bar,BAZ=qux'; + environment.defines[kDartDefines] = encodeDartDefines(['FOO=bar', 'BAZ=qux']); processManager.addCommand(FakeCommand( command: [ ...kDart2jsLinuxArgs,