Skip to content

Commit

Permalink
Merge pull request #4 from 2BAB/dev
Browse files Browse the repository at this point in the history
Add ALL_JAVA_RESOURCE
  • Loading branch information
2BAB committed Mar 26, 2022
2 parents 62820fc + 6773bcb commit 9e77067
Show file tree
Hide file tree
Showing 13 changed files with 169 additions and 5 deletions.
Expand Up @@ -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
Expand Down
Expand Up @@ -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"))
}

}
@@ -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
Expand All @@ -21,7 +22,8 @@ abstract class PolyfillExtension {
internal val multipleArtifactMap = mutableMapOf<PolyfilledArtifact<*>,
KClass<out PincerTaskConfiguration<*>>>(
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
)

/**
Expand Down
Expand Up @@ -59,5 +59,8 @@ sealed class PolyfilledMultipleArtifact<FileTypeT : FileSystemLocation,

object ALL_RESOURCES :
PolyfilledMultipleArtifact<Directory, PolyfilledApplicationArtifact>(ArtifactKind.DIRECTORY)

object ALL_JAVA_RES :
PolyfilledMultipleArtifact<RegularFile, PolyfilledApplicationArtifact>(ArtifactKind.FILE)
}

@@ -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<RegularFile>(project, appVariant, headTaskProvider, lazyLastTaskProvider) {

override val data: Provider<List<RegularFile>> = project.objects.listProperty<RegularFile>() // A placeholder

override fun orchestrate() {
project.afterEvaluate {
val variantCapitalizedName = variant.getCapitalizedName()
val mergeTask = project.tasks.withType<MergeJavaResourceTask>().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<RegularFile>).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())
}
}


}
1 change: 1 addition & 0 deletions test-app/android-lib/.gitignore
@@ -0,0 +1 @@
/build
28 changes: 28 additions & 0 deletions 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)
}
5 changes: 5 additions & 0 deletions test-app/android-lib/src/main/AndroidManifest.xml
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="me.xx2bab.polyfill.sample.android">

</manifest>
@@ -0,0 +1,7 @@
package me.xx2bab.polyfill.sample.android

class ExportedAndroidLibraryRunnable: Runnable {
override fun run() {
println("ExportedAndroidLibraryAPI is running")
}
}
Empty file.
1 change: 1 addition & 0 deletions test-app/app/build.gradle.kts
Expand Up @@ -26,4 +26,5 @@ android {
dependencies {
implementation("androidx.appcompat:appcompat:1.2.0")
implementation(deps.kotlin.std)
implementation(projects.androidLib)
}
5 changes: 3 additions & 2 deletions test-app/settings.gradle.kts
@@ -1,5 +1,5 @@
rootProject.name = "polyfill-func-test-project"
enableFeaturePreview("VERSION_CATALOGS")
enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS")

pluginManagement {

Expand All @@ -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 {
Expand Down Expand Up @@ -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
Expand Down
Expand Up @@ -34,6 +34,7 @@ class TestPlugin : Plugin<Project> {
}
val androidExtension = project.extensions.getByType(ApplicationAndroidComponentsExtension::class.java)
androidExtension.onVariants { variant ->
// ALL_MANIFESTS
val printManifestTask = project.tasks.register<PreUpdateManifestsTask>(
"getAllInputManifestsFor${variant.name.capitalize()}"
) {
Expand Down Expand Up @@ -64,7 +65,7 @@ class TestPlugin : Plugin<Project> {
toInPlaceUpdate = PolyfilledMultipleArtifact.ALL_MANIFESTS
)


// ALL_RESOURCES & MERGED_RESOURCES
val postUpdateResourceTask = project.tasks.register<PostUpdateResourceTask>(
"postUpdate${variant.name.capitalize()}Resources"
) {
Expand All @@ -78,6 +79,16 @@ class TestPlugin : Plugin<Project> {
wiredWith = PostUpdateResourceTask::compiledFilesDir,
toInPlaceUpdate = PolyfilledSingleArtifact.MERGED_RESOURCES
)

// ALL_JAVA_RES
val preUpdateJavaResTask = project.tasks.register<PreUpdateJavaResourcesTask>(
"preUpdate${variant.name.capitalize()}JavaResources"
)
variant.artifactsPolyfill.use(
taskProvider = preUpdateJavaResTask,
wiredWith = PreUpdateJavaResourcesTask::beforeMergeInputs,
toInPlaceUpdate = PolyfilledMultipleArtifact.ALL_JAVA_RES
)
}

project.gradle.taskGraph.whenReady {
Expand Down Expand Up @@ -126,6 +137,22 @@ class TestPlugin : Plugin<Project> {
}
}

abstract class PreUpdateJavaResourcesTask : DefaultTask() {
@get:InputFiles
abstract val beforeMergeInputs: ListProperty<RegularFile>

@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,
Expand Down

0 comments on commit 9e77067

Please sign in to comment.