diff --git a/dev/a11y_assessments/android/build.gradle b/dev/a11y_assessments/android/build.gradle index a9cc5e6a9cf..c56251bb0a1 100644 --- a/dev/a11y_assessments/android/build.gradle +++ b/dev/a11y_assessments/android/build.gradle @@ -23,7 +23,8 @@ subprojects { dependencyLocking { ignoredDependencies.add('io.flutter:*') lockFile = file("${rootProject.projectDir}/project-${project.name}.lockfile") - if (!project.hasProperty('local-engine-repo')) { + def ignoreFile = file("${rootProject.projectDir}/.ignore-locking.md") + if (!ignoreFile.exists() && !project.hasProperty('local-engine-repo')) { lockAllConfigurations() } } diff --git a/dev/benchmarks/complex_layout/android/build.gradle b/dev/benchmarks/complex_layout/android/build.gradle index a9cc5e6a9cf..c56251bb0a1 100644 --- a/dev/benchmarks/complex_layout/android/build.gradle +++ b/dev/benchmarks/complex_layout/android/build.gradle @@ -23,7 +23,8 @@ subprojects { dependencyLocking { ignoredDependencies.add('io.flutter:*') lockFile = file("${rootProject.projectDir}/project-${project.name}.lockfile") - if (!project.hasProperty('local-engine-repo')) { + def ignoreFile = file("${rootProject.projectDir}/.ignore-locking.md") + if (!ignoreFile.exists() && !project.hasProperty('local-engine-repo')) { lockAllConfigurations() } } diff --git a/dev/benchmarks/macrobenchmarks/android/build.gradle b/dev/benchmarks/macrobenchmarks/android/build.gradle index a9cc5e6a9cf..c56251bb0a1 100644 --- a/dev/benchmarks/macrobenchmarks/android/build.gradle +++ b/dev/benchmarks/macrobenchmarks/android/build.gradle @@ -23,7 +23,8 @@ subprojects { dependencyLocking { ignoredDependencies.add('io.flutter:*') lockFile = file("${rootProject.projectDir}/project-${project.name}.lockfile") - if (!project.hasProperty('local-engine-repo')) { + def ignoreFile = file("${rootProject.projectDir}/.ignore-locking.md") + if (!ignoreFile.exists() && !project.hasProperty('local-engine-repo')) { lockAllConfigurations() } } diff --git a/dev/benchmarks/platform_views_layout/android/build.gradle b/dev/benchmarks/platform_views_layout/android/build.gradle index a9cc5e6a9cf..c56251bb0a1 100644 --- a/dev/benchmarks/platform_views_layout/android/build.gradle +++ b/dev/benchmarks/platform_views_layout/android/build.gradle @@ -23,7 +23,8 @@ subprojects { dependencyLocking { ignoredDependencies.add('io.flutter:*') lockFile = file("${rootProject.projectDir}/project-${project.name}.lockfile") - if (!project.hasProperty('local-engine-repo')) { + def ignoreFile = file("${rootProject.projectDir}/.ignore-locking.md") + if (!ignoreFile.exists() && !project.hasProperty('local-engine-repo')) { lockAllConfigurations() } } diff --git a/dev/benchmarks/platform_views_layout_hybrid_composition/android/build.gradle b/dev/benchmarks/platform_views_layout_hybrid_composition/android/build.gradle index a9cc5e6a9cf..c56251bb0a1 100644 --- a/dev/benchmarks/platform_views_layout_hybrid_composition/android/build.gradle +++ b/dev/benchmarks/platform_views_layout_hybrid_composition/android/build.gradle @@ -23,7 +23,8 @@ subprojects { dependencyLocking { ignoredDependencies.add('io.flutter:*') lockFile = file("${rootProject.projectDir}/project-${project.name}.lockfile") - if (!project.hasProperty('local-engine-repo')) { + def ignoreFile = file("${rootProject.projectDir}/.ignore-locking.md") + if (!ignoreFile.exists() && !project.hasProperty('local-engine-repo')) { lockAllConfigurations() } } diff --git a/dev/benchmarks/test_apps/stocks/android/build.gradle b/dev/benchmarks/test_apps/stocks/android/build.gradle index a9cc5e6a9cf..c56251bb0a1 100644 --- a/dev/benchmarks/test_apps/stocks/android/build.gradle +++ b/dev/benchmarks/test_apps/stocks/android/build.gradle @@ -23,7 +23,8 @@ subprojects { dependencyLocking { ignoredDependencies.add('io.flutter:*') lockFile = file("${rootProject.projectDir}/project-${project.name}.lockfile") - if (!project.hasProperty('local-engine-repo')) { + def ignoreFile = file("${rootProject.projectDir}/.ignore-locking.md") + if (!ignoreFile.exists() && !project.hasProperty('local-engine-repo')) { lockAllConfigurations() } } diff --git a/dev/integration_tests/android_semantics_testing/android/build.gradle b/dev/integration_tests/android_semantics_testing/android/build.gradle index a9cc5e6a9cf..c56251bb0a1 100644 --- a/dev/integration_tests/android_semantics_testing/android/build.gradle +++ b/dev/integration_tests/android_semantics_testing/android/build.gradle @@ -23,7 +23,8 @@ subprojects { dependencyLocking { ignoredDependencies.add('io.flutter:*') lockFile = file("${rootProject.projectDir}/project-${project.name}.lockfile") - if (!project.hasProperty('local-engine-repo')) { + def ignoreFile = file("${rootProject.projectDir}/.ignore-locking.md") + if (!ignoreFile.exists() && !project.hasProperty('local-engine-repo')) { lockAllConfigurations() } } diff --git a/dev/integration_tests/android_verified_input/android/build.gradle b/dev/integration_tests/android_verified_input/android/build.gradle index a9cc5e6a9cf..c56251bb0a1 100644 --- a/dev/integration_tests/android_verified_input/android/build.gradle +++ b/dev/integration_tests/android_verified_input/android/build.gradle @@ -23,7 +23,8 @@ subprojects { dependencyLocking { ignoredDependencies.add('io.flutter:*') lockFile = file("${rootProject.projectDir}/project-${project.name}.lockfile") - if (!project.hasProperty('local-engine-repo')) { + def ignoreFile = file("${rootProject.projectDir}/.ignore-locking.md") + if (!ignoreFile.exists() && !project.hasProperty('local-engine-repo')) { lockAllConfigurations() } } diff --git a/dev/integration_tests/android_views/android/build.gradle b/dev/integration_tests/android_views/android/build.gradle index a9cc5e6a9cf..c56251bb0a1 100644 --- a/dev/integration_tests/android_views/android/build.gradle +++ b/dev/integration_tests/android_views/android/build.gradle @@ -23,7 +23,8 @@ subprojects { dependencyLocking { ignoredDependencies.add('io.flutter:*') lockFile = file("${rootProject.projectDir}/project-${project.name}.lockfile") - if (!project.hasProperty('local-engine-repo')) { + def ignoreFile = file("${rootProject.projectDir}/.ignore-locking.md") + if (!ignoreFile.exists() && !project.hasProperty('local-engine-repo')) { lockAllConfigurations() } } diff --git a/dev/integration_tests/channels/android/build.gradle b/dev/integration_tests/channels/android/build.gradle index a9cc5e6a9cf..c56251bb0a1 100644 --- a/dev/integration_tests/channels/android/build.gradle +++ b/dev/integration_tests/channels/android/build.gradle @@ -23,7 +23,8 @@ subprojects { dependencyLocking { ignoredDependencies.add('io.flutter:*') lockFile = file("${rootProject.projectDir}/project-${project.name}.lockfile") - if (!project.hasProperty('local-engine-repo')) { + def ignoreFile = file("${rootProject.projectDir}/.ignore-locking.md") + if (!ignoreFile.exists() && !project.hasProperty('local-engine-repo')) { lockAllConfigurations() } } diff --git a/dev/integration_tests/display_cutout_rotation/android/build.gradle.kts b/dev/integration_tests/display_cutout_rotation/android/build.gradle.kts index cfbd086c704..6acee49462b 100644 --- a/dev/integration_tests/display_cutout_rotation/android/build.gradle.kts +++ b/dev/integration_tests/display_cutout_rotation/android/build.gradle.kts @@ -31,7 +31,8 @@ subprojects { dependencyLocking { ignoredDependencies.add("io.flutter:*") lockFile = file("${rootProject.projectDir}/project-${project.name}.lockfile") - if (!project.hasProperty("local-engine-repo")) { + var ignoreFile = file("${rootProject.projectDir}/.ignore-locking.md") + if (!ignoreFile.exists() && !project.hasProperty("local-engine-repo")) { lockAllConfigurations() } } diff --git a/dev/integration_tests/flavors/android/build.gradle b/dev/integration_tests/flavors/android/build.gradle index a9cc5e6a9cf..c56251bb0a1 100644 --- a/dev/integration_tests/flavors/android/build.gradle +++ b/dev/integration_tests/flavors/android/build.gradle @@ -23,7 +23,8 @@ subprojects { dependencyLocking { ignoredDependencies.add('io.flutter:*') lockFile = file("${rootProject.projectDir}/project-${project.name}.lockfile") - if (!project.hasProperty('local-engine-repo')) { + def ignoreFile = file("${rootProject.projectDir}/.ignore-locking.md") + if (!ignoreFile.exists() && !project.hasProperty('local-engine-repo')) { lockAllConfigurations() } } diff --git a/dev/integration_tests/flutter_gallery/android/build.gradle b/dev/integration_tests/flutter_gallery/android/build.gradle index a9cc5e6a9cf..c56251bb0a1 100644 --- a/dev/integration_tests/flutter_gallery/android/build.gradle +++ b/dev/integration_tests/flutter_gallery/android/build.gradle @@ -23,7 +23,8 @@ subprojects { dependencyLocking { ignoredDependencies.add('io.flutter:*') lockFile = file("${rootProject.projectDir}/project-${project.name}.lockfile") - if (!project.hasProperty('local-engine-repo')) { + def ignoreFile = file("${rootProject.projectDir}/.ignore-locking.md") + if (!ignoreFile.exists() && !project.hasProperty('local-engine-repo')) { lockAllConfigurations() } } diff --git a/dev/integration_tests/platform_interaction/android/build.gradle b/dev/integration_tests/platform_interaction/android/build.gradle index a9cc5e6a9cf..c56251bb0a1 100644 --- a/dev/integration_tests/platform_interaction/android/build.gradle +++ b/dev/integration_tests/platform_interaction/android/build.gradle @@ -23,7 +23,8 @@ subprojects { dependencyLocking { ignoredDependencies.add('io.flutter:*') lockFile = file("${rootProject.projectDir}/project-${project.name}.lockfile") - if (!project.hasProperty('local-engine-repo')) { + def ignoreFile = file("${rootProject.projectDir}/.ignore-locking.md") + if (!ignoreFile.exists() && !project.hasProperty('local-engine-repo')) { lockAllConfigurations() } } diff --git a/dev/integration_tests/release_smoke_test/android/build.gradle b/dev/integration_tests/release_smoke_test/android/build.gradle index a9cc5e6a9cf..c56251bb0a1 100644 --- a/dev/integration_tests/release_smoke_test/android/build.gradle +++ b/dev/integration_tests/release_smoke_test/android/build.gradle @@ -23,7 +23,8 @@ subprojects { dependencyLocking { ignoredDependencies.add('io.flutter:*') lockFile = file("${rootProject.projectDir}/project-${project.name}.lockfile") - if (!project.hasProperty('local-engine-repo')) { + def ignoreFile = file("${rootProject.projectDir}/.ignore-locking.md") + if (!ignoreFile.exists() && !project.hasProperty('local-engine-repo')) { lockAllConfigurations() } } diff --git a/dev/integration_tests/spell_check/android/build.gradle b/dev/integration_tests/spell_check/android/build.gradle index a9cc5e6a9cf..c56251bb0a1 100644 --- a/dev/integration_tests/spell_check/android/build.gradle +++ b/dev/integration_tests/spell_check/android/build.gradle @@ -23,7 +23,8 @@ subprojects { dependencyLocking { ignoredDependencies.add('io.flutter:*') lockFile = file("${rootProject.projectDir}/project-${project.name}.lockfile") - if (!project.hasProperty('local-engine-repo')) { + def ignoreFile = file("${rootProject.projectDir}/.ignore-locking.md") + if (!ignoreFile.exists() && !project.hasProperty('local-engine-repo')) { lockAllConfigurations() } } diff --git a/dev/integration_tests/ui/android/build.gradle b/dev/integration_tests/ui/android/build.gradle index a9cc5e6a9cf..c56251bb0a1 100644 --- a/dev/integration_tests/ui/android/build.gradle +++ b/dev/integration_tests/ui/android/build.gradle @@ -23,7 +23,8 @@ subprojects { dependencyLocking { ignoredDependencies.add('io.flutter:*') lockFile = file("${rootProject.projectDir}/project-${project.name}.lockfile") - if (!project.hasProperty('local-engine-repo')) { + def ignoreFile = file("${rootProject.projectDir}/.ignore-locking.md") + if (!ignoreFile.exists() && !project.hasProperty('local-engine-repo')) { lockAllConfigurations() } } diff --git a/dev/manual_tests/android/build.gradle b/dev/manual_tests/android/build.gradle index a9cc5e6a9cf..c56251bb0a1 100644 --- a/dev/manual_tests/android/build.gradle +++ b/dev/manual_tests/android/build.gradle @@ -23,7 +23,8 @@ subprojects { dependencyLocking { ignoredDependencies.add('io.flutter:*') lockFile = file("${rootProject.projectDir}/project-${project.name}.lockfile") - if (!project.hasProperty('local-engine-repo')) { + def ignoreFile = file("${rootProject.projectDir}/.ignore-locking.md") + if (!ignoreFile.exists() && !project.hasProperty('local-engine-repo')) { lockAllConfigurations() } } diff --git a/dev/tools/bin/generate_gradle_lockfiles.dart b/dev/tools/bin/generate_gradle_lockfiles.dart index 77567ac7bc3..73dc1a57caa 100644 --- a/dev/tools/bin/generate_gradle_lockfiles.dart +++ b/dev/tools/bin/generate_gradle_lockfiles.dart @@ -26,6 +26,8 @@ void main(List arguments) { 'defined at dev/tools/bin/config/lockfile_exclusion.yaml.\n' 'To disable this behavior, run with `--no-exclusion`.\n'; + const String ignoreFilename = '.ignore-locking.md'; + final ArgParser argParser = ArgParser() ..addFlag( 'gradle-generation', @@ -37,7 +39,12 @@ void main(List arguments) { help: 'Run the script using the config file at ./configs/lockfile_exclusion.yaml to skip the specified subdirectories.', defaultsTo: true, - ); + ) + ..addOption( + 'ignore-locking', + help: 'Reason to disable gradle dependency locking. A reason must be given.', + ) + ..addFlag('stop-ignoring', help: 'Delete the ignore lockfile if it exists'); ArgResults args; try { @@ -56,6 +63,27 @@ void main(List arguments) { // Skip android subdirectories specified in the ./config/lockfile_exclusion.yaml file. final bool useExclusion = (args['exclusion'] as bool?) ?? true; + final bool ignoreLocking = args['ignore-locking'] != null; + final String ignoreReason = (args['ignore-locking'] as String?) ?? ''; + // This is an explicit flag that insures the ignore + // lockfile isn't deleted unless specified. This should prevent + // automated scripts from deleting the file when they shouldn't. + final bool stopIgnoring = (args['stop-ignoring'] as bool?) ?? false; + + if (ignoreLocking && ignoreReason.isEmpty) { + stderr.writeln('A reason must be provided for --ignore-locking.'); + stderr.writeln(usageMessage); + exit(1); + } + + if (ignoreLocking && stopIgnoring) { + stderr.writeln( + 'Both --ignore-locking and --stop-ignoring cannot be used on the same invocation.', + ); + stderr.writeln(usageMessage); + exit(1); + } + const FileSystem fileSystem = LocalFileSystem(); final Directory repoRoot = (() { @@ -164,6 +192,17 @@ void main(List arguments) { print('Processing ${androidDirectory.path}'); + final File ignoreFile = androidDirectory.childFile(ignoreFilename); + if (ignoreLocking) { + print('Writing ignore file in ${ignoreFile.path}'); + ignoreFile.writeAsStringSync(ignoreReason); + // When ignoring locking, we do not want to actually generate + // the lockfiles + continue; + } else if (stopIgnoring && ignoreFile.existsSync()) { + ignoreFile.deleteSync(); + } + try { androidDirectory.childFile('buildscript-gradle.lockfile').deleteSync(); } on FileSystemException { @@ -243,7 +282,8 @@ subprojects { dependencyLocking { ignoredDependencies.add('io.flutter:*') lockFile = file("${rootProject.projectDir}/project-${project.name}.lockfile") - if (!project.hasProperty('local-engine-repo')) { + def ignoreFile = file("${rootProject.projectDir}/.ignore-locking.md") + if (!ignoreFile.exists() && !project.hasProperty('local-engine-repo')) { lockAllConfigurations() } } @@ -336,7 +376,8 @@ subprojects { dependencyLocking { ignoredDependencies.add("io.flutter:*") lockFile = file("${rootProject.projectDir}/project-${project.name}.lockfile") - if (!project.hasProperty("local-engine-repo")) { + var ignoreFile = file("${rootProject.projectDir}/.ignore-locking.md") + if (!ignoreFile.exists() && !project.hasProperty("local-engine-repo")) { lockAllConfigurations() } } diff --git a/engine/src/flutter/tools/cipd/android_embedding_bundle/README.md b/engine/src/flutter/tools/cipd/android_embedding_bundle/README.md index f1d99fe2aed..5994acf96c9 100644 --- a/engine/src/flutter/tools/cipd/android_embedding_bundle/README.md +++ b/engine/src/flutter/tools/cipd/android_embedding_bundle/README.md @@ -34,11 +34,17 @@ below explain how to fetch the license information for the dependencies. new tag: `last_updated:"$version_tag"`. 1. Update the GN list `embedding_dependencies_jars` in `src/flutter/shell/platform/android/BUILD.gn`. - -## Updating Gradle Lockfiles in the Framework After Adding Dependencies -If you land a pr that changes the versions of the embedding dependencies, -or adds a new dependency and makes use of it, you will also need to -perform a manual roll of that change to the framework that re-generates -the Gradle lockfiles using the script at -`/dev/tools/bin/generate_gradle_lockfiles.dart` -(run with the `--no-gradle-generation` and `--no-exclusion` flags). \ No newline at end of file +1. The Gradle lockfiles will need to be updated, but they cannot be + updated in this PR. They will need to be updated in a follow-up + PR. Instead run + `/dev/tools/bin/generate_gradle_lockfiles.dart + --no-gradle-generation --no-exclusion --ignore-locking=Reason: `. + Replace with a link to an issue. This will create a + '.ignore-locking.md' file that will disable Grdle locking and allow + tests to pass without locking. +1. Once the initial PR is submitted, you will need to create a follow-up + PR that updates the Gradle lockfiles and deletes the ignore file. + Run + `/dev/tools/bin/generate_gradle_lockfiles.dart + --no-gradle-generation --no-exclusion --stop-ignoring` to delete the + ignore file and update the Gradle lockfiles. Submit this PR as well. diff --git a/examples/flutter_view/android/build.gradle b/examples/flutter_view/android/build.gradle index a9cc5e6a9cf..c56251bb0a1 100644 --- a/examples/flutter_view/android/build.gradle +++ b/examples/flutter_view/android/build.gradle @@ -23,7 +23,8 @@ subprojects { dependencyLocking { ignoredDependencies.add('io.flutter:*') lockFile = file("${rootProject.projectDir}/project-${project.name}.lockfile") - if (!project.hasProperty('local-engine-repo')) { + def ignoreFile = file("${rootProject.projectDir}/.ignore-locking.md") + if (!ignoreFile.exists() && !project.hasProperty('local-engine-repo')) { lockAllConfigurations() } } diff --git a/examples/hello_world/android/build.gradle.kts b/examples/hello_world/android/build.gradle.kts index cfbd086c704..6acee49462b 100644 --- a/examples/hello_world/android/build.gradle.kts +++ b/examples/hello_world/android/build.gradle.kts @@ -31,7 +31,8 @@ subprojects { dependencyLocking { ignoredDependencies.add("io.flutter:*") lockFile = file("${rootProject.projectDir}/project-${project.name}.lockfile") - if (!project.hasProperty("local-engine-repo")) { + var ignoreFile = file("${rootProject.projectDir}/.ignore-locking.md") + if (!ignoreFile.exists() && !project.hasProperty("local-engine-repo")) { lockAllConfigurations() } } diff --git a/examples/image_list/android/build.gradle b/examples/image_list/android/build.gradle index a9cc5e6a9cf..c56251bb0a1 100644 --- a/examples/image_list/android/build.gradle +++ b/examples/image_list/android/build.gradle @@ -23,7 +23,8 @@ subprojects { dependencyLocking { ignoredDependencies.add('io.flutter:*') lockFile = file("${rootProject.projectDir}/project-${project.name}.lockfile") - if (!project.hasProperty('local-engine-repo')) { + def ignoreFile = file("${rootProject.projectDir}/.ignore-locking.md") + if (!ignoreFile.exists() && !project.hasProperty('local-engine-repo')) { lockAllConfigurations() } } diff --git a/examples/layers/android/build.gradle b/examples/layers/android/build.gradle index a9cc5e6a9cf..c56251bb0a1 100644 --- a/examples/layers/android/build.gradle +++ b/examples/layers/android/build.gradle @@ -23,7 +23,8 @@ subprojects { dependencyLocking { ignoredDependencies.add('io.flutter:*') lockFile = file("${rootProject.projectDir}/project-${project.name}.lockfile") - if (!project.hasProperty('local-engine-repo')) { + def ignoreFile = file("${rootProject.projectDir}/.ignore-locking.md") + if (!ignoreFile.exists() && !project.hasProperty('local-engine-repo')) { lockAllConfigurations() } } diff --git a/examples/platform_channel/android/build.gradle b/examples/platform_channel/android/build.gradle index a9cc5e6a9cf..c56251bb0a1 100644 --- a/examples/platform_channel/android/build.gradle +++ b/examples/platform_channel/android/build.gradle @@ -23,7 +23,8 @@ subprojects { dependencyLocking { ignoredDependencies.add('io.flutter:*') lockFile = file("${rootProject.projectDir}/project-${project.name}.lockfile") - if (!project.hasProperty('local-engine-repo')) { + def ignoreFile = file("${rootProject.projectDir}/.ignore-locking.md") + if (!ignoreFile.exists() && !project.hasProperty('local-engine-repo')) { lockAllConfigurations() } } diff --git a/examples/platform_view/android/build.gradle b/examples/platform_view/android/build.gradle index a9cc5e6a9cf..c56251bb0a1 100644 --- a/examples/platform_view/android/build.gradle +++ b/examples/platform_view/android/build.gradle @@ -23,7 +23,8 @@ subprojects { dependencyLocking { ignoredDependencies.add('io.flutter:*') lockFile = file("${rootProject.projectDir}/project-${project.name}.lockfile") - if (!project.hasProperty('local-engine-repo')) { + def ignoreFile = file("${rootProject.projectDir}/.ignore-locking.md") + if (!ignoreFile.exists() && !project.hasProperty('local-engine-repo')) { lockAllConfigurations() } } diff --git a/packages/integration_test/example/android/build.gradle.kts b/packages/integration_test/example/android/build.gradle.kts index cfbd086c704..6acee49462b 100644 --- a/packages/integration_test/example/android/build.gradle.kts +++ b/packages/integration_test/example/android/build.gradle.kts @@ -31,7 +31,8 @@ subprojects { dependencyLocking { ignoredDependencies.add("io.flutter:*") lockFile = file("${rootProject.projectDir}/project-${project.name}.lockfile") - if (!project.hasProperty("local-engine-repo")) { + var ignoreFile = file("${rootProject.projectDir}/.ignore-locking.md") + if (!ignoreFile.exists() && !project.hasProperty("local-engine-repo")) { lockAllConfigurations() } }