Skip to content

Commit 9620e3f

Browse files
authored
Reland (2): "Fix how Gradle resolves Android plugin" (#142498)
Previous PR: #137115, Revert: #142464 Fixes #141940 Closes #142487
1 parent 05daee3 commit 9620e3f

8 files changed

+767
-135
lines changed

packages/flutter_tools/gradle/module_plugin_loader.gradle

Lines changed: 12 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -5,41 +5,26 @@
55
// This file is included from `<module>/.android/include_flutter.groovy`,
66
// so it can be versioned with the Flutter SDK.
77

8-
import groovy.json.JsonSlurper
8+
import java.nio.file.Paths
9+
10+
File pathToThisDirectory = buildscript.sourceFile.parentFile
11+
apply from: Paths.get(pathToThisDirectory.absolutePath, "src", "main", "groovy", "native_plugin_loader.groovy")
912

1013
def moduleProjectRoot = project(':flutter').projectDir.parentFile.parentFile
1114

12-
def object = null;
13-
String flutterModulePath = project(':flutter').projectDir.parentFile.getAbsolutePath()
14-
// If this logic is changed, also change the logic in app_plugin_loader.gradle.
15-
def pluginsFile = new File(moduleProjectRoot, '.flutter-plugins-dependencies')
16-
if (pluginsFile.exists()) {
17-
object = new JsonSlurper().parseText(pluginsFile.text)
18-
assert object instanceof Map
19-
assert object.plugins instanceof Map
20-
assert object.plugins.android instanceof List
21-
// Includes the Flutter plugins that support the Android platform.
22-
object.plugins.android.each { androidPlugin ->
23-
assert androidPlugin.name instanceof String
24-
assert androidPlugin.path instanceof String
25-
// Skip plugins that have no native build (such as a Dart-only
26-
// implementation of a federated plugin).
27-
def needsBuild = androidPlugin.containsKey('native_build') ? androidPlugin['native_build'] : true
28-
if (!needsBuild) {
29-
return
30-
}
31-
def pluginDirectory = new File(androidPlugin.path, 'android')
32-
assert pluginDirectory.exists()
33-
include ":${androidPlugin.name}"
34-
project(":${androidPlugin.name}").projectDir = pluginDirectory
35-
}
15+
List<Map<String, Object>> nativePlugins = nativePluginLoader.getPlugins(moduleProjectRoot)
16+
nativePlugins.each { androidPlugin ->
17+
def pluginDirectory = new File(androidPlugin.path as String, 'android')
18+
assert pluginDirectory.exists()
19+
include ":${androidPlugin.name}"
20+
project(":${androidPlugin.name}").projectDir = pluginDirectory
3621
}
3722

23+
String flutterModulePath = project(':flutter').projectDir.parentFile.getAbsolutePath()
3824
gradle.getGradle().projectsLoaded { g ->
3925
g.rootProject.beforeEvaluate { p ->
4026
p.subprojects { subproject ->
41-
if (object != null && object.plugins != null && object.plugins.android != null
42-
&& object.plugins.android.name.contains(subproject.name)) {
27+
if (nativePlugins.name.contains(subproject.name)) {
4328
File androidPluginBuildOutputDir = new File(flutterModulePath + File.separator
4429
+ "plugins_build_output" + File.separator + subproject.name);
4530
if (!androidPluginBuildOutputDir.exists()) {

packages/flutter_tools/gradle/src/main/groovy/app_plugin_loader.groovy

Lines changed: 14 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,29 @@
1-
import groovy.json.JsonSlurper
21
import org.gradle.api.Plugin
32
import org.gradle.api.initialization.Settings
43

4+
import java.nio.file.Paths
5+
56
apply plugin: FlutterAppPluginLoaderPlugin
67

78
class FlutterAppPluginLoaderPlugin implements Plugin<Settings> {
8-
// This string must match _kFlutterPluginsHasNativeBuildKey defined in
9-
// packages/flutter_tools/lib/src/flutter_plugins.dart.
10-
private final String nativeBuildKey = 'native_build'
11-
129
@Override
1310
void apply(Settings settings) {
1411
def flutterProjectRoot = settings.settingsDir.parentFile
1512

16-
// If this logic is changed, also change the logic in module_plugin_loader.gradle.
17-
def pluginsFile = new File(flutterProjectRoot, '.flutter-plugins-dependencies')
18-
if (!pluginsFile.exists()) {
19-
return
13+
if(!settings.ext.hasProperty('flutterSdkPath')) {
14+
def properties = new Properties()
15+
def localPropertiesFile = new File(settings.rootProject.projectDir, "local.properties")
16+
localPropertiesFile.withInputStream { properties.load(it) }
17+
settings.ext.flutterSdkPath = properties.getProperty("flutter.sdk")
18+
assert settings.ext.flutterSdkPath != null, "flutter.sdk not set in local.properties"
2019
}
20+
21+
// Load shared gradle functions
22+
settings.apply from: Paths.get(settings.ext.flutterSdkPath, "packages", "flutter_tools", "gradle", "src", "main", "groovy", "native_plugin_loader.groovy")
2123

22-
def object = new JsonSlurper().parseText(pluginsFile.text)
23-
assert object instanceof Map
24-
assert object.plugins instanceof Map
25-
assert object.plugins.android instanceof List
26-
// Includes the Flutter plugins that support the Android platform.
27-
object.plugins.android.each { androidPlugin ->
28-
assert androidPlugin.name instanceof String
29-
assert androidPlugin.path instanceof String
30-
// Skip plugins that have no native build (such as a Dart-only implementation
31-
// of a federated plugin).
32-
def needsBuild = androidPlugin.containsKey(nativeBuildKey) ? androidPlugin[nativeBuildKey] : true
33-
if (!needsBuild) {
34-
return
35-
}
36-
def pluginDirectory = new File(androidPlugin.path, 'android')
24+
List<Map<String, Object>> nativePlugins = settings.ext.nativePluginLoader.getPlugins(flutterProjectRoot)
25+
nativePlugins.each { androidPlugin ->
26+
def pluginDirectory = new File(androidPlugin.path as String, 'android')
3727
assert pluginDirectory.exists()
3828
settings.include(":${androidPlugin.name}")
3929
settings.project(":${androidPlugin.name}").projectDir = pluginDirectory

0 commit comments

Comments
 (0)