From 24bfc46d89f7e9c13405279da1bb67620ef5c5ca Mon Sep 17 00:00:00 2001 From: Jonah Williams Date: Thu, 20 May 2021 16:19:03 -0700 Subject: [PATCH] [flutter_tools] allow passing properties directly to gradle (#82941) --- packages/flutter_tools/lib/src/build_info.dart | 7 +++++++ .../lib/src/runner/flutter_command.dart | 13 +++++++++++++ .../test/general.shard/build_info_test.dart | 7 ++++++- 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/packages/flutter_tools/lib/src/build_info.dart b/packages/flutter_tools/lib/src/build_info.dart index bd92397febc..115e1d0f780 100644 --- a/packages/flutter_tools/lib/src/build_info.dart +++ b/packages/flutter_tools/lib/src/build_info.dart @@ -25,6 +25,7 @@ class BuildInfo { List? extraFrontEndOptions, List? extraGenSnapshotOptions, List? fileSystemRoots, + this.androidProjectArgs = const [], this.fileSystemScheme, this.buildNumber, this.buildName, @@ -142,6 +143,10 @@ class BuildInfo { /// The Gradle daemon may also be disabled in the Android application's properties file. final bool androidGradleDaemon; + /// Additional key value pairs that are passed directly to the gradle project via the `-P` + /// flag. + final List androidProjectArgs; + /// The package configuration for the loaded application. /// /// This is captured once during startup, but the actual package configuration @@ -276,6 +281,8 @@ class BuildInfo { '-Pbundle-sksl-path=$bundleSkSLPath', if (codeSizeDirectory != null) '-Pcode-size-directory=$codeSizeDirectory', + for (String projectArg in androidProjectArgs) + '-P$projectArg', ]; } } diff --git a/packages/flutter_tools/lib/src/runner/flutter_command.dart b/packages/flutter_tools/lib/src/runner/flutter_command.dart index 8714d1b6032..352f42f143e 100644 --- a/packages/flutter_tools/lib/src/runner/flutter_command.dart +++ b/packages/flutter_tools/lib/src/runner/flutter_command.dart @@ -118,6 +118,7 @@ class FlutterOptions { static const String kNullAssertions = 'null-assertions'; static const String kAndroidGradleDaemon = 'android-gradle-daemon'; static const String kDeferredComponents = 'deferred-components'; + static const String kAndroidProjectArgs = 'android-project-arg'; } abstract class FlutterCommand extends Command { @@ -768,6 +769,13 @@ abstract class FlutterCommand extends Command { defaultsTo: true, hide: hide, ); + argParser.addMultiOption( + FlutterOptions.kAndroidProjectArgs, + help: 'Additional arguments specified as key=value that are passed directly to the gradle ' + 'project via the -P flag. These can be accesed in build.gradle via the "project.property" API.', + splitCommas: false, + abbr: 'P', + ); } void addNativeNullAssertions({ bool hide = false }) { @@ -971,6 +979,10 @@ abstract class FlutterCommand extends Command { final bool androidGradleDaemon = !argParser.options.containsKey(FlutterOptions.kAndroidGradleDaemon) || boolArg(FlutterOptions.kAndroidGradleDaemon); + final List androidProjectArgs = argParser.options.containsKey(FlutterOptions.kAndroidProjectArgs) + ? stringsArg(FlutterOptions.kAndroidProjectArgs) + : []; + if (dartObfuscation && (splitDebugInfoPath == null || splitDebugInfoPath.isEmpty)) { throwToolExit( '"--${FlutterOptions.kDartObfuscationOption}" can only be used in ' @@ -1042,6 +1054,7 @@ abstract class FlutterCommand extends Command { codeSizeDirectory: codeSizeDirectory, androidGradleDaemon: androidGradleDaemon, packageConfig: packageConfig, + androidProjectArgs: androidProjectArgs, ); } 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 4e3ed538d62..fb19d501c6b 100644 --- a/packages/flutter_tools/test/general.shard/build_info_test.dart +++ b/packages/flutter_tools/test/general.shard/build_info_test.dart @@ -139,6 +139,8 @@ void main() { bundleSkSLPath: 'foo/bar/baz.sksl.json', packagesPath: 'foo/.packages', codeSizeDirectory: 'foo/code-size', + // These values are ignored by toEnvironmentConfig + androidProjectArgs: ['foo=bar', 'fizz=bazz'] ); expect(buildInfo.toEnvironmentConfig(), { @@ -167,6 +169,7 @@ void main() { bundleSkSLPath: 'foo/bar/baz.sksl.json', packagesPath: 'foo/.packages', codeSizeDirectory: 'foo/code-size', + androidProjectArgs: ['foo=bar', 'fizz=bazz'] ); expect(buildInfo.toGradleConfig(), [ @@ -178,7 +181,9 @@ void main() { '-Ptrack-widget-creation=true', '-Ptree-shake-icons=true', '-Pbundle-sksl-path=foo/bar/baz.sksl.json', - '-Pcode-size-directory=foo/code-size' + '-Pcode-size-directory=foo/code-size', + '-Pfoo=bar', + '-Pfizz=bazz' ]); });