DoKitExtUtil.kt 5.2 KB
Newer Older
J
jackjintai 已提交
1 2 3 4 5
package com.didichuxing.doraemonkit.plugin

import com.didichuxing.doraemonkit.plugin.extension.CommExt
import com.didichuxing.doraemonkit.plugin.extension.DoKitExt
import com.didichuxing.doraemonkit.plugin.extension.SlowMethodExt
J
jackjintai 已提交
6
import org.gradle.api.Project
J
jackjintai 已提交
7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22

/**
 * ================================================
 * 作    者:jint(金台)
 * 版    本:1.0
 * 创建日期:2020/3/24-14:58
 * 描    述:
 * 修订历史:
 * ================================================
 */
object DoKitExtUtil {
    //private var mApplicationId: String = ""

    /**
     * dokit 插件开关 字段权限必须为public 否则无法进行赋值
     */
J
jackjintai 已提交
23 24
    var DOKIT_PLUGIN_SWITCH = true
    var DOKIT_LOG_SWITCH = false
J
jackjintai 已提交
25 26 27 28

    /**
     * 默认函数调用为5级
     */
J
jackjintai 已提交
29
    var STACK_METHOD_LEVEL = 5
J
jackjintai 已提交
30 31 32 33

    /**
     * 慢函数默认关闭
     */
J
jackjintai 已提交
34
    var SLOW_METHOD_SWITCH = false
J
jackjintai 已提交
35 36 37 38 39


    /**
     * 慢函数策略 默认为函数调用栈策略
     */
J
jackjintai 已提交
40
    var SLOW_METHOD_STRATEGY = SlowMethodExt.STRATEGY_STACK
J
jackjintai 已提交
41 42 43 44 45 46

    private val applications: MutableSet<String> = mutableSetOf()
    var commExt = CommExt()
        private set
    val slowMethodExt = SlowMethodExt()

J
jackjintai 已提交
47

J
jackjintai 已提交
48
    fun dokitPluginSwitchOpen(): Boolean {
J
jackjintai 已提交
49
        return DOKIT_PLUGIN_SWITCH
J
jackjintai 已提交
50 51
    }

J
jackjintai 已提交
52

J
jackjintai 已提交
53
    fun dokitLogSwitchOpen(): Boolean {
J
jackjintai 已提交
54
        return DOKIT_LOG_SWITCH
J
jackjintai 已提交
55 56 57
    }

    fun dokitSlowMethodSwitchOpen(): Boolean {
J
jackjintai 已提交
58
        return SLOW_METHOD_SWITCH
J
jackjintai 已提交
59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168
    }

    /**
     * 初始化
     *
     * @param dokitEx dokitExtension
     * @param appExtension   appExtension
     */
    fun init(dokitEx: DoKitExt, applicationId: String) {
        //设置普通的配置
        commExt = dokitEx.comm
        //slowMethodExt.strategy = dokitEx.slowMethod.strategy
        //slowMethodExt.methodSwitch = dokitEx.slowMethod.methodSwitch
        /**
         * ============慢函数普通策略的配置 start==========
         */
        slowMethodExt.normalMethod.thresholdTime = dokitEx.slowMethod.normalMethod.thresholdTime
        //设置慢函数普通策略插装包名
        slowMethodExt.normalMethod.packageNames.clear()
        for (packageName in dokitEx.slowMethod.normalMethod.packageNames) {
            slowMethodExt.normalMethod.packageNames.add(packageName)
        }
        //添加默认的包名
        if (applicationId.isNotEmpty()) {
            if (slowMethodExt.normalMethod.packageNames.isEmpty()) {
                slowMethodExt.normalMethod.packageNames.add(applicationId)
            }
        }


        //设置慢函数普通策略插装包名黑名单
        slowMethodExt.normalMethod.methodBlacklist.clear()
        for (blackStr in dokitEx.slowMethod.normalMethod.methodBlacklist) {
            slowMethodExt.normalMethod.methodBlacklist.add(blackStr)
        }
        /**
         * ============慢函数普通策略的配置end==========
         */
        /**
         * ============慢函数stack策略的配置 start==========
         */
        slowMethodExt.stackMethod.thresholdTime = dokitEx.slowMethod.stackMethod.thresholdTime
        slowMethodExt.stackMethod.enterMethods.clear()
        //添加默认的入口函数
        for (application in applications) {
            val attachBaseContextMethodName = "$application.attachBaseContext"
            val onCreateMethodName = "$application.onCreate"
            slowMethodExt.stackMethod.enterMethods.add(attachBaseContextMethodName)
            slowMethodExt.stackMethod.enterMethods.add(onCreateMethodName)
        }
        for (methodName in dokitEx.slowMethod.stackMethod.enterMethods) {
            slowMethodExt.stackMethod.enterMethods.add(methodName)
        }
        /**
         * ============慢函数stack策略的配置  end==========
         */

    }


    fun setApplications(applications: MutableSet<String>) {
        if (applications.isEmpty()) {
            return
        }
        this.applications.clear()
        for (application in applications) {
            this.applications.add(application)
        }
    }

    fun ignorePackageNames(className: String): Boolean {
        //命中白名单返回false
        for (packageName in whitePackageNames) {
            if (className.startsWith(packageName, true)) {
                return false
            }
        }

        //命中黑名单返回true
        for (packageName in blackPackageNames) {
            if (className.startsWith(packageName, true)) {
                return true
            }
        }

        return false
    }


    /**
     * 白名单
     */
    private val whitePackageNames = arrayOf(
            "com.didichuxing.doraemonkit.DoraemonKit",
            "com.didichuxing.doraemonkit.DoraemonKitReal"
    )


    /**
     * 黑名单
     */
    private val blackPackageNames = arrayOf(
            "com.didichuxing.doraemonkit.",
            "kotlin.",
            "java.",
            "android.",
            "androidx."
    )

    fun log(tag: String, className: String, methodName: String, access: Int, desc: String, signature: String, thresholdTime: Int) {
J
jackjintai 已提交
169
        if (DOKIT_LOG_SWITCH) {
J
jackjintai 已提交
170 171 172 173 174
            println("$tag===matched====>  className===$className   methodName===$methodName   access===$access   desc===$desc   signature===$signature    thresholdTime===$thresholdTime")
        }
    }

}