Reland "Upgrade template Gradle, App AGP, Module AGP, and Kotlin versions, and tests"... but no longer upgrade module AGP version (#151433)

Relands https://github.com/flutter/flutter/pull/150969, but removes the upgrade to the module AGP version.

The reason is that a more complicated change is required because in AGP 8.0 software components are no longer generated by default, but rather only generated for variants that are configured to be published using the publishing DSL (see the `android.disableAutomaticComponentCreation` section of https://developer.android.com/build/releases/past-releases/agp-8-0-0-release-notes).

That broke our aar initialization script, because the components didn't exist so the `aar` tasks never got [created here](9ff9c67272/packages/flutter_tools/gradle/aar_init_script.gradle (L29)).

Verified that the one postsubmit that failed now passes (`android_obfuscate_test`)
This commit is contained in:
Gray Mackall 2024-07-10 14:37:26 -07:00 committed by GitHub
parent b0cbfc66ec
commit bb637f3128
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
11 changed files with 168 additions and 33 deletions

View File

@ -1155,7 +1155,7 @@ targets:
{"dependency": "cmake", "version": "build_id:8787856497187628321"},
{"dependency": "goldctl", "version": "git_revision:720a542f6fe4f92922c3b8f0fdcc4d2ac6bb83cd"},
{"dependency": "ninja", "version": "version:1.9.0"},
{"dependency": "open_jdk", "version": "version:11"}
{"dependency": "open_jdk", "version": "version:17"}
]
shard: android_preview_tool_integration_tests
tags: >
@ -1167,6 +1167,32 @@ targets:
- bin/**
- .ci.yaml
- name: Linux android_java11_tool_integration_tests
recipe: flutter/flutter_drone
bringup: true
timeout: 60
properties:
add_recipes_cq: "true"
dependencies: >-
[
{"dependency": "android_sdk", "version": "version:34v3"},
{"dependency": "chrome_and_driver", "version": "version:125.0.6422.141"},
{"dependency": "clang", "version": "git_revision:5d5aba78dbbee75508f01bcaa69aedb2ab79065a"},
{"dependency": "cmake", "version": "build_id:8787856497187628321"},
{"dependency": "goldctl", "version": "git_revision:720a542f6fe4f92922c3b8f0fdcc4d2ac6bb83cd"},
{"dependency": "ninja", "version": "version:1.9.0"},
{"dependency": "open_jdk", "version": "version:11"}
]
shard: android_java11_tool_integration_tests
tags: >
["framework", "hostonly", "shard", "linux"]
test_timeout_secs: "2700"
runIf:
- dev/**
- packages/flutter_tools/**
- bin/**
- .ci.yaml
- name: Linux tool_tests_commands
recipe: flutter/flutter_drone
timeout: 60

View File

@ -333,6 +333,8 @@
# test_ownership @keyonghan
# tool_host_cross_arch_tests @andrewkolos @flutter/tool
# tool_integration_tests @christopherfujino @flutter/tool
# android_preview_tool_integration_tests @gmackall @flutter/android
# android_java11_tool_integration_tests @gmackall @flutter/android
# tool_tests @andrewkolos @flutter/tool
# verify_binaries_codesigned @cbracken @flutter/releases
# web_canvaskit_tests @yjbanov @flutter/web

View File

@ -0,0 +1,25 @@
// Copyright 2014 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:io';
import 'package:path/path.dart' as path;
import '../utils.dart';
Future<void> androidJava11IntegrationToolTestsRunner() async {
final String toolsPath = path.join(flutterRoot, 'packages', 'flutter_tools');
final List<String> allTests = Directory(path.join(toolsPath, 'test', 'android_java11_integration.shard'))
.listSync(recursive: true).whereType<File>()
.map<String>((FileSystemEntity entry) => path.relative(entry.path, from: toolsPath))
.where((String testPath) => path.basename(testPath).endsWith('_test.dart')).toList();
await runDartTest(
toolsPath,
forceSingleCore: true,
testPaths: selectIndexOfTotalSubshard<String>(allTests),
collectMetrics: true,
);
}

View File

@ -59,6 +59,7 @@ import 'package:path/path.dart' as path;
import 'run_command.dart';
import 'suite_runners/run_add_to_app_life_cycle_tests.dart';
import 'suite_runners/run_analyze_tests.dart';
import 'suite_runners/run_android_java11_integration_tool_tests.dart';
import 'suite_runners/run_android_preview_integration_tool_tests.dart';
import 'suite_runners/run_customer_testing_tests.dart';
import 'suite_runners/run_docs_tests.dart';
@ -131,6 +132,7 @@ Future<void> main(List<String> args) async {
'web_tool_tests': _runWebToolTests,
'tool_integration_tests': _runIntegrationToolTests,
'android_preview_tool_integration_tests': androidPreviewIntegrationToolTestsRunner,
'android_java11_tool_integration_tests': androidJava11IntegrationToolTestsRunner,
'tool_host_cross_arch_tests': _runToolHostCrossArchTests,
// All the unit/widget tests run using `flutter test --platform=chrome --web-renderer=html`
'web_tests': webTestsSuite.runWebHtmlUnitTests,

View File

@ -26,10 +26,10 @@ import 'android_sdk.dart';
// However, this currently requires to migrate existing integration tests to the latest supported values.
//
// Please see the README before changing any of these values.
const String templateDefaultGradleVersion = '7.6.3';
const String templateAndroidGradlePluginVersion = '7.3.0';
const String templateDefaultGradleVersion = '8.3';
const String templateAndroidGradlePluginVersion = '8.1.0';
const String templateAndroidGradlePluginVersionForModule = '7.3.0';
const String templateKotlinGradlePluginVersion = '1.7.10';
const String templateKotlinGradlePluginVersion = '1.8.22';
// The Flutter Gradle Plugin is only applied to app projects, and modules that
// are built from source using (`include_flutter.groovy`). The remaining
@ -47,24 +47,24 @@ const String ndkVersion = '23.1.7779620';
// Update these when new major versions of Java are supported by new Gradle
// versions that we support.
// Source of truth: https://docs.gradle.org/current/userguide/compatibility.html
const String oneMajorVersionHigherJavaVersion = '20';
const String oneMajorVersionHigherJavaVersion = '23';
// Update this when new versions of Gradle come out including minor versions
// and should correspond to the maximum Gradle version we test in CI.
//
// Supported here means supported by the tooling for
// flutter analyze --suggestions and does not imply broader flutter support.
const String maxKnownAndSupportedGradleVersion = '8.0.2';
const String maxKnownAndSupportedGradleVersion = '8.7';
// Update this when new versions of AGP come out.
//
// Supported here means tooling is aware of this version's Java <-> AGP
// compatibility.
@visibleForTesting
const String maxKnownAndSupportedAgpVersion = '8.1';
const String maxKnownAndSupportedAgpVersion = '8.4.0';
// Update this when new versions of AGP come out.
const String maxKnownAgpVersion = '8.3';
const String maxKnownAgpVersion = '8.5';
// Oldest documented version of AGP that has a listed minimum
// compatible Java version.
@ -439,6 +439,22 @@ bool validateGradleAndAgp(Logger logger,
}
// Begin Known Gradle <-> AGP validation.
if (isWithinVersionRange(agpV, min: '8.4.0', max: '8.4.99')) {
return isWithinVersionRange(gradleV,
min: '8.6', max: maxKnownAndSupportedGradleVersion);
}
if (isWithinVersionRange(agpV, min: '8.3.0', max: '8.3.99')) {
return isWithinVersionRange(gradleV,
min: '8.4', max: maxKnownAndSupportedGradleVersion);
}
if (isWithinVersionRange(agpV, min: '8.2.0', max: '8.2.99')) {
return isWithinVersionRange(gradleV,
min: '8.2', max: maxKnownAndSupportedGradleVersion);
}
if (isWithinVersionRange(agpV, min: '8.0.0', max: '8.1.99')) {
return isWithinVersionRange(gradleV,
min: '8.0', max: maxKnownAndSupportedGradleVersion);
}
// Max agp here is a made up version to contain all 7.4 changes.
if (isWithinVersionRange(agpV, min: '7.4', max: '7.5')) {
return isWithinVersionRange(gradleV,
@ -692,7 +708,13 @@ String getGradleVersionFor(String androidPluginVersion) {
GradleForAgp(agpMin: '4.0.0', agpMax: '4.1.0', minRequiredGradle: '6.7'),
// 7.5 is a made up value to include everything through 7.4.*
GradleForAgp(agpMin: '7.0.0', agpMax: '7.5', minRequiredGradle: '7.5'),
GradleForAgp(agpMin: '7.5.0', agpMax: '100.100', minRequiredGradle: '8.0'),
// Use 0 and 99 as a patch values to signify every AGP patch version with
// that major and minor version.
GradleForAgp(agpMin: '8.0.0', agpMax: '8.1.99', minRequiredGradle: '8.0'),
GradleForAgp(agpMin: '8.2.0', agpMax: '8.2.99', minRequiredGradle: '8.2'),
GradleForAgp(agpMin: '8.3.0', agpMax: '8.3.99', minRequiredGradle: '8.4'),
GradleForAgp(agpMin: '8.4.0', agpMax: '8.4.99', minRequiredGradle: '8.6'),
GradleForAgp(agpMin: '8.5.0', agpMax: '100.100', minRequiredGradle: '8.7'),
// Assume if AGP is newer than this code know about return the highest gradle
// version we know about.
GradleForAgp(agpMin: maxKnownAgpVersion, agpMax: maxKnownAgpVersion, minRequiredGradle: maxKnownAndSupportedGradleVersion),
@ -882,6 +904,24 @@ String getGradlewFileName(Platform platform) {
/// of Gradle, as https://docs.gradle.org/current/userguide/compatibility.html
/// details.
List<JavaGradleCompat> _javaGradleCompatList = const <JavaGradleCompat>[
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',

View File

@ -3759,7 +3759,7 @@ void main() {
logger.clear();
}
}, overrides: <Type, Generator>{
Java: () => FakeJava(version: const software.Version.withText(14, 0, 0, '14.0.0')), // Middle compatible Java version with current template AGP/Gradle versions.
Java: () => FakeJava(version: const software.Version.withText(20, 0, 0, '20.0.0')), // Middle compatible Java version with current template AGP/Gradle versions.
Logger: () => logger,
});
@ -3786,7 +3786,7 @@ void main() {
logger.clear();
}
}, overrides: <Type, Generator>{
Java: () => FakeJava(version: const software.Version.withText(17, 0, 0, '18.0.0')), // Maximum compatible Java version with current template AGP/Gradle versions.
Java: () => FakeJava(version: const software.Version.withText(17, 0, 0, '22.0.0')), // Maximum compatible Java version with current template AGP/Gradle versions.
Logger: () => logger,
});
@ -3813,7 +3813,7 @@ void main() {
logger.clear();
}
}, overrides: <Type, Generator>{
Java: () => FakeJava(version: const software.Version.withText(11, 0, 0, '11.0.0')), // Minimum compatible Java version with current template AGP/Gradle versions.
Java: () => FakeJava(version: const software.Version.withText(17, 0, 0, '17.0.0')), // Minimum compatible Java version with current template AGP/Gradle versions.
Logger: () => logger,
});

View File

@ -913,10 +913,10 @@ A problem occurred evaluating project ':app'.
'│ To fix this issue, replace the following content: │\n'
'│ /android/build.gradle: │\n'
"│ - classpath 'com.android.tools.build:gradle:<current-version>' │\n"
"│ + classpath 'com.android.tools.build:gradle:7.3.0' │\n"
"│ + classpath 'com.android.tools.build:gradle:$templateAndroidGradlePluginVersion' │\n"
'│ /android/gradle/wrapper/gradle-wrapper.properties: │\n'
'│ - https://services.gradle.org/distributions/gradle-<current-version>-all.zip │\n'
'│ + https://services.gradle.org/distributions/gradle-7.6.3-all.zip\n'
'│ + https://services.gradle.org/distributions/gradle-$templateDefaultGradleVersion-all.zip \n'
'└──────────────────────────────────────────────────────────────────────────────────┘\n'
)
);

View File

@ -4,6 +4,7 @@
import 'package:file/memory.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/base/file_system.dart';
import 'package:flutter_tools/src/base/logger.dart';
import 'package:flutter_tools/src/build_info.dart';
@ -530,7 +531,7 @@ void main() {
Event.flutterBuildInfo(
label: 'gradle-expected-file-not-found',
buildType: 'gradle',
settings: 'androidGradlePluginVersion: 7.6.3, fileExtension: .aab',
settings: 'androidGradlePluginVersion: ${gradle_utils.templateDefaultGradleVersion}, fileExtension: .aab',
),
),
);

View File

@ -546,9 +546,9 @@ flutter:
});
});
group('gradgradle_utils.le version', () {
group('gradle version', () {
testWithoutContext('should be compatible with the Android plugin version', () {
// Grangradle_utils.ular versions.
// 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');
@ -558,7 +558,7 @@ flutter:
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');
// Versgradle_utils.ion Ranges.
// Version Ranges.
expect(gradle_utils.getGradleVersionFor('1.2.0'), '2.9');
expect(gradle_utils.getGradleVersionFor('1.3.1'), '2.9');
@ -592,7 +592,11 @@ flutter:
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(gradle_utils.maxKnownAgpVersion), '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(gradle_utils.maxKnownAgpVersion), '8.7');
});
testWithoutContext('throws on unsupported versions', () {

View File

@ -82,7 +82,7 @@ void main() {
'distributionPath=wrapper/dists\n'
'zipStoreBase=GRADLE_USER_HOME\n'
'zipStorePath=wrapper/dists\n'
'distributionUrl=https\\://services.gradle.org/distributions/gradle-7.6.3-all.zip\n');
'distributionUrl=https\\://services.gradle.org/distributions/gradle-$templateDefaultGradleVersion-all.zip\n');
});
testWithoutContext('injects the wrapper when some files are missing', () {
@ -127,7 +127,7 @@ void main() {
'distributionPath=wrapper/dists\n'
'zipStoreBase=GRADLE_USER_HOME\n'
'zipStorePath=wrapper/dists\n'
'distributionUrl=https\\://services.gradle.org/distributions/gradle-7.6.3-all.zip\n');
'distributionUrl=https\\://services.gradle.org/distributions/gradle-$templateDefaultGradleVersion-all.zip\n');
});
testWithoutContext(
@ -967,19 +967,22 @@ allprojects {
JavaAgpTestData(true, javaVersion: '18', agpVersion: '4.2'),
// Strictly too new AGP versions.
// *The tests that follow need to be updated* when max supported AGP versions are updated:
JavaAgpTestData(false, javaVersion: '24', agpVersion: '8.3'),
JavaAgpTestData(false, javaVersion: '20', agpVersion: '8.3'),
JavaAgpTestData(false, javaVersion: '17', agpVersion: '8.3'),
JavaAgpTestData(false, javaVersion: '24', agpVersion: '8.5'),
JavaAgpTestData(false, javaVersion: '20', agpVersion: '8.5'),
JavaAgpTestData(false, javaVersion: '17', agpVersion: '8.5'),
// Java 17 & patch versions compatibility cases
// *The tests that follow need to be updated* when maxKnownAndSupportedAgpVersion is
// updated:
JavaAgpTestData(false, javaVersion: '17', agpVersion: '8.2'),
JavaAgpTestData(false, javaVersion: '17', agpVersion: '8.5'),
JavaAgpTestData(true, javaVersion: '17', agpVersion: maxKnownAndSupportedAgpVersion),
JavaAgpTestData(true, javaVersion: '17', agpVersion: '8.3'),
JavaAgpTestData(true, javaVersion: '17', agpVersion: '8.1'),
JavaAgpTestData(true, javaVersion: '17', agpVersion: '8.0'),
JavaAgpTestData(true, javaVersion: '17', agpVersion: '7.4'),
JavaAgpTestData(false, javaVersion: '17.0.3', agpVersion: '8.2'),
JavaAgpTestData(false, javaVersion: '17.0.3', agpVersion: '8.5'),
JavaAgpTestData(true, javaVersion: '17.0.3', agpVersion: maxKnownAndSupportedAgpVersion),
JavaAgpTestData(true, javaVersion: '17.0.3', agpVersion: '8.3'),
JavaAgpTestData(true, javaVersion: '17.0.3', agpVersion: '8.2'),
JavaAgpTestData(true, javaVersion: '17.0.3', agpVersion: '8.1'),
JavaAgpTestData(true, javaVersion: '17.0.3', agpVersion: '8.0'),
JavaAgpTestData(true, javaVersion: '17.0.3', agpVersion: '7.4'),
@ -1030,11 +1033,41 @@ allprojects {
// Maximum known Java version.
// *The test case that follows needs to be updated* when higher versions of Java are supported:
expect(
getValidGradleVersionRangeForJavaVersion(testLogger, javaV: '20'),
getValidGradleVersionRangeForJavaVersion(testLogger, javaV: '23'),
allOf(
equals(getValidGradleVersionRangeForJavaVersion(testLogger, javaV: '20.0.2')),
equals(getValidGradleVersionRangeForJavaVersion(testLogger, javaV: '23.0.2')),
isNull));
// Known supported Java versions.
expect(
getValidGradleVersionRangeForJavaVersion(testLogger, javaV: '22'),
allOf(
equals(getValidGradleVersionRangeForJavaVersion(testLogger, javaV: '22.0.2')),
equals(
const JavaGradleCompat(
javaMin: '22',
javaMax: '23',
gradleMin: '8.7',
gradleMax: maxKnownAndSupportedGradleVersion))));
expect(
getValidGradleVersionRangeForJavaVersion(testLogger, javaV: '21'),
allOf(
equals(getValidGradleVersionRangeForJavaVersion(testLogger, javaV: '21.0.2')),
equals(
const JavaGradleCompat(
javaMin: '21',
javaMax: '22',
gradleMin: '8.4',
gradleMax: maxKnownAndSupportedGradleVersion))));
expect(
getValidGradleVersionRangeForJavaVersion(testLogger, javaV: '20'),
allOf(
equals(getValidGradleVersionRangeForJavaVersion(testLogger, javaV: '20.0.2')),
equals(
const JavaGradleCompat(
javaMin: '20',
javaMax: '21',
gradleMin: '8.1',
gradleMax: maxKnownAndSupportedGradleVersion))));
expect(
getValidGradleVersionRangeForJavaVersion(testLogger, javaV: '19'),
allOf(
@ -1175,7 +1208,7 @@ allprojects {
javaMin: '17',
javaDefault: '17',
agpMin: '8.0',
agpMax: '8.1')));
agpMax: maxKnownAndSupportedAgpVersion)));
// Known Java versions.
expect(
getMinimumAgpVersionForJavaVersion(testLogger, javaV: '17'),
@ -1186,7 +1219,7 @@ allprojects {
javaMin: '17',
javaDefault: '17',
agpMin: '8.0',
agpMax: '8.1'))));
agpMax: maxKnownAndSupportedAgpVersion))));
expect(
getMinimumAgpVersionForJavaVersion(testLogger, javaV: '15'),
allOf(
@ -1242,13 +1275,13 @@ allprojects {
expect(getJavaVersionFor(gradleV: '1.9', agpV: '4.2'), equals(const VersionRange('1.8', null)));
expect(getJavaVersionFor(gradleV: '2.0', agpV: '4.1'), equals(const VersionRange(null, '1.9')));
// Strictly too new Gradle and AGP versions.
expect(getJavaVersionFor(gradleV: '8.1', agpV: '8.2'), equals(const VersionRange(null, null)));
expect(getJavaVersionFor(gradleV: '8.8', agpV: '8.6'), equals(const VersionRange(null, null)));
// Strictly too new Gradle version and maximum version of AGP.
//*This test case will need its expected Java range updated when a new version of AGP is supported.*
expect(getJavaVersionFor(gradleV: '8.1', agpV: maxKnownAndSupportedAgpVersion), equals(const VersionRange('17', null)));
expect(getJavaVersionFor(gradleV: '8.8', agpV: maxKnownAndSupportedAgpVersion), equals(const VersionRange('17', null)));
// Strictly too new AGP version and maximum version of Gradle.
//*This test case will need its expected Java range updated when a new version of Gradle is supported.*
expect(getJavaVersionFor(gradleV: maxKnownAndSupportedGradleVersion, agpV: '8.2'), equals(const VersionRange(null, '20')));
expect(getJavaVersionFor(gradleV: maxKnownAndSupportedGradleVersion, agpV: '8.6'), equals(const VersionRange(null, '23')));
// Tests with a known compatible Gradle/AGP version pair.
expect(getJavaVersionFor(gradleV: '7.0', agpV: '7.2'), equals(const VersionRange('11', '17')));
expect(getJavaVersionFor(gradleV: '7.1', agpV: '7.2'), equals(const VersionRange('11', '17')));
@ -1256,6 +1289,8 @@ allprojects {
expect(getJavaVersionFor(gradleV: '7.1', agpV: '7.0'), equals(const VersionRange('11', '17')));
expect(getJavaVersionFor(gradleV: '7.1', agpV: '7.2'), equals(const VersionRange('11', '17')));
expect(getJavaVersionFor(gradleV: '7.1', agpV: '7.4'), equals(const VersionRange('11', '17')));
expect(getJavaVersionFor(gradleV: '8.4', agpV: '8.1'), equals(const VersionRange('17', '22')));
expect(getJavaVersionFor(gradleV: '8.7', agpV: '8.1'), equals(const VersionRange('17', '23')));
});
});
}