Transform 插桩根据不同的渠道自动开启和关闭

624 阅读1分钟

Transform 作为 Android gradle plugin 提供给开发者的 API,用于在 apk 构建过程中,对 class 字节码,resources 等文件内容进行插桩修改。

对于一些性能测试的插件,如果每次编译都修改字节码可能会使编译速度变慢,我们可以根据不同的编译环境开启和关闭是否要执行插桩。

方法一:BuildType 名称包含 release 不注册 Transform

class DoubleClickPlugin : Plugin<Project> {

    override fun apply(project: Project) {
        val flavorBuildType = getFlavorBuildType(project)
        if (!flavorBuildType.toLowerCase(Locale.ROOT).contains("release")){
            return
        }
        val config = DoubleClickConfig()
        val appExtension: AppExtension = project.extensions.getByType(AppExtension::class.java)
        appExtension.registerTransform(DoubleClickTransform(config))
    }

    //通过 startParameter 获取  FlavorBuildType
    fun getFlavorBuildType(appProject: Project): String {
        var flavorBuildType = ""
        val arg = appProject.gradle.startParameter.taskRequests.getOrNull(0)?.args?.getOrNull(0)
        if (!arg.isNullOrEmpty()) {
            var index = arg.indexOf("assemble")
            index = if (index > -1) index + "assemble".length else 0
            flavorBuildType = arg.substring(index, arg.length)
        }
        if (flavorBuildType.isNotEmpty()) {
            flavorBuildType = flavorBuildType.substring(0, 1).toLowerCase(Locale.ROOT) + flavorBuildType.substring(1)
        }
        return flavorBuildType
    }
}

方法二:重写 Transform 的 applyToVariant 方法

class TestTransform : Transform(){
    
    //如果返回 true 应用于指定的渠道,返回 false 则再次渠道不执行 transform 方法
    override fun applyToVariant(variant: VariantInfo): Boolean {
        return variant.buildTypeName.contains("release")
    }
}

参考文章:

今日头条 Android '秒' 级编译速度优化

Android 黑科技 |Gradle Plugin使用场景

RocketXPlugin