Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
133 changes: 66 additions & 67 deletions packages/flutter_tools/lib/src/android/gradle_utils.dart
Original file line number Diff line number Diff line change
Expand Up @@ -83,10 +83,10 @@ const maxKnownAndSupportedKgpVersion = '2.1.20';
// Supported here means tooling is aware of this version's Java <-> AGP
// compatibility.
@visibleForTesting
const maxKnownAndSupportedAgpVersion = '8.9.1';
const maxKnownAndSupportedAgpVersion = '9.0';

// Update this when new versions of AGP come out.
const maxKnownAgpVersion = '8.9.1';
const maxKnownAgpVersion = '9.0';

// Supported here means tooling is aware of this versions
// Java <-> AGP compatibility and does not imply broader flutter support.
Expand Down Expand Up @@ -745,13 +745,14 @@ bool validateGradleAndAgp(Logger logger, {required String? gradleV, required Str
}

// Check highest supported version before checking unknown versions.
if (isWithinVersionRange(agpV, min: '8.0', max: maxKnownAndSupportedAgpVersion)) {
return isWithinVersionRange(gradleV, min: '8.0', max: maxKnownAndSupportedGradleVersion);
// https://developer.android.com/build/releases/agp-preview#android-gradle-plugin-compatibility
if (isWithinVersionRange(agpV, min: '9.0', max: '9.0.99')) {
return isWithinVersionRange(gradleV, min: '9.0', max: maxKnownAndSupportedGradleVersion);
}
// Check if versions are newer than the max known versions.
if (isWithinVersionRange(agpV, min: maxKnownAndSupportedAgpVersion, max: '100.100')) {
// Assume versions we do not know about are valid but log.
final bool validGradle = isWithinVersionRange(gradleV, min: '8.0', max: '100.00');
final bool validGradle = isWithinVersionRange(gradleV, min: '9.1.0', max: '100.00');
logger.printTrace(
'Newer than known AGP version ($agpV), gradle ($gradleV).'
'\n Treating as valid configuration.',
Expand All @@ -760,6 +761,33 @@ bool validateGradleAndAgp(Logger logger, {required String? gradleV, required Str
}

// Begin Known Gradle <-> AGP validation.
if (isWithinVersionRange(agpV, min: '8.13.0', max: '8.13.99')) {
return isWithinVersionRange(gradleV, min: '8.13', max: maxKnownAndSupportedGradleVersion);
}
if (isWithinVersionRange(agpV, min: '8.12.0', max: '8.12.99')) {
return isWithinVersionRange(gradleV, min: '8.13', max: maxKnownAndSupportedGradleVersion);
}
if (isWithinVersionRange(agpV, min: '8.11.0', max: '8.11.99')) {
return isWithinVersionRange(gradleV, min: '8.13', max: maxKnownAndSupportedGradleVersion);
}
if (isWithinVersionRange(agpV, min: '8.10.0', max: '8.10.99')) {
return isWithinVersionRange(gradleV, min: '8.11.1', max: maxKnownAndSupportedGradleVersion);
}
if (isWithinVersionRange(agpV, min: '8.9.0', max: '8.9.99')) {
return isWithinVersionRange(gradleV, min: '8.11.1', max: maxKnownAndSupportedGradleVersion);
}
if (isWithinVersionRange(agpV, min: '8.8.0', max: '8.8.99')) {
return isWithinVersionRange(gradleV, min: '8.10.2', max: maxKnownAndSupportedGradleVersion);
}
if (isWithinVersionRange(agpV, min: '8.7.0', max: '8.7.99')) {
return isWithinVersionRange(gradleV, min: '8.9', max: maxKnownAndSupportedGradleVersion);
}
if (isWithinVersionRange(agpV, min: '8.6.0', max: '8.6.99')) {
return isWithinVersionRange(gradleV, min: '8.7', max: maxKnownAndSupportedGradleVersion);
}
if (isWithinVersionRange(agpV, min: '8.5.0', max: '8.5.99')) {
return isWithinVersionRange(gradleV, min: '8.7', max: maxKnownAndSupportedGradleVersion);
}
if (isWithinVersionRange(agpV, min: '8.4.0', max: '8.4.99')) {
return isWithinVersionRange(gradleV, min: '8.6', max: maxKnownAndSupportedGradleVersion);
}
Expand Down Expand Up @@ -879,7 +907,12 @@ bool validateJavaAndGradle(
max: data.javaMax,
inclusiveMax: false,
)) {
return isWithinVersionRange(gradleVersion, min: data.gradleMin, max: data.gradleMax);
// Null max value should be treated as unbounded on the max side.
return isWithinVersionRange(
gradleVersion,
min: data.gradleMin,
max: data.gradleMax ?? '100.100',
);
}
}

Expand Down Expand Up @@ -997,7 +1030,7 @@ VersionRange getJavaVersionFor({required String gradleV, required String agpV})
/// Returns the Gradle version that is required by the given Android Gradle plugin version
/// by picking the largest compatible version from
/// https://developer.android.com/studio/releases/gradle-plugin#updating-gradle
String getGradleVersionFor(String androidPluginVersion) {
String getGradleVersionFor(String agpV) {
final compatList = <GradleForAgp>[
GradleForAgp(agpMin: '1.0.0', agpMax: '1.1.3', minRequiredGradle: '2.3'),
GradleForAgp(agpMin: '1.2.0', agpMax: '1.3.1', minRequiredGradle: '2.9'),
Expand All @@ -1023,7 +1056,12 @@ String getGradleVersionFor(String androidPluginVersion) {
GradleForAgp(agpMin: '8.7.0', agpMax: '8.7.99', minRequiredGradle: '8.9'),
GradleForAgp(agpMin: '8.8.0', agpMax: '8.8.99', minRequiredGradle: '8.10.2'),
GradleForAgp(agpMin: '8.9.0', agpMax: '8.9.99', minRequiredGradle: '8.11.1'),
// Assume if AGP is newer than this code know about return the highest gradle
GradleForAgp(agpMin: '8.10.0', agpMax: '8.10.99', minRequiredGradle: '8.11.1'),
GradleForAgp(agpMin: '8.11.0', agpMax: '8.11.99', minRequiredGradle: '8.13'),
GradleForAgp(agpMin: '8.12.0', agpMax: '8.12.99', minRequiredGradle: '8.13'),
GradleForAgp(agpMin: '8.13.0', agpMax: '8.13.99', minRequiredGradle: '8.13'),
GradleForAgp(agpMin: '9.0', agpMax: '9.0.99', minRequiredGradle: '9.0.0'),
// Assume if AGP is newer than this code knows about return the highest gradle
// version we know about.
GradleForAgp(
agpMin: maxKnownAgpVersion,
Expand All @@ -1032,14 +1070,14 @@ String getGradleVersionFor(String androidPluginVersion) {
),
];
for (final data in compatList) {
if (isWithinVersionRange(androidPluginVersion, min: data.agpMin, max: data.agpMax)) {
if (isWithinVersionRange(agpV, min: data.agpMin, max: data.agpMax)) {
return data.minRequiredGradle;
}
}
if (isWithinVersionRange(androidPluginVersion, min: maxKnownAgpVersion, max: '100.100')) {
if (isWithinVersionRange(agpV, min: maxKnownAgpVersion, max: '100.100')) {
return maxKnownAndSupportedGradleVersion;
}
throwToolExit('Unsupported Android Plugin version: $androidPluginVersion.');
throwToolExit('Unsupported Android Plugin version: $agpV.');
}

/// Overwrite local.properties in the specified Flutter project's Android
Expand Down Expand Up @@ -1135,19 +1173,20 @@ void exitWithNoSdkMessage() {
//
// The [javaMax] is exclusive in terms of supporting the noted [gradleMin],
// whereas [javaMin] is inclusive.
// Gradle Max is not required and when unset should mean unbound.
@immutable
class JavaGradleCompat {
const JavaGradleCompat({
required this.javaMin,
required this.javaMax,
required this.gradleMin,
required this.gradleMax,
this.gradleMax,
});

final String javaMin;
final String javaMax;
final String gradleMin;
final String gradleMax;
final String? gradleMax;

@override
bool operator ==(Object other) =>
Expand All @@ -1159,6 +1198,11 @@ class JavaGradleCompat {

@override
int get hashCode => Object.hash(javaMin, javaMax, gradleMin, gradleMax);

@override
String toString() {
return '$javaMin, $javaMax, $gradleMin, $gradleMax';
}
}

// Data class to hold defined Java <-> AGP compatibility criteria.
Expand Down Expand Up @@ -1214,60 +1258,15 @@ String getGradlewFileName(Platform platform) {
/// of Gradle, as https://docs.gradle.org/current/userguide/compatibility.html
/// details.
var _javaGradleCompatList = const <JavaGradleCompat>[
JavaGradleCompat(
javaMin: '25',
javaMax: '26',
gradleMin: '9.1.0',
gradleMax: maxKnownAndSupportedGradleVersion,
),
JavaGradleCompat(
javaMin: '24',
javaMax: '25',
gradleMin: '8.14',
gradleMax: maxKnownAndSupportedGradleVersion,
),
JavaGradleCompat(
javaMin: '23',
javaMax: '24',
gradleMin: '8.10',
gradleMax: maxKnownAndSupportedGradleVersion,
),
JavaGradleCompat(
javaMin: '22',
javaMax: '23',
gradleMin: '8.7',
gradleMax: maxKnownAndSupportedGradleVersion,
),
JavaGradleCompat(
javaMin: '21',
javaMax: '22',
gradleMin: '8.4',
gradleMax: maxKnownAndSupportedGradleVersion,
),
JavaGradleCompat(
javaMin: '20',
javaMax: '21',
gradleMin: '8.1',
gradleMax: maxKnownAndSupportedGradleVersion,
),
JavaGradleCompat(
javaMin: '19',
javaMax: '20',
gradleMin: '7.6',
gradleMax: maxKnownAndSupportedGradleVersion,
),
JavaGradleCompat(
javaMin: '18',
javaMax: '19',
gradleMin: '7.5',
gradleMax: maxKnownAndSupportedGradleVersion,
),
JavaGradleCompat(
javaMin: '17',
javaMax: '18',
gradleMin: '7.3',
gradleMax: maxKnownAndSupportedGradleVersion,
),
JavaGradleCompat(javaMin: '25', javaMax: '26', gradleMin: '9.1.0'),
JavaGradleCompat(javaMin: '24', javaMax: '25', gradleMin: '8.14'),
JavaGradleCompat(javaMin: '23', javaMax: '24', gradleMin: '8.10'),
JavaGradleCompat(javaMin: '22', javaMax: '23', gradleMin: '8.7'),
JavaGradleCompat(javaMin: '21', javaMax: '22', gradleMin: '8.4'),
JavaGradleCompat(javaMin: '20', javaMax: '21', gradleMin: '8.1'),
JavaGradleCompat(javaMin: '19', javaMax: '20', gradleMin: '7.6'),
JavaGradleCompat(javaMin: '18', javaMax: '19', gradleMin: '7.5'),
JavaGradleCompat(javaMin: '17', javaMax: '18', gradleMin: '7.3'),
JavaGradleCompat(
javaMin: '16',
javaMax: '17',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ import 'package:flutter_tools/src/android/android_sdk.dart';
import 'package:flutter_tools/src/android/gradle.dart';
import 'package:flutter_tools/src/android/gradle_utils.dart' as gradle_utils;
import 'package:flutter_tools/src/artifacts.dart';
import 'package:flutter_tools/src/base/common.dart';
import 'package:flutter_tools/src/base/file_system.dart';
import 'package:flutter_tools/src/base/logger.dart';
import 'package:flutter_tools/src/base/platform.dart';
Expand Down Expand Up @@ -571,70 +570,6 @@ flutter:
});
});

group('gradle version', () {
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These tests were moved to gradle_utils_test

testWithoutContext('should be compatible with the Android plugin version', () {
// Granular versions.
expect(gradle_utils.getGradleVersionFor('1.0.0'), '2.3');
expect(gradle_utils.getGradleVersionFor('1.0.1'), '2.3');
expect(gradle_utils.getGradleVersionFor('1.0.2'), '2.3');
expect(gradle_utils.getGradleVersionFor('1.0.4'), '2.3');
expect(gradle_utils.getGradleVersionFor('1.0.8'), '2.3');
expect(gradle_utils.getGradleVersionFor('1.1.0'), '2.3');
expect(gradle_utils.getGradleVersionFor('1.1.2'), '2.3');
expect(gradle_utils.getGradleVersionFor('1.1.2'), '2.3');
expect(gradle_utils.getGradleVersionFor('1.1.3'), '2.3');
// Version Ranges.
expect(gradle_utils.getGradleVersionFor('1.2.0'), '2.9');
expect(gradle_utils.getGradleVersionFor('1.3.1'), '2.9');

expect(gradle_utils.getGradleVersionFor('1.5.0'), '2.2.1');

expect(gradle_utils.getGradleVersionFor('2.0.0'), '2.13');
expect(gradle_utils.getGradleVersionFor('2.1.2'), '2.13');

expect(gradle_utils.getGradleVersionFor('2.1.3'), '2.14.1');
expect(gradle_utils.getGradleVersionFor('2.2.3'), '2.14.1');

expect(gradle_utils.getGradleVersionFor('2.3.0'), '3.3');

expect(gradle_utils.getGradleVersionFor('3.0.0'), '4.1');

expect(gradle_utils.getGradleVersionFor('3.1.0'), '4.4');

expect(gradle_utils.getGradleVersionFor('3.2.0'), '4.6');
expect(gradle_utils.getGradleVersionFor('3.2.1'), '4.6');

expect(gradle_utils.getGradleVersionFor('3.3.0'), '4.10.2');
expect(gradle_utils.getGradleVersionFor('3.3.2'), '4.10.2');

expect(gradle_utils.getGradleVersionFor('3.4.0'), '5.6.2');
expect(gradle_utils.getGradleVersionFor('3.5.0'), '5.6.2');

expect(gradle_utils.getGradleVersionFor('4.0.0'), '6.7');
expect(gradle_utils.getGradleVersionFor('4.1.0'), '6.7');

expect(gradle_utils.getGradleVersionFor('7.0'), '7.5');
expect(gradle_utils.getGradleVersionFor('7.1.2'), '7.5');
expect(gradle_utils.getGradleVersionFor('7.2'), '7.5');
expect(gradle_utils.getGradleVersionFor('8.0'), '8.0');
expect(gradle_utils.getGradleVersionFor('8.1'), '8.0');
expect(gradle_utils.getGradleVersionFor('8.2'), '8.2');
expect(gradle_utils.getGradleVersionFor('8.3'), '8.4');
expect(gradle_utils.getGradleVersionFor('8.4'), '8.6');
expect(gradle_utils.getGradleVersionFor('8.5'), '8.7');
expect(gradle_utils.getGradleVersionFor('8.7'), '8.9');
expect(gradle_utils.getGradleVersionFor('8.8'), '8.10.2');
expect(gradle_utils.getGradleVersionFor(gradle_utils.maxKnownAgpVersion), '8.11.1');
});

testWithoutContext('throws on unsupported versions', () {
expect(
() => gradle_utils.getGradleVersionFor('3.6.0'),
throwsA(predicate<Exception>((Exception e) => e is ToolExit)),
);
});
});

group('isAppUsingAndroidX', () {
late FileSystem fs;

Expand Down
Loading
Loading