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("發(fā)現(xiàn)com.android.application插件,注冊transform任務")
//獲取application插件的AndroidComponentsExtension擴展
val androidComponents =
project.extensions.getByType(AndroidComponentsExtension::class.java)
androidComponents.onVariants { variant ->
Logger.logI("發(fā)現(xiàn)變體${variant.name}")
startTransform(variant)
}
}
}
/**
* 插入字節(jié)碼處理
*/
private fun startTransform(variant: Variant) {
variant.instrumentation.transformClassesWith(
MyTransformFactory::class.java,
//InstrumentationScope.ALL:處理所有類,包括第三方sdk
//InstrumentationScope.PROJECT:只處理自己工程中的類
InstrumentationScope.ALL
) {
//該參數(shù)即為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
}
}