From 22a11216f9646750a5d677cc423d9906608c4b62 Mon Sep 17 00:00:00 2001 From: Inaki Villar Date: Wed, 18 Jan 2023 13:00:05 -0800 Subject: [PATCH 1/5] including again the JdkImageWorkaround --- .../workarounds/JdkImageWorkaround.groovy | 25 ++++++++++++++----- .../org/gradle/android/WorkaroundTest.groovy | 4 +-- 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/src/main/groovy/org/gradle/android/workarounds/JdkImageWorkaround.groovy b/src/main/groovy/org/gradle/android/workarounds/JdkImageWorkaround.groovy index 83553cda..ef670005 100644 --- a/src/main/groovy/org/gradle/android/workarounds/JdkImageWorkaround.groovy +++ b/src/main/groovy/org/gradle/android/workarounds/JdkImageWorkaround.groovy @@ -36,7 +36,7 @@ import java.util.stream.Stream * than Java 9. This normalizes out minor inconsequential differences between JDKs used to generate the * custom runtime and improve cache hits between environments. */ -@AndroidIssue(introducedIn = "7.1.0", fixedIn = ['7.4.0-alpha07'], link = "https://issuetracker.google.com/u/1/issues/234820480") +@AndroidIssue(introducedIn = "7.1.0", link = "https://issuetracker.google.com/u/1/issues/234820480") class JdkImageWorkaround implements Workaround { static final String WORKAROUND_ENABLED_PROPERTY = "org.gradle.android.cache-fix.JdkImageWorkaround.enabled" @@ -53,16 +53,28 @@ class JdkImageWorkaround implements Workaround { applyRuntimeClasspathNormalization(project) applyToAllAndroidVariants(project) { variant -> - variant.javaCompileProvider.configure { JavaCompile task -> - def jdkImageInput = getJdkImageInput(task) - if (jdkImageInput != null) { - setupExtractedJdkImageInputTransform(project, getJvmHome(task)) - replaceCommandLineProvider(task, jdkImageInput) + if (Versions.CURRENT_ANDROID_VERSION <= VersionNumber.parse("7.4.0-alpha01")) { + variant.javaCompileProvider.configure { JavaCompile task -> + jdkTransform(project, task) + } + } else { + project.afterEvaluate { + project.tasks.withType(JavaCompile).configureEach { task -> + jdkTransform(project, task) + } } } } } + private static void jdkTransform(Project project, JavaCompile task) { + def jdkImageInput = getJdkImageInput(task) + if (jdkImageInput != null) { + setupExtractedJdkImageInputTransform(project, getJvmHome(task)) + replaceCommandLineProvider(task, jdkImageInput) + } + } + private static void applyToAllAndroidVariants(Project project, Closure configureVariant) { if (Versions.CURRENT_ANDROID_VERSION <= VersionNumber.parse("7.4.0-alpha01")) { applyToAllAndroidVariantsWithOldVariantApi(project, configureVariant) @@ -94,6 +106,7 @@ class JdkImageWorkaround implements Workaround { static def applyRuntimeClasspathNormalization(Project project) { project.normalization { handler -> handler.runtimeClasspath { + it.ignore '**/java/lang/invoke/**' it.metaInf { metaInfNormalization -> metaInfNormalization.ignoreAttribute('Implementation-Version') metaInfNormalization.ignoreAttribute('Implementation-Vendor') diff --git a/src/test/groovy/org/gradle/android/WorkaroundTest.groovy b/src/test/groovy/org/gradle/android/WorkaroundTest.groovy index cc4d48f1..a53b1a1a 100644 --- a/src/test/groovy/org/gradle/android/WorkaroundTest.groovy +++ b/src/test/groovy/org/gradle/android/WorkaroundTest.groovy @@ -12,8 +12,8 @@ class WorkaroundTest extends Specification { workarounds.collect { it.class.simpleName.replaceAll(/Workaround/, "") }.sort() == expectedWorkarounds.sort() where: androidVersion | expectedWorkarounds - "8.0.0-alpha11" | ['MergeSourceSetFolders', 'RoomSchemaLocation', 'ZipMergingTask'] - "7.4.0" | ['MergeSourceSetFolders', 'RoomSchemaLocation', 'ZipMergingTask'] + "8.0.0-alpha11" | ['MergeSourceSetFolders', 'RoomSchemaLocation', 'ZipMergingTask', 'JdkImage'] + "7.4.0" | ['MergeSourceSetFolders', 'RoomSchemaLocation', 'ZipMergingTask', 'JdkImage'] "7.3.1" | ['MergeSourceSetFolders', 'RoomSchemaLocation', 'ZipMergingTask', 'JdkImage'] "7.2.2" | ['MergeSourceSetFolders', 'RoomSchemaLocation', 'ZipMergingTask', 'JdkImage'] "7.1.3" | ['BundleLibraryClasses', 'CompileLibraryResources', 'DataBindingMergeDependencyArtifacts', 'LibraryJniLibs', 'MergeNativeLibs', 'MergeSourceSetFolders', 'RoomSchemaLocation', 'StripDebugSymbols', 'ZipMergingTask', 'JdkImage'] From 68d6ea4839e36ad9d645553a08f7a91cc3235cf2 Mon Sep 17 00:00:00 2001 From: Inaki Villar Date: Wed, 18 Jan 2023 14:05:50 -0800 Subject: [PATCH 2/5] applying the workaround by base plugin --- .../gradle/android/workarounds/JdkImageWorkaround.groovy | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/groovy/org/gradle/android/workarounds/JdkImageWorkaround.groovy b/src/main/groovy/org/gradle/android/workarounds/JdkImageWorkaround.groovy index ef670005..dd71b6f8 100644 --- a/src/main/groovy/org/gradle/android/workarounds/JdkImageWorkaround.groovy +++ b/src/main/groovy/org/gradle/android/workarounds/JdkImageWorkaround.groovy @@ -98,9 +98,11 @@ class JdkImageWorkaround implements Workaround { } private static void applyToAllAndroidVariantsWithNewVariantApi(Project project, Closure configureVariant) { - def androidComponents = project.extensions.findByName("androidComponents") - def selector = androidComponents.selector() - androidComponents.onVariants(selector.all(), configureVariant) + project.plugins.withId("com.android.base") { + def androidComponents = project.extensions.findByName("androidComponents") + def selector = androidComponents.selector() + androidComponents.onVariants(selector.all(), configureVariant) + } } static def applyRuntimeClasspathNormalization(Project project) { From cf863228d1e0276c3ee94de9d9a7fbdae6759f94 Mon Sep 17 00:00:00 2001 From: Inaki Villar Date: Thu, 19 Jan 2023 08:25:59 -0800 Subject: [PATCH 3/5] removing java/lang/invoke in the default normalization --- .../org/gradle/android/workarounds/JdkImageWorkaround.groovy | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/groovy/org/gradle/android/workarounds/JdkImageWorkaround.groovy b/src/main/groovy/org/gradle/android/workarounds/JdkImageWorkaround.groovy index dd71b6f8..bb6dbf2b 100644 --- a/src/main/groovy/org/gradle/android/workarounds/JdkImageWorkaround.groovy +++ b/src/main/groovy/org/gradle/android/workarounds/JdkImageWorkaround.groovy @@ -108,7 +108,6 @@ class JdkImageWorkaround implements Workaround { static def applyRuntimeClasspathNormalization(Project project) { project.normalization { handler -> handler.runtimeClasspath { - it.ignore '**/java/lang/invoke/**' it.metaInf { metaInfNormalization -> metaInfNormalization.ignoreAttribute('Implementation-Version') metaInfNormalization.ignoreAttribute('Implementation-Vendor') From fa6672849301f8e69a3fbcb1e5853d341f8a98db Mon Sep 17 00:00:00 2001 From: Inaki Villar Date: Thu, 19 Jan 2023 11:27:09 -0800 Subject: [PATCH 4/5] simplifying implementation --- .../workarounds/JdkImageWorkaround.groovy | 33 ++++--------------- 1 file changed, 6 insertions(+), 27 deletions(-) diff --git a/src/main/groovy/org/gradle/android/workarounds/JdkImageWorkaround.groovy b/src/main/groovy/org/gradle/android/workarounds/JdkImageWorkaround.groovy index bb6dbf2b..f8243f28 100644 --- a/src/main/groovy/org/gradle/android/workarounds/JdkImageWorkaround.groovy +++ b/src/main/groovy/org/gradle/android/workarounds/JdkImageWorkaround.groovy @@ -53,16 +53,8 @@ class JdkImageWorkaround implements Workaround { applyRuntimeClasspathNormalization(project) applyToAllAndroidVariants(project) { variant -> - if (Versions.CURRENT_ANDROID_VERSION <= VersionNumber.parse("7.4.0-alpha01")) { - variant.javaCompileProvider.configure { JavaCompile task -> - jdkTransform(project, task) - } - } else { - project.afterEvaluate { - project.tasks.withType(JavaCompile).configureEach { task -> - jdkTransform(project, task) - } - } + variant.javaCompileProvider.configure { JavaCompile task -> + jdkTransform(project, task) } } } @@ -75,15 +67,9 @@ class JdkImageWorkaround implements Workaround { } } + // Configuration for Old Variant API will drop in AGP 9. We will need to use a different + // approach to retrieve the variants using the new Variant API. private static void applyToAllAndroidVariants(Project project, Closure configureVariant) { - if (Versions.CURRENT_ANDROID_VERSION <= VersionNumber.parse("7.4.0-alpha01")) { - applyToAllAndroidVariantsWithOldVariantApi(project, configureVariant) - } else { - applyToAllAndroidVariantsWithNewVariantApi(project, configureVariant) - } - } - - private static void applyToAllAndroidVariantsWithOldVariantApi(Project project, Closure configureVariant) { project.plugins.withId("com.android.application") { def android = project.extensions.findByName("android") android.unitTestVariants.all(configureVariant) @@ -97,14 +83,6 @@ class JdkImageWorkaround implements Workaround { } } - private static void applyToAllAndroidVariantsWithNewVariantApi(Project project, Closure configureVariant) { - project.plugins.withId("com.android.base") { - def androidComponents = project.extensions.findByName("androidComponents") - def selector = androidComponents.selector() - androidComponents.onVariants(selector.all(), configureVariant) - } - } - static def applyRuntimeClasspathNormalization(Project project) { project.normalization { handler -> handler.runtimeClasspath { @@ -188,6 +166,7 @@ class JdkImageWorkaround implements Workaround { interface Parameters extends TransformParameters { @Internal Provider getJavaHome() + void setJavaHome(Provider javaHome) } @@ -254,7 +233,7 @@ class JdkImageWorkaround implements Workaround { private static String serializeRequires(ModuleDescriptor.Requires requires) { String requireString - if (! requires.compiledVersion().empty) { + if (!requires.compiledVersion().empty) { requireString = requires.name() + " (@" + requires.compiledVersion() + ")" } else { requireString = requires.name() From efb429ff8e2e4307811b94791dee1ea4b44550ca Mon Sep 17 00:00:00 2001 From: Inaki Villar Date: Mon, 23 Jan 2023 15:11:47 -0800 Subject: [PATCH 5/5] revert the change to minimize the diff --- .../android/workarounds/JdkImageWorkaround.groovy | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/src/main/groovy/org/gradle/android/workarounds/JdkImageWorkaround.groovy b/src/main/groovy/org/gradle/android/workarounds/JdkImageWorkaround.groovy index f8243f28..c6b169e9 100644 --- a/src/main/groovy/org/gradle/android/workarounds/JdkImageWorkaround.groovy +++ b/src/main/groovy/org/gradle/android/workarounds/JdkImageWorkaround.groovy @@ -54,19 +54,15 @@ class JdkImageWorkaround implements Workaround { applyToAllAndroidVariants(project) { variant -> variant.javaCompileProvider.configure { JavaCompile task -> - jdkTransform(project, task) + def jdkImageInput = getJdkImageInput(task) + if (jdkImageInput != null) { + setupExtractedJdkImageInputTransform(project, getJvmHome(task)) + replaceCommandLineProvider(task, jdkImageInput) + } } } } - private static void jdkTransform(Project project, JavaCompile task) { - def jdkImageInput = getJdkImageInput(task) - if (jdkImageInput != null) { - setupExtractedJdkImageInputTransform(project, getJvmHome(task)) - replaceCommandLineProvider(task, jdkImageInput) - } - } - // Configuration for Old Variant API will drop in AGP 9. We will need to use a different // approach to retrieve the variants using the new Variant API. private static void applyToAllAndroidVariants(Project project, Closure configureVariant) {