gradle plugin开发(三)

transform

class MyAppPlugin : Plugin{
    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 {

    override fun createClassVisitor(
        classContext: ClassContext,
        nextClassVisitor: ClassVisitor
    ): ClassVisitor {

        return MyClassVisitor(nextClassVisitor)
    }

    override fun isInstrumentable(classData: ClassData): Boolean {
        //true需要处理,false不需要处理
         retrun true
    }
}

你可能感兴趣的:(gradle plugin开发(三))