From 5d533edb649f9871e9e6cff21f5d2720ec604687 Mon Sep 17 00:00:00 2001 From: 2BAB Date: Sat, 26 Mar 2022 21:32:49 +0800 Subject: [PATCH 1/3] feature: add ALL_JAVA_RES artifact --- .../polyfill/PolyfillLibraryFunctionTest.kt | 7 ++ .../me/xx2bab/polyfill/PolyfillExtension.kt | 3 +- .../me/xx2bab/polyfill/PolyfilledArtifacts.kt | 3 + ...JavaResourceMergePreHookConfigureAction.kt | 82 +++++++++++++++++++ test-app/android-lib/.gitignore | 1 + test-app/android-lib/build.gradle.kts | 28 +++++++ .../android-lib/src/main/AndroidManifest.xml | 5 ++ .../android/ExportedAndroidLibraryRunnable.kt | 7 ++ .../main/resources/android-lib-java-res.txt | 0 test-app/app/build.gradle.kts | 1 + test-app/settings.gradle.kts | 5 +- .../me/xx2bab/polyfill/test/TestPlugin.kt | 29 ++++++- 12 files changed, 167 insertions(+), 4 deletions(-) create mode 100644 polyfill/src/main/kotlin/me/xx2bab/polyfill/jar/JavaResourceMergePreHookConfigureAction.kt create mode 100644 test-app/android-lib/.gitignore create mode 100644 test-app/android-lib/build.gradle.kts create mode 100644 test-app/android-lib/src/main/AndroidManifest.xml create mode 100644 test-app/android-lib/src/main/java/me/xx2bab/polyfill/sample/android/ExportedAndroidLibraryRunnable.kt create mode 100644 test-app/android-lib/src/main/resources/android-lib-java-res.txt diff --git a/polyfill/src/functionalTest/kotlin/me/xx2bab/polyfill/PolyfillLibraryFunctionTest.kt b/polyfill/src/functionalTest/kotlin/me/xx2bab/polyfill/PolyfillLibraryFunctionTest.kt index 0f4a73e..3e47684 100644 --- a/polyfill/src/functionalTest/kotlin/me/xx2bab/polyfill/PolyfillLibraryFunctionTest.kt +++ b/polyfill/src/functionalTest/kotlin/me/xx2bab/polyfill/PolyfillLibraryFunctionTest.kt @@ -94,4 +94,11 @@ class PolyfillLibraryFunctionTest { Assert.assertTrue(out.readText().contains("app/build/intermediates/merged_res/debug")) } + @Test + fun javaResourceMergePreHookConfigureAction_TransformSuccessfully() { + val out = File("${testProjectJsonOutputPath}/all-java-res-by-preUpdateDebugJavaResources.json") + Assert.assertTrue(out.exists()) + Assert.assertTrue(out.readText().contains("android-lib/build/intermediates/library_java_res/debug/res.jar")) + } + } \ No newline at end of file diff --git a/polyfill/src/main/kotlin/me/xx2bab/polyfill/PolyfillExtension.kt b/polyfill/src/main/kotlin/me/xx2bab/polyfill/PolyfillExtension.kt index e3624a2..f1a819d 100644 --- a/polyfill/src/main/kotlin/me/xx2bab/polyfill/PolyfillExtension.kt +++ b/polyfill/src/main/kotlin/me/xx2bab/polyfill/PolyfillExtension.kt @@ -21,7 +21,8 @@ abstract class PolyfillExtension { internal val multipleArtifactMap = mutableMapOf, KClass>>( PolyfilledMultipleArtifact.ALL_MANIFESTS to ManifestMergePreHookConfigureAction::class, - PolyfilledMultipleArtifact.ALL_RESOURCES to ResourceMergePreHookConfigureAction::class + PolyfilledMultipleArtifact.ALL_RESOURCES to ResourceMergePreHookConfigureAction::class, + PolyfilledMultipleArtifact.ALL_JAVA_RES to JavaResourceMergePreHookConfigureAction::class ) /** diff --git a/polyfill/src/main/kotlin/me/xx2bab/polyfill/PolyfilledArtifacts.kt b/polyfill/src/main/kotlin/me/xx2bab/polyfill/PolyfilledArtifacts.kt index 7d2355f..0763917 100644 --- a/polyfill/src/main/kotlin/me/xx2bab/polyfill/PolyfilledArtifacts.kt +++ b/polyfill/src/main/kotlin/me/xx2bab/polyfill/PolyfilledArtifacts.kt @@ -59,5 +59,8 @@ sealed class PolyfilledMultipleArtifact(ArtifactKind.DIRECTORY) + + object ALL_JAVA_RES : + PolyfilledMultipleArtifact(ArtifactKind.FILE) } diff --git a/polyfill/src/main/kotlin/me/xx2bab/polyfill/jar/JavaResourceMergePreHookConfigureAction.kt b/polyfill/src/main/kotlin/me/xx2bab/polyfill/jar/JavaResourceMergePreHookConfigureAction.kt new file mode 100644 index 0000000..20bd63e --- /dev/null +++ b/polyfill/src/main/kotlin/me/xx2bab/polyfill/jar/JavaResourceMergePreHookConfigureAction.kt @@ -0,0 +1,82 @@ +package me.xx2bab.polyfill.jar + +import com.android.build.api.variant.ApplicationVariant +import com.android.build.gradle.internal.scope.getRegularFiles +import com.android.build.gradle.internal.tasks.MergeJavaResourceTask +import com.android.build.gradle.internal.tasks.ProcessJavaResTask +import me.xx2bab.polyfill.getCapitalizedName +import me.xx2bab.polyfill.task.MultipleArtifactPincerTaskConfiguration +import org.gradle.api.Project +import org.gradle.api.file.RegularFile +import org.gradle.api.provider.ListProperty +import org.gradle.api.provider.Provider +import org.gradle.api.tasks.TaskProvider +import org.gradle.kotlin.dsl.listProperty +import org.gradle.kotlin.dsl.withType + +/** + * To retrieve all java resources (except current module) + * that will participate the merge process. + */ +class JavaResourceMergePreHookConfigureAction( + project: Project, + private val appVariant: ApplicationVariant, + headTaskProvider: TaskProvider<*>, + lazyLastTaskProvider: () -> TaskProvider<*> +) : MultipleArtifactPincerTaskConfiguration(project, appVariant, headTaskProvider, lazyLastTaskProvider) { + + override val data: Provider> = project.objects.listProperty() // A placeholder + + override fun orchestrate() { + project.afterEvaluate { + val variantCapitalizedName = variant.getCapitalizedName() + val mergeTask = project.tasks.withType().first { + it.name.contains(variantCapitalizedName) + && !it.name.contains("test", true) + } + + + // Setup Data +// val subProjectsJavaResList = appVariant.getApplicationVariantImpl().variantDependencies +// .getArtifactFileCollection( +// AndroidArtifacts.ConsumedConfigType.RUNTIME_CLASSPATH, +// AndroidArtifacts.ArtifactScope.PROJECT, +// AndroidArtifacts.ArtifactType.JAVA_RES +// ) +// .getRegularFiles(project.rootProject.layout.projectDirectory) + val subProjectsJavaResList = mergeTask.subProjectJavaRes + ?.getRegularFiles(project.rootProject.layout.projectDirectory) + ?: project.objects.listProperty() + val externalDepJavaResList = mergeTask.externalLibJavaRes + ?.getRegularFiles(project.rootProject.layout.projectDirectory) + ?: project.objects.listProperty() + subProjectsJavaResList.zip(externalDepJavaResList) { a, b -> a + b } + (data as ListProperty).set(subProjectsJavaResList) + + + // Setup dependencies + // Left flank + project.rootProject.subprojects { + val subProject = this + if (subProject !== project) { + subProject.tasks.whenTaskAdded { + val targetTask = this + if (targetTask is ProcessJavaResTask + && targetTask.name.contains(variantCapitalizedName) + && !targetTask.name.contains("test", true) + ) { + headTaskProvider.configure { + dependsOn(targetTask) + } + } + } + } + } + + // Right flank + mergeTask.dependsOn(lazyTailTaskProvider()) + } + } + + +} \ No newline at end of file diff --git a/test-app/android-lib/.gitignore b/test-app/android-lib/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/test-app/android-lib/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/test-app/android-lib/build.gradle.kts b/test-app/android-lib/build.gradle.kts new file mode 100644 index 0000000..bd0c104 --- /dev/null +++ b/test-app/android-lib/build.gradle.kts @@ -0,0 +1,28 @@ +plugins { + id("com.android.library") + kotlin("android") +} + +android { + compileSdk = 31 + defaultConfig { + minSdk = 21 + targetSdk = 31 + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + } + + sourceSets["main"].java.srcDir("src/main/kotlin") + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 + } + + kotlinOptions { + jvmTarget = "1.8" + } +} + +dependencies { + implementation(deps.kotlin.std) +} \ No newline at end of file diff --git a/test-app/android-lib/src/main/AndroidManifest.xml b/test-app/android-lib/src/main/AndroidManifest.xml new file mode 100644 index 0000000..4ebc16b --- /dev/null +++ b/test-app/android-lib/src/main/AndroidManifest.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/test-app/android-lib/src/main/java/me/xx2bab/polyfill/sample/android/ExportedAndroidLibraryRunnable.kt b/test-app/android-lib/src/main/java/me/xx2bab/polyfill/sample/android/ExportedAndroidLibraryRunnable.kt new file mode 100644 index 0000000..b03cd9b --- /dev/null +++ b/test-app/android-lib/src/main/java/me/xx2bab/polyfill/sample/android/ExportedAndroidLibraryRunnable.kt @@ -0,0 +1,7 @@ +package me.xx2bab.polyfill.sample.android + +class ExportedAndroidLibraryRunnable: Runnable { + override fun run() { + println("ExportedAndroidLibraryAPI is running") + } +} \ No newline at end of file diff --git a/test-app/android-lib/src/main/resources/android-lib-java-res.txt b/test-app/android-lib/src/main/resources/android-lib-java-res.txt new file mode 100644 index 0000000..e69de29 diff --git a/test-app/app/build.gradle.kts b/test-app/app/build.gradle.kts index d98df7d..79fef79 100644 --- a/test-app/app/build.gradle.kts +++ b/test-app/app/build.gradle.kts @@ -26,4 +26,5 @@ android { dependencies { implementation("androidx.appcompat:appcompat:1.2.0") implementation(deps.kotlin.std) + implementation(projects.androidLib) } diff --git a/test-app/settings.gradle.kts b/test-app/settings.gradle.kts index 6742912..a577a72 100644 --- a/test-app/settings.gradle.kts +++ b/test-app/settings.gradle.kts @@ -1,5 +1,5 @@ rootProject.name = "polyfill-func-test-project" -enableFeaturePreview("VERSION_CATALOGS") +enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS") pluginManagement { @@ -9,6 +9,7 @@ pluginManagement { plugins { id("com.android.application") version getVersion("agpVer") apply false + id("com.android.library") version getVersion("agpVer") apply false kotlin("android") version getVersion("kotlinVer") apply false } repositories { @@ -38,7 +39,7 @@ dependencyResolutionManagement { } // Main test app -include(":app") +include(":app", ":android-lib") // Substitute the test plugin with a project(":test-plugin"), // also check ./build.gradle.kts diff --git a/test-plugin/src/main/kotlin/me/xx2bab/polyfill/test/TestPlugin.kt b/test-plugin/src/main/kotlin/me/xx2bab/polyfill/test/TestPlugin.kt index 331112b..6da7334 100644 --- a/test-plugin/src/main/kotlin/me/xx2bab/polyfill/test/TestPlugin.kt +++ b/test-plugin/src/main/kotlin/me/xx2bab/polyfill/test/TestPlugin.kt @@ -34,6 +34,7 @@ class TestPlugin : Plugin { } val androidExtension = project.extensions.getByType(ApplicationAndroidComponentsExtension::class.java) androidExtension.onVariants { variant -> + // ALL_MANIFESTS val printManifestTask = project.tasks.register( "getAllInputManifestsFor${variant.name.capitalize()}" ) { @@ -64,7 +65,7 @@ class TestPlugin : Plugin { toInPlaceUpdate = PolyfilledMultipleArtifact.ALL_MANIFESTS ) - + // ALL_RESOURCES & MERGED_RESOURCES val postUpdateResourceTask = project.tasks.register( "postUpdate${variant.name.capitalize()}Resources" ) { @@ -78,6 +79,16 @@ class TestPlugin : Plugin { wiredWith = PostUpdateResourceTask::compiledFilesDir, toInPlaceUpdate = PolyfilledSingleArtifact.MERGED_RESOURCES ) + + // ALL_JAVA_RES + val preUpdateJavaResTask = project.tasks.register( + "preUpdate${variant.name.capitalize()}JavaResources" + ) + variant.artifactsPolyfill.use( + taskProvider = preUpdateJavaResTask, + wiredWith = PreUpdateJavaResourcesTask::beforeMergeInputs, + toInPlaceUpdate = PolyfilledMultipleArtifact.ALL_JAVA_RES + ) } project.gradle.taskGraph.whenReady { @@ -126,6 +137,22 @@ class TestPlugin : Plugin { } } + abstract class PreUpdateJavaResourcesTask : DefaultTask() { + @get:InputFiles + abstract val beforeMergeInputs: ListProperty + + @TaskAction + fun beforeMerge() { + val javaResPathsOutput = getOutputFile(project, "all-java-res-by-${name}.json") + javaResPathsOutput.createNewFile() + beforeMergeInputs.get().let { files -> + javaResPathsOutput.writeText(JSON.toJSONString(files.map { it.asFile.absolutePath })) + } + } + } + + + companion object { fun getOutputFile( project: Project, From 86742a529d8d4eeeb82b302418939e5418c2809f Mon Sep 17 00:00:00 2001 From: 2BAB Date: Sat, 26 Mar 2022 21:32:57 +0800 Subject: [PATCH 2/3] release: 0.6.0 --- .../main/kotlin/me/xx2bab/polyfill/buildscript/BuildConfig.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/kotlin/me/xx2bab/polyfill/buildscript/BuildConfig.kt b/buildSrc/src/main/kotlin/me/xx2bab/polyfill/buildscript/BuildConfig.kt index e4e34f9..cd1bea6 100644 --- a/buildSrc/src/main/kotlin/me/xx2bab/polyfill/buildscript/BuildConfig.kt +++ b/buildSrc/src/main/kotlin/me/xx2bab/polyfill/buildscript/BuildConfig.kt @@ -12,7 +12,7 @@ object BuildConfig { } object Versions { - const val polyfillDevVersion = "0.5.0" + const val polyfillDevVersion = "0.6.0" val polyfillSourceCompatibilityVersion = JavaVersion.VERSION_1_8 val polyfillTargetCompatibilityVersion = JavaVersion.VERSION_1_8 From 6773bcb37453853166b327aedf99d4895bfff249 Mon Sep 17 00:00:00 2001 From: 2BAB Date: Sat, 26 Mar 2022 21:39:32 +0800 Subject: [PATCH 3/3] fix: add missing import --- polyfill/src/main/kotlin/me/xx2bab/polyfill/PolyfillExtension.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/polyfill/src/main/kotlin/me/xx2bab/polyfill/PolyfillExtension.kt b/polyfill/src/main/kotlin/me/xx2bab/polyfill/PolyfillExtension.kt index f1a819d..a16a4a0 100644 --- a/polyfill/src/main/kotlin/me/xx2bab/polyfill/PolyfillExtension.kt +++ b/polyfill/src/main/kotlin/me/xx2bab/polyfill/PolyfillExtension.kt @@ -1,5 +1,6 @@ package me.xx2bab.polyfill +import me.xx2bab.polyfill.jar.JavaResourceMergePreHookConfigureAction import me.xx2bab.polyfill.manifest.ManifestMergePreHookConfigureAction import me.xx2bab.polyfill.res.ResourceMergePostHookConfigureAction import me.xx2bab.polyfill.res.ResourceMergePreHookConfigureAction