From d35dd9f8a672e8e8d1d0372c40801768d2a3ae4f Mon Sep 17 00:00:00 2001 From: Emmanuel Garcia Date: Mon, 7 Dec 2020 09:23:04 -0800 Subject: [PATCH] Allow flavors and build types when using plugins (#71738) --- .../tasks/gradle_plugin_light_apk_test.dart | 30 +++++++++++++++++ dev/devicelab/lib/framework/apk_utils.dart | 7 ++-- packages/flutter_tools/gradle/flutter.gradle | 32 ++++++++----------- 3 files changed, 49 insertions(+), 20 deletions(-) diff --git a/dev/devicelab/bin/tasks/gradle_plugin_light_apk_test.dart b/dev/devicelab/bin/tasks/gradle_plugin_light_apk_test.dart index 20b2b4157d..9c22442ea8 100644 --- a/dev/devicelab/bin/tasks/gradle_plugin_light_apk_test.dart +++ b/dev/devicelab/bin/tasks/gradle_plugin_light_apk_test.dart @@ -8,6 +8,7 @@ import 'package:flutter_devicelab/framework/apk_utils.dart'; import 'package:flutter_devicelab/framework/framework.dart'; import 'package:flutter_devicelab/framework/task_result.dart'; import 'package:flutter_devicelab/framework/utils.dart'; +import 'package:path/path.dart' as path; Future main() async { await task(() async { @@ -207,6 +208,35 @@ Future main() async { await project.runGradleTask('assembleLocal'); }); + await runProjectTest((FlutterProject project) async { + section('gradlew assembleLocal with plugin (custom debug build)'); + + final Directory tempDir = Directory.systemTemp.createTempSync('flutter_plugin.'); + final Directory pluginDir = Directory(path.join(tempDir.path, 'plugin_under_test')); + + section('Create plugin'); + await inDirectory(tempDir, () async { + await flutter( + 'create', + options: [ + '--org', + 'io.flutter.devicelab.plugin', + '--template=plugin', + '--platforms=android,ios', + pluginDir.path, + ], + ); + }); + + section('Configure'); + project.addPlugin('plugin_under_test', value: '$platformLineSep path: ${pluginDir.path}'); + await project.addCustomBuildType('local', initWith: 'debug'); + await project.getPackages(); + + section('Build APK'); + await project.runGradleTask('assembleLocal'); + }); + await runProjectTest((FlutterProject project) async { section('gradlew assembleBeta (custom release build)'); await project.addCustomBuildType('beta', initWith: 'release'); diff --git a/dev/devicelab/lib/framework/apk_utils.dart b/dev/devicelab/lib/framework/apk_utils.dart index ae8db161cb..4c349043f8 100644 --- a/dev/devicelab/lib/framework/apk_utils.dart +++ b/dev/devicelab/lib/framework/apk_utils.dart @@ -280,12 +280,15 @@ subprojects { '''); } - Future addPlugin(String plugin) async { + /// Adds a plugin to the pubspec. + /// In pubspec, each dependency is expressed as key, value pair joined by a colon `:`. + /// such as `plugin_a`:`^0.0.1` or `plugin_a`:`\npath: /some/path`. + Future addPlugin(String plugin, { String value = '' }) async { final File pubspec = File(path.join(rootPath, 'pubspec.yaml')); String content = await pubspec.readAsString(); content = content.replaceFirst( '${platformLineSep}dependencies:$platformLineSep', - '${platformLineSep}dependencies:$platformLineSep $plugin:$platformLineSep', + '${platformLineSep}dependencies:$platformLineSep $plugin:$value$platformLineSep', ); await pubspec.writeAsString(content, flush: true); } diff --git a/packages/flutter_tools/gradle/flutter.gradle b/packages/flutter_tools/gradle/flutter.gradle index 3b71065f62..579cdea997 100644 --- a/packages/flutter_tools/gradle/flutter.gradle +++ b/packages/flutter_tools/gradle/flutter.gradle @@ -149,19 +149,16 @@ class FlutterPlugin implements Plugin { String flutterExecutableName = Os.isFamily(Os.FAMILY_WINDOWS) ? "flutter.bat" : "flutter" flutterExecutable = Paths.get(flutterRoot.absolutePath, "bin", flutterExecutableName).toFile(); - // Add custom build types. + String flutterProguardRules = Paths.get(flutterRoot.absolutePath, "packages", "flutter_tools", + "gradle", "flutter_proguard_rules.pro") project.android.buildTypes { + // Add profile build type. profile { initWith debug if (it.hasProperty("matchingFallbacks")) { matchingFallbacks = ["debug", "release"] } } - } - - String flutterProguardRules = Paths.get(flutterRoot.absolutePath, "packages", "flutter_tools", - "gradle", "flutter_proguard_rules.pro") - project.android.buildTypes { release { // Enables code shrinking, obfuscation, and optimization for only // your project's release build type. @@ -315,20 +312,19 @@ class FlutterPlugin implements Plugin { if (!supportsBuildMode(flutterBuildMode)) { return } - addApiDependencies( - pluginProject, - buildType.name, - "io.flutter:flutter_embedding_$flutterBuildMode:$engineVersion" - ) + // Copy build types from the app to the plugin. + // This allows to build apps with plugins and custom build types or flavors. + pluginProject.android.buildTypes { + "${buildType.name}" {} + } + pluginProject.dependencies.add( + "${buildType.name}CompileOnly", + "io.flutter:flutter_embedding_$flutterBuildMode:$engineVersion") } + // Wait until the Android plugin loaded. pluginProject.afterEvaluate { - pluginProject.android.buildTypes { - profile { - initWith debug - } - } - pluginProject.android.buildTypes.each addEmbeddingCompileOnlyDependency - pluginProject.android.buildTypes.whenObjectAdded addEmbeddingCompileOnlyDependency + project.android.buildTypes.each addEmbeddingCompileOnlyDependency + project.android.buildTypes.whenObjectAdded addEmbeddingCompileOnlyDependency } }