transform
class MyAppPlugin : Plugin<Project>{
override fun apply(project: Project) {
Logger.setLoggerImpl(project.logger)
//当com.android.application插件加载后注册
project.pluginManager.withPlugin("com.android.application") {
Logger.logI("发现com.android.application插件,注册transform任务")
//获取application插件的AndroidComponentsExtension扩展
val androidComponents =
project.extensions.getByType(AndroidComponentsExtension::class.java)
androidComponents.onVariants { variant ->
Logger.logI("发现变体${variant.name}")
startTransform(variant)
}
}
}
/**
* 插入字节码处理
*/
private fun startTransform(variant: Variant) {
variant.instrumentation.transformClassesWith(
MyTransformFactory::class.java,
//InstrumentationScope.ALL:处理所有类,包括第三方sdk
//InstrumentationScope.PROJECT:只处理自己工程中的类
InstrumentationScope.ALL
) {
//该参数即为AsmClassVisitorFactory<>泛型,在这里可以对该泛型实例对象进行操作
}
//设置不同的栈帧计算模式
variant.instrumentation.setAsmFramesComputationMode(
FramesComputationMode.COMPUTE_FRAMES_FOR_INSTRUMENTED_METHODS
)
}
}
abstract class MyTransformFactory :
AsmClassVisitorFactory<InstrumentationParameters.None> {
override fun createClassVisitor(
classContext: ClassContext,
nextClassVisitor: ClassVisitor
): ClassVisitor {
return MyClassVisitor(nextClassVisitor)
}
override fun isInstrumentable(classData: ClassData): Boolean {
//true需要处理,false不需要处理
retrun true
}
}