Skip to content

Commit 39cc830

Browse files
author
Chao Zhang
committed
Perform an no-op transformation
1 parent 331d004 commit 39cc830

File tree

5 files changed

+116
-8
lines changed

5 files changed

+116
-8
lines changed

build.gradle

+12-4
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
plugins {
22
id 'org.jetbrains.kotlin.jvm' version '1.4.31'
3+
id 'org.jetbrains.dokka' version '1.4.30'
34
id 'java-gradle-plugin'
5+
id 'com.vanniktech.maven.publish' version '0.13.0'
46
}
57

6-
group 'io.github.chao2zhang.logginglivedata'
7-
version '1.0-SNAPSHOT'
8-
98
repositories {
109
mavenCentral()
10+
google()
11+
jcenter()
1112
}
1213

1314
gradlePlugin {
@@ -19,6 +20,13 @@ gradlePlugin {
1920
}
2021
}
2122

23+
compileJava {
24+
sourceCompatibility = '1.8'
25+
targetCompatibility = '1.8'
26+
}
27+
2228
dependencies {
23-
implementation "org.jetbrains.kotlin:kotlin-stdlib"
29+
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7"
30+
implementation 'com.android.tools.build:gradle-api:4.1.3'
31+
compileOnly 'com.android.tools.build:gradle:4.1.3'
2432
}

gradle.properties

+5-1
Original file line numberDiff line numberDiff line change
@@ -1 +1,5 @@
1-
kotlin.code.style=official
1+
kotlin.code.style=official
2+
3+
GROUP=io.github.chao2zhang.logginglivedata
4+
POM_ARTIFACT_ID=logginglivedata
5+
VERSION_NAME=0.0.1
+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
distributionBase=GRADLE_USER_HOME
22
distributionPath=wrapper/dists
3-
distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-all.zip
3+
distributionUrl=https\://services.gradle.org/distributions/gradle-6.8.3-all.zip
44
zipStoreBase=GRADLE_USER_HOME
55
zipStorePath=wrapper/dists
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,17 @@
11
package io.github.chao2zhang
22

3+
import com.android.build.gradle.AppExtension
4+
import com.android.build.gradle.AppPlugin
35
import org.gradle.api.Plugin
46
import org.gradle.api.Project
57

68
class LoggingLiveDataPlugin : Plugin<Project> {
79

8-
override fun apply(p0: Project) {
9-
TODO("Not yet implemented")
10+
override fun apply(project: Project) {
11+
project.plugins.withType(AppPlugin::class.java) { plugin ->
12+
project.extensions.configure(AppExtension::class.java) { appExtension ->
13+
appExtension.registerTransform(LoggingLiveDataTransform(project.logger))
14+
}
15+
}
1016
}
1117
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
package io.github.chao2zhang
2+
3+
import com.android.build.api.transform.Format
4+
import com.android.build.api.transform.JarInput
5+
import com.android.build.api.transform.QualifiedContent
6+
import com.android.build.api.transform.Status
7+
import com.android.build.api.transform.Transform
8+
import com.android.build.api.transform.TransformInput
9+
import com.android.build.api.transform.TransformInvocation
10+
import com.android.build.api.variant.VariantInfo
11+
import org.gradle.api.logging.Logger
12+
import java.io.BufferedOutputStream
13+
import java.io.File
14+
import java.io.FileOutputStream
15+
import java.util.zip.ZipEntry
16+
import java.util.zip.ZipFile
17+
import java.util.zip.ZipOutputStream
18+
19+
@Suppress("UnstableApiUsage")
20+
class LoggingLiveDataTransform(private val logger: Logger) : Transform() {
21+
22+
override fun getName(): String = javaClass.simpleName
23+
24+
override fun applyToVariant(variant: VariantInfo) = variant.isDebuggable
25+
26+
override fun getInputTypes(): Set<QualifiedContent.ContentType> =
27+
setOf(QualifiedContent.DefaultContentType.CLASSES)
28+
29+
override fun getScopes(): MutableSet<in QualifiedContent.Scope> =
30+
mutableSetOf(QualifiedContent.Scope.EXTERNAL_LIBRARIES)
31+
32+
override fun isIncremental(): Boolean = true
33+
34+
override fun transform(transformInvocation: TransformInvocation) {
35+
super.transform(transformInvocation)
36+
transformInvocation.inputs.forEach {
37+
transform(transformInvocation, it)
38+
}
39+
}
40+
41+
private fun transform(transformInvocation: TransformInvocation, transformInput: TransformInput) {
42+
transformInput.jarInputs.forEach { jarInput ->
43+
val inputJar = jarInput.file
44+
val outputJar = transformInvocation.outputProvider.getContentLocation(
45+
jarInput.name,
46+
jarInput.contentTypes,
47+
jarInput.scopes,
48+
Format.JAR
49+
)
50+
logger.lifecycle("Transforming ${jarInput.file}")
51+
if (transformInvocation.isIncremental) {
52+
when (jarInput.status) {
53+
Status.ADDED, Status.CHANGED -> transformJarInput(jarInput, inputJar, outputJar)
54+
Status.REMOVED -> outputJar.delete()
55+
else -> { }
56+
}
57+
} else {
58+
transformJarInput(jarInput, inputJar, outputJar)
59+
}
60+
}
61+
}
62+
63+
private fun transformJarInput(jarInput: JarInput, inputJar: File, outputJar: File) {
64+
if (jarInput.isLiveDataJarInput()) {
65+
transformLiveDataJar(inputJar, outputJar)
66+
} else {
67+
inputJar.copyTo(outputJar, overwrite = true)
68+
}
69+
}
70+
71+
private fun transformLiveDataJar(inputJar: File, outputJar: File) {
72+
val inputZip = ZipFile(inputJar)
73+
val outputZip = ZipOutputStream(BufferedOutputStream(FileOutputStream(outputJar)))
74+
val inputEntries = inputZip.entries()
75+
while (inputEntries.hasMoreElements()) {
76+
val inputEntry = inputEntries.nextElement()
77+
val outputEntry = ZipEntry(inputEntry.name)
78+
with(outputZip) {
79+
putNextEntry(outputEntry)
80+
write(inputZip.getInputStream(inputEntry).readAllBytes())
81+
closeEntry()
82+
}
83+
}
84+
outputZip.flush()
85+
outputZip.close()
86+
}
87+
88+
private fun JarInput.isLiveDataJarInput(): Boolean =
89+
name.startsWith("androidx.lifecycle:lifecycle-livedata:")
90+
}

0 commit comments

Comments
 (0)