Skip to content

Commit eba2a52

Browse files
authored
Add migrator to upgrade gradle version when conflict with Android Studio bundled Java version is detected (flutter#124085)
This PR adds an android project migrator that checks the version of android studio and the version of gradle for conflicts, and upgrades to 7.4 if a conflict is detected. For more detail about the particular conflict, see flutter#122376. The PR also upgrades older gradle versions being used in integration testing to 7.4. Fixes/related to: flutter#122376 and flutter#123636
1 parent fb36bba commit eba2a52

File tree

22 files changed

+515
-40
lines changed

22 files changed

+515
-40
lines changed

dev/integration_tests/android_custom_host_app/gradle/wrapper/gradle-wrapper.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME
22
distributionPath=wrapper/dists
33
zipStoreBase=GRADLE_USER_HOME
44
zipStorePath=wrapper/dists
5-
distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-all.zip
5+
distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.1-all.zip

dev/integration_tests/android_embedding_v2_smoke_test/android/gradle/wrapper/gradle-wrapper.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME
22
distributionPath=wrapper/dists
33
zipStoreBase=GRADLE_USER_HOME
44
zipStorePath=wrapper/dists
5-
distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-all.zip
5+
distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.1-all.zip

dev/integration_tests/android_host_app_v2_embedding/gradle/wrapper/gradle-wrapper.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME
22
distributionPath=wrapper/dists
33
zipStoreBase=GRADLE_USER_HOME
44
zipStorePath=wrapper/dists
5-
distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-all.zip
5+
distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.1-all.zip

dev/integration_tests/android_semantics_testing/android/gradle/wrapper/gradle-wrapper.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME
22
distributionPath=wrapper/dists
33
zipStoreBase=GRADLE_USER_HOME
44
zipStorePath=wrapper/dists
5-
distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-all.zip
5+
distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.1-all.zip

dev/integration_tests/android_views/android/gradle/wrapper/gradle-wrapper.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME
22
distributionPath=wrapper/dists
33
zipStoreBase=GRADLE_USER_HOME
44
zipStorePath=wrapper/dists
5-
distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-all.zip
5+
distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.1-all.zip

dev/integration_tests/external_ui/android/gradle/wrapper/gradle-wrapper.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME
22
distributionPath=wrapper/dists
33
zipStoreBase=GRADLE_USER_HOME
44
zipStorePath=wrapper/dists
5-
distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-all.zip
5+
distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.1-all.zip

dev/integration_tests/hybrid_android_views/android/gradle/wrapper/gradle-wrapper.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME
22
distributionPath=wrapper/dists
33
zipStoreBase=GRADLE_USER_HOME
44
zipStorePath=wrapper/dists
5-
distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-all.zip
5+
distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.1-all.zip

dev/integration_tests/module_host_with_custom_build_v2_embedding/gradle/wrapper/gradle-wrapper.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME
22
distributionPath=wrapper/dists
33
zipStoreBase=GRADLE_USER_HOME
44
zipStorePath=wrapper/dists
5-
distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-all.zip
5+
distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.1-all.zip

dev/integration_tests/non_nullable/android/gradle/wrapper/gradle-wrapper.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME
22
distributionPath=wrapper/dists
33
zipStoreBase=GRADLE_USER_HOME
44
zipStorePath=wrapper/dists
5-
distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-all.zip
5+
distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.1-all.zip

dev/integration_tests/platform_interaction/android/gradle/wrapper/gradle-wrapper.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME
22
distributionPath=wrapper/dists
33
zipStoreBase=GRADLE_USER_HOME
44
zipStorePath=wrapper/dists
5-
distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-all.zip
5+
distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.1-all.zip

dev/integration_tests/release_smoke_test/android/gradle/wrapper/gradle-wrapper.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME
22
distributionPath=wrapper/dists
33
zipStoreBase=GRADLE_USER_HOME
44
zipStorePath=wrapper/dists
5-
distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-all.zip
5+
distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.1-all.zip

dev/manual_tests/android/gradle/wrapper/gradle-wrapper.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME
22
distributionPath=wrapper/dists
33
zipStoreBase=GRADLE_USER_HOME
44
zipStorePath=wrapper/dists
5-
distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-all.zip
5+
distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.1-all.zip

dev/tracing_tests/android/gradle/wrapper/gradle-wrapper.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME
22
distributionPath=wrapper/dists
33
zipStoreBase=GRADLE_USER_HOME
44
zipStorePath=wrapper/dists
5-
distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-all.zip
5+
distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.1-all.zip

packages/flutter_tools/lib/src/android/gradle.dart

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,10 @@ import '../project.dart';
3131
import '../reporting/reporting.dart';
3232
import 'android_builder.dart';
3333
import 'android_sdk.dart';
34+
import 'android_studio.dart';
3435
import 'gradle_errors.dart';
3536
import 'gradle_utils.dart';
37+
import 'migrations/android_studio_java_gradle_conflict_migration.dart';
3638
import 'migrations/top_level_gradle_build_file_migration.dart';
3739
import 'multidex.dart';
3840

@@ -137,13 +139,16 @@ class AndroidGradleBuilder implements AndroidBuilder {
137139
required Usage usage,
138140
required GradleUtils gradleUtils,
139141
required Platform platform,
142+
required AndroidStudio? androidStudio,
140143
}) : _logger = logger,
141144
_fileSystem = fileSystem,
142145
_artifacts = artifacts,
143146
_usage = usage,
144147
_gradleUtils = gradleUtils,
148+
_androidStudio = androidStudio,
145149
_fileSystemUtils = FileSystemUtils(fileSystem: fileSystem, platform: platform),
146-
_processUtils = ProcessUtils(logger: logger, processManager: processManager);
150+
_processUtils = ProcessUtils(logger: logger, processManager: processManager),
151+
_platform = platform;
147152

