diff --git a/.ci.yaml b/.ci.yaml index 9d8f8f5439..ca1620d888 100644 --- a/.ci.yaml +++ b/.ci.yaml @@ -1520,10 +1520,12 @@ targets: test_timeout_secs: "2700" runIf: - packages/flutter_tools/templates/** + - packages/flutter_tools/gradle/** - .ci.yaml - engine/** - DEPS - dev/devicelab/bin/tasks/android_java11_dependency_smoke_tests.dart + - dev/devicelab/lib/framework/dependency_smoke_test_task_definition.dart - name: Linux android_java17_dependency_smoke_tests recipe: devicelab/devicelab_drone @@ -1542,10 +1544,12 @@ targets: test_timeout_secs: "2700" runIf: - packages/flutter_tools/templates/** + - packages/flutter_tools/gradle/** - .ci.yaml - engine/** - DEPS - dev/devicelab/bin/tasks/android_java17_dependency_smoke_tests.dart + - dev/devicelab/lib/framework/dependency_smoke_test_task_definition.dart - name: Linux tool_tests_commands recipe: flutter/flutter_drone diff --git a/dev/devicelab/bin/tasks/android_java11_dependency_smoke_tests.dart b/dev/devicelab/bin/tasks/android_java11_dependency_smoke_tests.dart index 94c3d37a46..40883ebe88 100644 --- a/dev/devicelab/bin/tasks/android_java11_dependency_smoke_tests.dart +++ b/dev/devicelab/bin/tasks/android_java11_dependency_smoke_tests.dart @@ -40,11 +40,14 @@ List versionTuples = [ kotlinVersion: '1.7.10', compileSdkVersion: '34', ), + // minSdk bump required due to a bug in the default version of r8 used by AGP + // 7.4.0. See http://issuetracker.google.com/issues/357553178. VersionTuple( agpVersion: '7.4.0', gradleVersion: '7.5', kotlinVersion: '1.8.10', compileSdkVersion: '34', + minSdkVersion: '24', ), ]; diff --git a/dev/devicelab/lib/framework/dependency_smoke_test_task_definition.dart b/dev/devicelab/lib/framework/dependency_smoke_test_task_definition.dart index d333046fff..ee46e68bda 100644 --- a/dev/devicelab/lib/framework/dependency_smoke_test_task_definition.dart +++ b/dev/devicelab/lib/framework/dependency_smoke_test_task_definition.dart @@ -61,6 +61,7 @@ distributionUrl=https\://services.gradle.org/distributions/gradle-GRADLE_REPLACE const String gradleReplacementString = 'GRADLE_REPLACE_ME'; final RegExp flutterCompileSdkString = RegExp(r'flutter\.compileSdkVersion|flutter\.compileSdk'); +final RegExp flutterMinSdkString = RegExp(r'flutter\.minSdkVersion|flutter\.minSdk'); /// A simple class containing a Kotlin, Gradle, and AGP version. class VersionTuple { @@ -69,12 +70,14 @@ class VersionTuple { required this.gradleVersion, required this.kotlinVersion, this.compileSdkVersion, + this.minSdkVersion, }); String agpVersion; String gradleVersion; String kotlinVersion; String? compileSdkVersion; + String? minSdkVersion; @override String toString() { @@ -108,10 +111,10 @@ Future buildFlutterApkWithSpecifiedDependencyVersions({ final String appPath = '${innerTempDir.absolute.path}/dependency_checker_app'; + final File appGradleBuild = getAndroidBuildFile( + localFileSystem.path.join(appPath, 'android', 'app'), + ); if (versions.compileSdkVersion != null) { - final File appGradleBuild = getAndroidBuildFile( - localFileSystem.path.join(appPath, 'android', 'app'), - ); final String appBuildContent = appGradleBuild.readAsStringSync().replaceFirst( flutterCompileSdkString, versions.compileSdkVersion!, @@ -119,6 +122,14 @@ Future buildFlutterApkWithSpecifiedDependencyVersions({ appGradleBuild.writeAsStringSync(appBuildContent); } + if (versions.minSdkVersion != null) { + final String appBuildContent = appGradleBuild.readAsStringSync().replaceFirst( + flutterMinSdkString, + versions.minSdkVersion!, + ); + appGradleBuild.writeAsStringSync(appBuildContent); + } + // Modify gradle version to passed in version. final File gradleWrapperProperties = localFileSystem.file( localFileSystem.path.join( @@ -144,6 +155,13 @@ Future buildFlutterApkWithSpecifiedDependencyVersions({ .replaceFirst(kgpReplacementString, versions.kotlinVersion); await gradleSettingsFile.writeAsString(settingsContent, flush: true); + section('Add a dependency on a plugin'); + await flutter( + 'pub', + options: ['add', 'shared_preferences_android:2.4.7'], // Chosen randomly. + workingDirectory: appPath, + ); + // Ensure that gradle files exists from templates. section( "Ensure 'flutter build apk' succeeds with Gradle ${versions.gradleVersion}, AGP ${versions.agpVersion}, and Kotlin ${versions.kotlinVersion}", diff --git a/packages/flutter_tools/gradle/src/main/kotlin/FlutterPluginUtils.kt b/packages/flutter_tools/gradle/src/main/kotlin/FlutterPluginUtils.kt index 2b622591eb..ff4b6c8b32 100644 --- a/packages/flutter_tools/gradle/src/main/kotlin/FlutterPluginUtils.kt +++ b/packages/flutter_tools/gradle/src/main/kotlin/FlutterPluginUtils.kt @@ -517,8 +517,16 @@ object FlutterPluginUtils { getCompileSdkFromProject(project).toIntOrNull() ?: Int.MAX_VALUE var maxPluginCompileSdkVersion = projectCompileSdkVersion - val projectNdkVersion = - getAndroidExtension(project).ndkVersion + // TODO(gmackall): This should be updated to reflect newer templates. + // The default for AGP 4.1.0 used in old templates. + val ndkVersionIfUnspecified = "21.1.6352462" + + // TODO(gmackall): We can remove this elvis when our minimum AGP is >= 8.2. + // This value (ndkVersion) is nullable on AGP versions below that. + // See https://developer.android.com/reference/tools/gradle-api/8.1/com/android/build/api/dsl/CommonExtension#ndkVersion(). + @Suppress("USELESS_ELVIS") + val projectNdkVersion: String = + getAndroidExtension(project).ndkVersion ?: ndkVersionIfUnspecified var maxPluginNdkVersion = projectNdkVersion var numProcessedPlugins = pluginList.size val pluginsWithHigherSdkVersion = mutableListOf() @@ -543,8 +551,13 @@ object FlutterPluginUtils { ) ) } + + // TODO(gmackall): We can remove this elvis when our minimum AGP is >= 8.2. + // This value (ndkVersion) is nullable on AGP versions below that. + // See https://developer.android.com/reference/tools/gradle-api/8.1/com/android/build/api/dsl/CommonExtension#ndkVersion(). + @Suppress("USELESS_ELVIS") val pluginNdkVersion: String = - getAndroidExtension(pluginProject).ndkVersion + getAndroidExtension(pluginProject).ndkVersion ?: ndkVersionIfUnspecified maxPluginNdkVersion = VersionUtils.mostRecentSemanticVersion( pluginNdkVersion,