Using ClassTransformer with Task
In daily development, we may need to depend on the artifacts of the Android Transform Pipeline in a Task. For example, booster-task-analyseropen in new window performs static analysis on the artifacts of the Android Transform Pipeline in AnalyserTaskopen in new window. For this use case, Booster provides a series of utility classes and extension methods:
Creating Task via VariantProcessor
@AutoService(VariantProcessor::class)
class ScannerVariantProcessor : VariantProcessor {
override fun process(variant: BaseVariant) {
val project = variant.project
val variantName = variant.name.capitalize()
val transform = variant.extension.transforms.reversed().first {
it.scopes.containsAll(TransformManager.SCOPE_FULL_PROJECT)
&& it.inputTypes.contains(QualifiedContent.DefaultContentType.CLASSES)
} ?: throw GradleException("No available transform")
project.tasks.withType(TransformTask::class.java).find {
it.name.endsWith(variantName) && it.transform == transform
}?.let { transformTask ->
project.tasks.create("scan${variantName}", ScannerTask::class.java) {
it.variant = variant
it.supplier = {
transformTask.outputs.files.single()
}
}.dependsOn(transformTask)
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Reusing Transformer via VariantTransformHelper
open class ScannerTask : AbstractTask() {
lateinit var variant: BaseVariant
lateinit var supplier: () -> File
@get:Input
val variantName: String
get() = variant.name
@TaskAction
fun scan() {
VariantTransformHelper(variant, supplier())
.transform(project.projectDir, AsmTransformer(ScannerTransformer()))
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Custom ClassTransformer
@AutoService(ClassTransformer::class)
class ScannerTransformer : ClassTransformer {
override fun transform(context: TransformContext, klass: ClassNode): ClassNode {
// scanning klass
klass
}
}
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