148153
final Logger _logger;
149154
final ProcessUtils _processUtils;
@@ -152,6 +157,8 @@ class AndroidGradleBuilder implements AndroidBuilder {
152157
final Usage _usage;
153158
final GradleUtils _gradleUtils;
154159
final FileSystemUtils _fileSystemUtils;
160+
final AndroidStudio? _androidStudio;
161+
final Platform _platform;
155162

156163
/// Builds the AAR and POM files for the current Flutter module or plugin.
157164
@override
@@ -258,6 +265,15 @@ class AndroidGradleBuilder implements AndroidBuilder {
258265

259266
final List<ProjectMigrator> migrators = <ProjectMigrator>[
260267
TopLevelGradleBuildFileMigration(project.android, _logger),
268+
AndroidStudioJavaGradleConflictMigration(_logger,
269+
project: project.android,
270+
androidStudio: _androidStudio,
271+
fileSystem: _fileSystem,
272+
processUtils: _processUtils,
273+
platform: _platform,
274+
os: globals.os,
275+
androidSdk: globals.androidSdk)
276+
,
261277
];
262278

263279
final ProjectMigration migration = ProjectMigration(migrators);

packages/flutter_tools/lib/src/android/gradle_utils.dart

Lines changed: 48 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,22 @@ const String maxKnownAgpVersion = '8.1';
5959
final RegExp _androidGradlePluginRegExp =
6060
RegExp(r'com\.android\.tools\.build:gradle:(\d+\.\d+\.\d+)');
6161

62+
// Expected content format (with lines above and below).
63+
// Version can have 2 or 3 numbers.
64+
// 'distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-all.zip'
65+
// '^\s*' protects against commented out lines.
66+
final RegExp distributionUrlRegex =
67+
RegExp(r'^\s*distributionUrl\s*=\s*.*\.zip', multiLine: true);
68+
69+
// Modified version of the gradle distribution url match designed to only match
70+
// gradle.org urls so that we can guarantee any modifications to the url
71+
// still points to a hosted zip.
72+
final RegExp gradleOrgVersionMatch =
73+
RegExp(
74+
r'^\s*distributionUrl\s*=\s*https\\://services\.gradle\.org/distributions/gradle-((?:\d|\.)+)-(.*)\.zip',
75+
multiLine: true
76+
);
77+
6278
// From https://docs.gradle.org/current/userguide/command_line_interface.html#command_line_interface
6379
const String gradleVersionFlag = r'--version';
6480

@@ -169,42 +185,49 @@ String getGradleVersionForAndroidPlugin(Directory directory, Logger logger) {
169185
return getGradleVersionFor(androidPluginVersion ?? 'unknown');
170186
}
171187

188+
/// Returns the gradle file from the top level directory.
189+
/// The returned file is not guaranteed to be present.
190+
File getGradleWrapperFile(Directory directory) {
191+
return directory.childDirectory(gradleDirectoryName)
192+
.childDirectory(gradleWrapperDirectoryName)
193+
.childFile(gradleWrapperPropertiesFilename);
194+
}
195+
196+
/// Parses the gradle wrapper distribution url to return a string containing
197+
/// the version number.
198+
///
199+
/// Expected input is of the form '...gradle-7.4.2-all.zip', and the output
200+
/// would be of the form '7.4.2'.
201+
String? parseGradleVersionFromDistributionUrl(String? distributionUrl) {
202+
if (distributionUrl == null) {
203+
return null;
204+
}
205+
final List<String> zipParts = distributionUrl.split('-');
206+
if (zipParts.length < 2) {
207+
return null;
208+
}
209+
return zipParts[1];
210+
}
211+
172212
/// Returns either the gradle-wrapper.properties value from the passed in
173213
/// [directory] or if not present the version available in local path.
174214
///
175215
/// If gradle version is not found null is returned.
176-
/// [directory] should be and android directory with a build.gradle file.
216+
/// [directory] should be an android directory with a build.gradle file.
177217
Future<String?> getGradleVersion(
178218
Directory directory, Logger logger, ProcessManager processManager) async {
179-
final File propertiesFile = directory
180-
.childDirectory(gradleDirectoryName)
181-
.childDirectory(gradleWrapperDirectoryName)
182-
.childFile(gradleWrapperPropertiesFilename);
219+
final File propertiesFile = getGradleWrapperFile(directory);
183220

184221
if (propertiesFile.existsSync()) {
185222
final String wrapperFileContent = propertiesFile.readAsStringSync();
186223

187-
// Expected content format (with lines above and below).
188-
// Version can have 2 or 3 numbers.
189-
// 'distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-all.zip'
190-
// '^\s*' protects against commented out lines.
191-
final RegExp distributionUrlRegex =
192-
RegExp(r'^\s*distributionUrl\s?=\s?.*\.zip', multiLine: true);
193-
194224
final RegExpMatch? distributionUrl =
195225
distributionUrlRegex.firstMatch(wrapperFileContent);
196226
if (distributionUrl != null) {
197-
// Expected content: 'gradle-7.4.2-all.zip'
198-
final String? gradleZip = distributionUrl.group(0);
199-
if (gradleZip != null) {
200-
final List<String> zipParts = gradleZip.split('-');
201-
if (zipParts.length > 2) {
202-
final String gradleVersion = zipParts[1];
203-
return gradleVersion;
204-
} else {
205-
// Did not find gradle zip url. Likely this is a bug in our parsing.
206-
logger.printWarning(_formatParseWarning(wrapperFileContent));
207-
}
227+
final String? gradleVersion =
228+
parseGradleVersionFromDistributionUrl(distributionUrl.group(0));
229+
if (gradleVersion != null) {
230+
return gradleVersion;
208231
} else {
209232
// Did not find gradle zip url. Likely this is a bug in our parsing.
210233
logger.printWarning(_formatParseWarning(wrapperFileContent));
@@ -248,7 +271,7 @@ OS: Mac OS X 13.2.1 aarch64
248271
final RegExpMatch? version =
249272
gradleVersionRegex.firstMatch(gradleVersionVerbose);
250273
if (version == null) {
251-
// Most likley a bug in our parse implementation/regex.
274+
// Most likely a bug in our parse implementation/regex.
252275
logger.printWarning(_formatParseWarning(gradleVersionVerbose));
253276
return null;
254277
}
@@ -300,7 +323,7 @@ String _formatParseWarning(String content) {
300323
//
301324
// Source of truth found here:
302325
// https://developer.android.com/studio/releases/gradle-plugin#updating-gradle
303-
// AGP has a minimim version of gradle required but no max starting at
326+
// AGP has a minimum version of gradle required but no max starting at
304327
// AGP version 2.3.0+.
305328
bool validateGradleAndAgp(Logger logger,
306329
{required String? gradleV, required String? agpV}) {

0 commit comments

Comments
 (0)