Skip to content

Commit 2138314

Browse files
committed
reaper: Output build data
1 parent 5ef6755 commit 2138314

File tree

2 files changed

+41
-5
lines changed

2 files changed

+41
-5
lines changed

gradle-plugin/plugin/src/main/kotlin/com/emergetools/android/gradle/EmergePlugin.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,11 @@ class EmergePlugin : Plugin<Project> {
221221
it.transformClassesWith(
222222
ReaperClassLoadClassVisitorFactory::class.java,
223223
InstrumentationScope.ALL,
224-
) { _ -> }
224+
) { params ->
225+
params.instrumentationRecord.set(
226+
project.layout.buildDirectory.file("emergetools/reaper/instrumented.tsv")
227+
)
228+
}
225229
}
226230
}
227231

gradle-plugin/plugin/src/main/kotlin/com/emergetools/android/gradle/instrumentation/reaper/ReaperClassLoadTransform.kt

Lines changed: 36 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,28 @@ import org.objectweb.asm.Opcodes
1010
import org.slf4j.Logger
1111
import org.slf4j.LoggerFactory
1212
import java.security.MessageDigest
13+
import java.util.Base64
14+
import java.io.PrintWriter
15+
import org.gradle.api.file.RegularFileProperty
16+
import org.gradle.api.tasks.OutputFile
17+
import org.gradle.api.tasks.Internal
18+
19+
interface ReaperTransformParameters : InstrumentationParameters {
20+
@get:Internal
21+
val instrumentationRecord: RegularFileProperty
22+
}
23+
24+
var instrumentationRecordWriter: PrintWriter? = null
1325

1426
abstract class ReaperClassLoadClassVisitorFactory :
15-
AsmClassVisitorFactory<InstrumentationParameters.None> {
27+
AsmClassVisitorFactory<ReaperTransformParameters> {
1628
companion object {
1729
private val logger by lazy {
1830
LoggerFactory.getLogger(ReaperClassLoadClassVisitorFactory::class.java)
1931
}
2032
}
2133

34+
2235
override fun createClassVisitor(
2336
classContext: ClassContext,
2437
nextClassVisitor: ClassVisitor,
@@ -27,11 +40,17 @@ abstract class ReaperClassLoadClassVisitorFactory :
2740
"ReaperClassVisitorFactory processing class: ${classContext.currentClassData.className}",
2841
)
2942

43+
if (instrumentationRecordWriter == null) {
44+
val output = parameters.get().instrumentationRecord.get().getAsFile().printWriter()
45+
instrumentationRecordWriter = output
46+
}
47+
3048
return ReaperClassLoadClassVisitor(
3149
instrumentationContext.apiVersion.get(),
3250
nextClassVisitor,
3351
classContext,
3452
logger,
53+
instrumentationRecordWriter!!,
3554
)
3655
}
3756

@@ -59,7 +78,7 @@ class ReaperClassLoadClassVisitor(
5978
cv: ClassVisitor,
6079
val classContext: ClassContext,
6180
val logger: Logger,
62-
// private val writer: PrintWriter,
81+
val writer: PrintWriter,
6382
) : ClassVisitor(api, cv) {
6483
private var sourceFileName: String? = null
6584

@@ -83,24 +102,37 @@ class ReaperClassLoadClassVisitor(
83102
return mv?.let {
84103
val sig = "$className.$name$descriptor"
85104
logger.info("Processing method: $sig")
86-
ReaperClassLoadMethodVisitor(api, mv, className, name)
105+
ReaperClassLoadMethodVisitor(api, mv, className, name, logger, writer)
87106
}
88107
}
89108
}
90109

110+
fun longToBase64(hash: Long): String {
111+
val buf = ByteArray(8)
112+
for (i in 0..7) {
113+
buf[i] = ((hash shr i * 8) and 0xFFL).toByte()
114+
}
115+
val hashAsBase64 = Base64.getEncoder().encode(buf).toString(Charsets.UTF_8)
116+
return hashAsBase64
117+
}
118+
91119
class ReaperClassLoadMethodVisitor(
92120
api: Int,
93121
methodVisitor: MethodVisitor,
94122
private val className: String,
95-
// private val writer: PrintWriter,
96123
private val name: String?,
124+
private val logger: Logger,
125+
private val writer: PrintWriter,
97126
) : MethodVisitor(api, methodVisitor) {
98127
override fun visitCode() {
99128
super.visitCode()
100129
if (name == "<clinit>" || name == "<init>") {
101130
val signature = "L" + className.replace(".", "/") + ";"
102131
val hashedSignature = topLong(toSha256(signature))
103132

133+
writer.write("${className}\t${hashedSignature}\t${longToBase64(hashedSignature)}\t${signature}\t${name}\n")
134+
writer.flush()
135+
104136
// Push method argument onto the stack
105137
mv.visitLdcInsn(hashedSignature)
106138

0 commit comments

Comments
 (0)