Change meaning of a plugin not supporting the android platform (#47015)
diff --git a/packages/flutter_tools/gradle/flutter.gradle b/packages/flutter_tools/gradle/flutter.gradle
index e852f2f..af611b6 100644
--- a/packages/flutter_tools/gradle/flutter.gradle
+++ b/packages/flutter_tools/gradle/flutter.gradle
@@ -331,15 +331,24 @@
}
}
+ // Returns `true` if the given path contains an `android/build.gradle` file.
+ //
+ // TODO(egarciad): Fix https://github.com/flutter/flutter/issues/39657.
+ // Android Studio may create empty android directories due to the logic in <app>/android/settings.gradle,
+ // which imports all plugins regardless of whether they support the android platform.
+ private Boolean doesSupportAndroidPlatform(String path) {
+ File editableAndroidProject = new File(path, 'android' + File.separator + 'build.gradle')
+ return editableAndroidProject.exists()
+ }
+
// Add the dependencies on other plugin projects to the plugin project.
// A plugin A can depend on plugin B. As a result, this dependency must be surfaced by
// making the Gradle plugin project A depend on the Gradle plugin project B.
private void configurePluginDependencies(Object dependencyObject) {
assert dependencyObject.name instanceof String
Project pluginProject = project.rootProject.findProject(":${dependencyObject.name}")
- if (pluginProject == null) {
- // Ignore plugins that don't have a project since most likely they don't
- // have an android/ directory.
+ if (pluginProject == null ||
+ !doesSupportAndroidPlatform(pluginProject.projectDir.parentFile.path)) {
return
}
assert dependencyObject.dependencies instanceof List
@@ -349,7 +358,8 @@
return
}
Project dependencyProject = project.rootProject.findProject(":$pluginDependencyName")
- if (!dependencyProject.projectDir.exists() || dependencyProject == null) {
+ if (dependencyProject == null ||
+ !doesSupportAndroidPlatform(dependencyProject.projectDir.parentFile.path)) {
return
}
// Wait for the Android plugin to load and add the dependency to the plugin project.
@@ -366,8 +376,7 @@
Properties allPlugins = readPropertiesIfExist(pluginsFile)
Properties androidPlugins = new Properties()
allPlugins.each { name, path ->
- File editableAndroidProject = new File(path, 'android' + File.separator + 'build.gradle')
- if (editableAndroidProject.exists()) {
+ if (doesSupportAndroidPlatform(path)) {
androidPlugins.setProperty(name, path)
}
// TODO(amirh): log an error if this plugin was specified to be an Android
diff --git a/packages/flutter_tools/lib/src/android/gradle.dart b/packages/flutter_tools/lib/src/android/gradle.dart
index 6bfd93c..23a1c47 100644
--- a/packages/flutter_tools/lib/src/android/gradle.dart
+++ b/packages/flutter_tools/lib/src/android/gradle.dart
@@ -716,8 +716,9 @@
assert(pluginDirectory.existsSync());
final String pluginName = pluginParts.first;
- if (!pluginDirectory.childDirectory('android').existsSync()) {
- printTrace('Skipping plugin $pluginName since it doesn\'t have an android directory');
+ final File buildGradleFile = pluginDirectory.childDirectory('android').childFile('build.gradle');
+ if (!buildGradleFile.existsSync()) {
+ printTrace('Skipping plugin $pluginName since it doesn\'t have a android/build.gradle file');
continue;
}
logger.printStatus('Building plugin $pluginName...');
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 c491441..1c026bf 100644
--- a/packages/flutter_tools/test/general.shard/android/gradle_test.dart
+++ b/packages/flutter_tools/test/general.shard/android/gradle_test.dart
@@ -897,7 +897,10 @@
androidPackage: irrelevant
''');
- plugin1.childDirectory('android').createSync();
+ plugin1
+ .childDirectory('android')
+ .childFile('build.gradle')
+ .createSync(recursive: true);
final Directory plugin2 = fs.directory('plugin2.');
plugin2
@@ -910,7 +913,10 @@
androidPackage: irrelevant
''');
- plugin2.childDirectory('android').createSync();
+ plugin2
+ .childDirectory('android')
+ .childFile('build.gradle')
+ .createSync(recursive: true);
androidDirectory
.childFile('.flutter-plugins')
@@ -976,7 +982,7 @@
GradleUtils: () => FakeGradleUtils(),
});
- testUsingContext('skips plugin without an android directory', () async {
+ testUsingContext('skips plugin without a android/build.gradle file', () async {
final Directory androidDirectory = fs.directory('android.');
androidDirectory.createSync();
androidDirectory
@@ -999,6 +1005,10 @@
.writeAsStringSync('''
plugin1=${plugin1.path}
''');
+ // Create an empty android directory.
+ // https://github.com/flutter/flutter/issues/46898
+ plugin1.childDirectory('android').createSync();
+
final Directory buildDirectory = androidDirectory.childDirectory('build');
buildDirectory