gradle plugin開發(fā)(三)

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
    }
}
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容