From 577c2fc48cbdd7d843a15673c6bb65006e4ae1c1 Mon Sep 17 00:00:00 2001 From: Josh Burton Date: Wed, 26 Jun 2019 05:40:55 +1200 Subject: [PATCH] Ensures flutter jar is added to all build types on plugin projects (#34573) --- .../tasks/gradle_plugin_light_apk_test.dart | 11 +++++ dev/devicelab/lib/framework/apk_utils.dart | 36 ++++++++++++++++ packages/flutter_tools/gradle/flutter.gradle | 41 ++++++++----------- 3 files changed, 65 insertions(+), 23 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 b2961cc94de..3f3b5c1cc8e 100644 --- a/dev/devicelab/bin/tasks/gradle_plugin_light_apk_test.dart +++ b/dev/devicelab/bin/tasks/gradle_plugin_light_apk_test.dart @@ -164,6 +164,17 @@ Future main() async { await project.runGradleTask('assembleBeta'); }); + await runProjectTest((FlutterProject project) async { + section('gradlew assembleLocal (plugin with custom build type)'); + await project.addCustomBuildType('local', initWith: 'debug'); + await project.addGlobalBuildType('local', initWith: 'debug'); + section('Add plugin'); + await project.addPlugin('path_provider'); + await project.getPackages(); + + await project.runGradleTask('assembleLocal'); + }); + await runProjectTest((FlutterProject project) async { section('gradlew assembleFreeDebug (product flavor)'); await project.addProductFlavors(['free']); diff --git a/dev/devicelab/lib/framework/apk_utils.dart b/dev/devicelab/lib/framework/apk_utils.dart index 3b178723188..d4780f827cc 100644 --- a/dev/devicelab/lib/framework/apk_utils.dart +++ b/dev/devicelab/lib/framework/apk_utils.dart @@ -116,6 +116,42 @@ android { '''); } + Future addGlobalBuildType(String name, {String initWith}) async { + final File buildScript = File( + path.join(androidPath, 'build.gradle'), + ); + + buildScript.openWrite(mode: FileMode.append).write(''' +subprojects { + afterEvaluate { + android { + buildTypes { + $name { + initWith $initWith + } + } + } + } +} + '''); + } + + Future addPlugin(String plugin) async { + final File pubspec = File(path.join(rootPath, 'pubspec.yaml')); + String content = await pubspec.readAsString(); + content = content.replaceFirst( + '\ndependencies:\n', + '\ndependencies:\n $plugin:\n', + ); + await pubspec.writeAsString(content, flush: true); + } + + Future getPackages() async { + await inDirectory(Directory(rootPath), () async { + await flutter('pub', options: ['get']); + }); + } + Future addProductFlavors(Iterable flavors) async { final File buildScript = File( path.join(androidPath, 'app', 'build.gradle'), diff --git a/packages/flutter_tools/gradle/flutter.gradle b/packages/flutter_tools/gradle/flutter.gradle index dcf3d108021..372a1a0a8ec 100644 --- a/packages/flutter_tools/gradle/flutter.gradle +++ b/packages/flutter_tools/gradle/flutter.gradle @@ -223,8 +223,16 @@ class FlutterPlugin implements Plugin { initWith debug } } + + pluginProject.android.buildTypes.each { + def buildMode = buildModeFor(it) + addFlutterJarCompileOnlyDependency(pluginProject, it.name, project.files( flutterJar ?: baseJar[buildMode] )) + } + pluginProject.android.buildTypes.whenObjectAdded { + def buildMode = buildModeFor(it) + addFlutterJarCompileOnlyDependency(pluginProject, it.name, project.files( flutterJar ?: baseJar[buildMode] )) + } } - pluginProject.afterEvaluate this.&addFlutterJarCompileOnlyDependency } else { project.logger.error("Plugin project :$name not found. Please update settings.gradle.") } @@ -292,33 +300,20 @@ class FlutterPlugin implements Plugin { return PLATFORM_ARM32; } - // TODO(blasten): Clean this up. - private void addFlutterJarCompileOnlyDependency(Project project) { + private void addFlutterJarCompileOnlyDependency(Project project, String variantName, FileCollection files) { if (project.state.failure) { return } - project.dependencies { - if (flutterJar != null) { - if (project.getConfigurations().findByName("compileOnly")) { - compileOnly project.files(flutterJar) - } else { - provided project.files(flutterJar) - } - } else { - assert baseJar["debug"].isFile() - assert baseJar["profile"].isFile() - assert baseJar["release"].isFile() - if (project.getConfigurations().findByName("debugCompileOnly")) { - debugCompileOnly project.files(baseJar["debug"]) - profileCompileOnly project.files(baseJar["profile"]) - releaseCompileOnly project.files(baseJar["release"]) - } else { - debugProvided project.files(baseJar["debug"]) - profileProvided project.files(baseJar["profile"]) - releaseProvided project.files(baseJar["release"]) - } + project.dependencies { + String configuration; + if (project.getConfigurations().findByName("compileOnly")) { + configuration = "${variantName}CompileOnly"; + } else { + configuration = "${variantName}Provided"; } + + add(configuration, files) } }