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