matrix-gradle-plugin 方法前后插桩实现代码分析

1.gradle文件配置

apply plugin: 'com.tencent.matrix-plugin'
matrix {

    logLevel "D"

    trace {
        enable = true
        baseMethodMapFile = "${project.projectDir}/matrixTrace/methodMapping.txt"
        blackListFile = "${project.projectDir}/matrixTrace/blackMethodList.txt"
    }
    removeUnusedResources {
        variant = "debug"

        v2 = removeUnusedResourcesV2Enable

        if (!v2) {
            unusedResources = project.ext.unusedResourcesSet
        }

        enable true
        needSign true
        shrinkArsc true
        shrinkDuplicates true
        use7zip = true
        zipAlign = true
        embedResGuard true

        apkCheckerPath = "${project.configurations.apkCheckerDependency.resolve().find { it.name.startsWith("matrix-apk-canary") }.getAbsolutePath()}"
        sevenZipPath = "${project.configurations.sevenZipDependency.resolve().getAt(0).getAbsolutePath()}"
        //Notice: You need to modify the  value of $apksignerPath on different platform. the value below only suitable for Mac Platform,
        //if on Windows, you may have to  replace apksigner with apksigner.bat.
        apksignerPath = "${android.getSdkDirectory().getAbsolutePath()}/build-tools/${android.getBuildToolsVersion()}/apksigner"
        zipAlignPath = "${android.getSdkDirectory().getAbsolutePath()}/build-tools/${android.getBuildToolsVersion()}/zipalign"
        ignoreResources = ["R.id.*", "R.bool.*", "R.layout.unused_layout"]
    }
}

2.MatrixPlugin插件起点

class MatrixPlugin : Plugin<Project> {
    companion object {//伴生对象,里边的值都是static的
        const val TAG = "Matrix.Plugin"
    }

    override fun apply(project: Project) {
//apply plugin: 'com.tencent.matrix-plugin'
//matrix {
//
//    logLevel "D"
//
//    trace {
//        enable = true
//        baseMethodMapFile = "${project.projectDir}/matrixTrace/methodMapping.txt"
//        blackListFile = "${project.projectDir}/matrixTrace/blackMethodList.txt"
//    }
//    removeUnusedResources {
//        variant = "debug"
//
//        v2 = removeUnusedResourcesV2Enable
//
//        if (!v2) {
//            unusedResources = project.ext.unusedResourcesSet
//        }
//
//        enable true
//        needSign true
//        shrinkArsc true
//        shrinkDuplicates true
//        use7zip = true
//        zipAlign = true
//        embedResGuard true
//
//        apkCheckerPath = "${project.configurations.apkCheckerDependency.resolve().find { it.name.startsWith("matrix-apk-canary") }.getAbsolutePath()}"
//        sevenZipPath = "${project.configurations.sevenZipDependency.resolve().getAt(0).getAbsolutePath()}"
//        //Notice: You need to modify the  value of $apksignerPath on different platform. the value below only suitable for Mac Platform,
//        //if on Windows, you may have to  replace apksigner with apksigner.bat.
//        apksignerPath = "${android.getSdkDirectory().getAbsolutePath()}/build-tools/${android.getBuildToolsVersion()}/apksigner"
//        zipAlignPath = "${android.getSdkDirectory().getAbsolutePath()}/build-tools/${android.getBuildToolsVersion()}/zipalign"
//        ignoreResources = ["R.id.*", "R.bool.*", "R.layout.unused_layout"]
//    }
//}
        //创建MatrixExtension对象
        val matrix = project.extensions.create("matrix", MatrixExtension::class.java)
        //创建MatrixTraceExtension对象
        val traceExtension = (matrix as ExtensionAware).extensions.create("trace", MatrixTraceExtension::class.java)
        //创建MatrixRemoveUnusedResExtension对象,todo
        val removeUnusedResourcesExtension = matrix.extensions.create("removeUnusedResources", MatrixRemoveUnusedResExtension::class.java)

        //只支持application
        if (!project.plugins.hasPlugin("com.android.application")) {
            throw GradleException("Matrix Plugin, Android Application plugin required.")
        }

        project.afterEvaluate {
            Log.setLogLevel(matrix.logLevel)//设置level
        }

        //创建Matrix的tasks
        MatrixTasksManager().createMatrixTasks(
                project.extensions.getByName("android") as AppExtension,
                project,
                traceExtension,
                removeUnusedResourcesExtension
        )
    }
}

3.MatrixExtension外部配置一些信息,logLevel

open class MatrixExtension(
        var clientVersion: String = "",//todo
        var uuid: String = "",//todo
        var output: String = "",//todo
        var logLevel: String = "I"//log的level
) {

    override fun toString(): String {
        return """| log vevel = $logLevel
//                  | uuid = $uuid
                """.trimMargin()
    }
}

4.MatrixTraceExtension配置

//Extension
public class MatrixTraceExtension {
    boolean transformInjectionForced;   //强制transfrom注入
    String baseMethodMapFile;           //base的mapping文件
    String blackListFile;               //不插桩的路径
    String customDexTransformName;      //自定义transform名字

    boolean enable;                     //开关

//    public void setEnable(boolean enable) {
//        this.enable = enable;
//        onTraceEnabled(enable);
//    }

    public String getBaseMethodMapFile() {
        return baseMethodMapFile;
    }

    public String getBlackListFile() {
        return blackListFile;
    }

    public String getCustomDexTransformName() {
        return customDexTransformName;
    }

    //Injection 注射; 大量资金的投入; (液体)注入,喷入;
    public boolean isTransformInjectionForced() {
        return transformInjectionForced;
    }

    public boolean isEnable() {
        return enable;
    }
}

5.MatrixTasksManager createMatrixTraceTask创建task

class MatrixTasksManager {

    companion object {
        const val TAG = "Matrix.TasksManager"
    }

    fun createMatrixTasks(android: AppExtension,
                          project: Project,
                          traceExtension: MatrixTraceExtension,
                          removeUnusedResourcesExtension: MatrixRemoveUnusedResExtension) {

        createMatrixTraceTask(android, project, traceExtension)

        createRemoveUnusedResourcesTask(android, project, removeUnusedResourcesExtension)//todo
    }

    private fun createMatrixTraceTask(
            android: AppExtension,
            project: Project,
            traceExtension: MatrixTraceExtension) {
        //MatrixTraceCompat调用inject方法
        MatrixTraceCompat().inject(android, project, traceExtension)
    }

    private fun createRemoveUnusedResourcesTask(
            android: AppExtension,
            project: Project,
            removeUnusedResourcesExtension: MatrixRemoveUnusedResExtension) {

        project.afterEvaluate {

            if (!removeUnusedResourcesExtension.enable) {
                return@afterEvaluate
            }

            android.applicationVariants.all { variant ->
                if (Util.isNullOrNil(removeUnusedResourcesExtension.variant) ||
                        variant.name.equals(removeUnusedResourcesExtension.variant, true)) {
                    Log.i(TAG, "RemoveUnusedResourcesExtension: %s", removeUnusedResourcesExtension)

                    val removeUnusedResourcesTaskProvider = if (removeUnusedResourcesExtension.v2) {
                        val action = RemoveUnusedResourcesTaskV2.CreationAction(
                                CreationConfig(variant, project), removeUnusedResourcesExtension
                        )
                        project.tasks.register(action.name, action.type, action)
                    } else {
                        val action = RemoveUnusedResourcesTask.CreationAction(
                                CreationConfig(variant, project), removeUnusedResourcesExtension
                        )
                        project.tasks.register(action.name, action.type, action)
                    }

                    variant.assembleProvider?.configure {
                        it.dependsOn(removeUnusedResourcesTaskProvider)
                    }

                    removeUnusedResourcesTaskProvider.configure {
                        it.dependsOn(variant.packageApplicationProvider)
                    }
                }
            }
        }
    }
}

6.MatrixTraceCompat //Compat兼容性;

class MatrixTraceCompat : ITraceSwitchListener {//Compat兼容性;

    companion object {
        const val TAG = "Matrix.TraceCompat"

        const val LEGACY_FLAG = "matrix_trace_legacy"//legacy遗产; 遗赠财物; 遗留; 后遗症;
    }

    var traceInjection: MatrixTraceInjection? = null

    init {
        if (VersionsCompat.greatThanOrEqual(AGPVersion.AGP_4_0_0)) {
            traceInjection = MatrixTraceInjection()
        }
    }

    override fun onTraceEnabled(enable: Boolean) {
        traceInjection?.onTraceEnabled(enable)
    }

    fun inject(appExtension: AppExtension, project: Project, extension: MatrixTraceExtension) {
        when {
            VersionsCompat.lessThan(AGPVersion.AGP_3_6_0) ->
                legacyInject(appExtension, project, extension)
            VersionsCompat.greatThanOrEqual(AGPVersion.AGP_4_0_0) -> {
                if (project.extensions.extraProperties.has(LEGACY_FLAG) &&
                    (project.extensions.extraProperties.get(LEGACY_FLAG) as? String?) == "true") {
                    legacyInject(appExtension, project, extension)
                } else {
                    traceInjection!!.inject(appExtension, project, extension)
                }
            }
            else -> Log.e(TAG, "Matrix does not support Android Gradle Plugin " +
                    "${VersionsCompat.androidGradlePluginVersion}!.")
        }
    }

    //legacy遗产; 遗赠财物; 遗留; 后遗症;
    private fun legacyInject(appExtension: AppExtension,
                             project: Project,
                             extension: MatrixTraceExtension) {

        project.afterEvaluate {

            if (!extension.isEnable) {
                return@afterEvaluate
            }

            appExtension.applicationVariants.all {
                MatrixTraceLegacyTransform.inject(extension, project, it)
            }
        }
    }
}

7.MatrixTraceInjection 开始注入的类

class MatrixTraceInjection : ITraceSwitchListener {

    companion object {
        const val TAG = "Matrix.TraceInjection"
    }

    private var traceEnable = false

    override fun onTraceEnabled(enable: Boolean) {
        traceEnable = enable
    }

    //step 1
    fun inject(appExtension: AppExtension,
               project: Project,
               extension: MatrixTraceExtension) {
        injectTransparentTransform(appExtension, project, extension)
        project.afterEvaluate {
            if (extension.isEnable) {
                doInjection(appExtension, project, extension)
            }
        }
    }

    private var transparentTransform: MatrixTraceTransform? = null

    //step 2
    private fun injectTransparentTransform(appExtension: AppExtension,
                                           project: Project,
                                           extension: MatrixTraceExtension) {
        //创建一个MatrixTraceTransform
        transparentTransform = MatrixTraceTransform(project, extension)
        //注册MatrixTraceTransform
        appExtension.registerTransform(transparentTransform!!)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值