<NME> settings.gradle
<BEF> ADDFILE
<MSG> [feat]  调整compose building  方便后续插件调试 推远端

<DFF> @@ -0,0 +1,1 @@
+include ':doraemonkit-plugin'

{'commit': 'diff --git a/Android/java/Plugin/.gitignore b/Android/java/Plugin/.gitignore\nnew file mode 100644\nindex 00000000..aa724b77\n--- /dev/null\n+++ b/Android/java/Plugin/.gitignore\n@@ -0,0 +1,15 @@\n+*.iml\n+.gradle\n+/local.properties\n+/.idea/caches\n+/.idea/libraries\n+/.idea/modules.xml\n+/.idea/workspace.xml\n+/.idea/navEditor.xml\n+/.idea/assetWizardSettings.xml\n+.DS_Store\n+/build\n+/captures\n+.externalNativeBuild\n+.cxx\n+local.properties\ndiff --git a/Android/java/Plugin/build.gradle b/Android/java/Plugin/build.gradle\nnew file mode 100644\nindex 00000000..04edaa95\n--- /dev/null\n+++ b/Android/java/Plugin/build.gradle\n@@ -0,0 +1,57 @@\n+// Top-level build file where you can add configuration options common to all sub-projects/modules.\n+buildscript {\n+    apply from: "../config.gradle"\n+    def archives_type = rootProject.ext.publish_config["archives_type"]\n+    def runType = rootProject.ext.publish_config["run_type"]\n+    def dokitPluginVersion = rootProject.ext.publish_config["version"]\n+    def kotlinVersion = rootProject.ext.android["kotlin_version"]\n+    def gradlePluginVersion\n+    if (archives_type == 2) {\n+        gradlePluginVersion = rootProject.ext.android["jcenter_gradle_plugin_version"]\n+    } else {\n+        gradlePluginVersion = rootProject.ext.android["gradle_plugin_version"]\n+    }\n+    repositories {\n+        maven {\n+            url \'https://maven.aliyun.com/repository/central/\'\n+        }\n+        maven {\n+            url "https://oss.sonatype.org/content/groups/public"\n+        }\n+        google()\n+        mavenCentral()\n+        //  maven { url \'http://artifactory.intra.xiaojukeji.com/artifactory/public\' }\n+        maven {\n+            //本地插件地址\n+            url uri(\'/Users/didi/project/dokit_repo\')\n+        }\n+    }\n+    dependencies {\n+        classpath "com.android.tools.build:gradle:$gradlePluginVersion"\n+        //jcenter\n+        // classpath "com.novoda:bintray-release:0.9.2"\n+        // MavenCentral\n+        classpath "org.jetbrains.dokka:dokka-gradle-plugin:1.4.30"\n+        if (runType == 1) {\n+            classpath "io.github.didi.dokit:dokitx-plugin:$dokitPluginVersion"\n+        }\n+        //classpath "com.didiglobal.booster:booster-task-compression-pngquant:${rootProject.ext.android["booster_version"]}"\n+        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion"\n+//        classpath "com.didiglobal.booster:booster-gradle-plugin:3.3.1"\n+//        classpath "com.didiglobal.booster:booster-task-analyser:3.3.1"\n+    }\n+}\n+\n+allprojects {\n+    repositories {\n+        maven {\n+            url \'https://maven.aliyun.com/repository/central/\'\n+        }\n+        google()\n+        mavenCentral()\n+    }\n+}\n+\n+task clean(type: Delete) {\n+    delete rootProject.buildDir\n+}\n\\ No newline at end of file\ndiff --git a/Android/java/buildSrc/.gitignore b/Android/java/Plugin/doraemonkit-plugin/.gitignore\nsimilarity index 100%\nrename from Android/java/buildSrc/.gitignore\nrename to Android/java/Plugin/doraemonkit-plugin/.gitignore\ndiff --git a/Android/java/doraemonkit-plugin/build.gradle b/Android/java/Plugin/doraemonkit-plugin/build.gradle\nsimilarity index 78%\nrename from Android/java/doraemonkit-plugin/build.gradle\nrename to Android/java/Plugin/doraemonkit-plugin/build.gradle\nindex 7c910831..4fa6d1ee 100644\n--- a/Android/java/doraemonkit-plugin/build.gradle\n+++ b/Android/java/Plugin/doraemonkit-plugin/build.gradle\n@@ -1,6 +1,6 @@\n apply plugin: \'kotlin\'\n apply plugin: \'kotlin-kapt\'\n-apply from: \'../upload.gradle\'\n+//apply from: \'../../upload.gradle\'\n \n sourceSets {\n     main {\n@@ -50,8 +50,8 @@ task deleteSource(type: Delete) {\n  */\n task copyPluginSource(type: Copy, dependsOn: deleteSource) {\n     println("===copySource start===")\n-    from \'./../buildSrc/src/main/kotlin\'\n-    into \'./src/main/kotlin\'\n+   // from \'./../buildSrc/src/main/kotlin\'\n+   // into \'./src/main/kotlin\'\n     println("===copySource end===")\n }\n \n@@ -63,11 +63,15 @@ if (PUBLISH_ARCHIVES_TYPE == 0 || PUBLISH_ARCHIVES_TYPE == 1) {\n }\n \n \n-repositories {\n-    google()\n-//    jcenter()\n-    mavenCentral()\n-}\n-\n-\n+apply plugin: \'java-gradle-plugin\'\n \n+gradlePlugin {\n+    plugins {\n+        version {\n+            // 在 app 模块需要通过 id 引用这个插件\n+            id = \'com.didi.dokit.debug\'\n+            // 实现这个插件的类的路径\n+            implementationClass = \'com.didichuxing.doraemonkit.plugin.DoKitPlugin\'\n+        }\n+    }\n+}\ndiff --git a/Android/java/doraemonkit-plugin/gradle.properties b/Android/java/Plugin/doraemonkit-plugin/gradle.properties\nsimilarity index 100%\nrename from Android/java/doraemonkit-plugin/gradle.properties\nrename to Android/java/Plugin/doraemonkit-plugin/gradle.properties\ndiff --git a/Android/java/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/DoKitExt.kt b/Android/java/Plugin/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/DoKitExt.kt\nsimilarity index 100%\nrename from Android/java/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/DoKitExt.kt\nrename to Android/java/Plugin/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/DoKitExt.kt\ndiff --git a/Android/java/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/DoKitExtUtil.kt b/Android/java/Plugin/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/DoKitExtUtil.kt\nsimilarity index 100%\nrename from Android/java/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/DoKitExtUtil.kt\nrename to Android/java/Plugin/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/DoKitExtUtil.kt\ndiff --git a/Android/java/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/DoKitPlugin.kt b/Android/java/Plugin/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/DoKitPlugin.kt\nsimilarity index 100%\nrename from Android/java/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/DoKitPlugin.kt\nrename to Android/java/Plugin/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/DoKitPlugin.kt\ndiff --git a/Android/java/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/DoKitPluginUtil.kt b/Android/java/Plugin/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/DoKitPluginUtil.kt\nsimilarity index 100%\nrename from Android/java/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/DoKitPluginUtil.kt\nrename to Android/java/Plugin/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/DoKitPluginUtil.kt\ndiff --git a/Android/java/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/DoKitTransformInvocation.kt b/Android/java/Plugin/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/DoKitTransformInvocation.kt\nsimilarity index 100%\nrename from Android/java/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/DoKitTransformInvocation.kt\nrename to Android/java/Plugin/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/DoKitTransformInvocation.kt\ndiff --git a/Android/java/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/DoKitTransformTaskExecutionListener.kt b/Android/java/Plugin/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/DoKitTransformTaskExecutionListener.kt\nsimilarity index 100%\nrename from Android/java/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/DoKitTransformTaskExecutionListener.kt\nrename to Android/java/Plugin/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/DoKitTransformTaskExecutionListener.kt\ndiff --git a/Android/java/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/ServiceLoader.kt b/Android/java/Plugin/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/ServiceLoader.kt\nsimilarity index 100%\nrename from Android/java/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/ServiceLoader.kt\nrename to Android/java/Plugin/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/ServiceLoader.kt\ndiff --git a/Android/java/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/ThirdLibInfo.kt b/Android/java/Plugin/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/ThirdLibInfo.kt\nsimilarity index 100%\nrename from Android/java/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/ThirdLibInfo.kt\nrename to Android/java/Plugin/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/ThirdLibInfo.kt\ndiff --git a/Android/java/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/asmtransformer/BaseDoKitAsmTransformer.kt b/Android/java/Plugin/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/asmtransformer/BaseDoKitAsmTransformer.kt\nsimilarity index 100%\nrename from Android/java/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/asmtransformer/BaseDoKitAsmTransformer.kt\nrename to Android/java/Plugin/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/asmtransformer/BaseDoKitAsmTransformer.kt\ndiff --git a/Android/java/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/asmtransformer/DoKitAsmTransformer.kt b/Android/java/Plugin/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/asmtransformer/DoKitAsmTransformer.kt\nsimilarity index 100%\nrename from Android/java/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/asmtransformer/DoKitAsmTransformer.kt\nrename to Android/java/Plugin/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/asmtransformer/DoKitAsmTransformer.kt\ndiff --git a/Android/java/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/classtransformer/AbsClassTransformer.kt b/Android/java/Plugin/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/classtransformer/AbsClassTransformer.kt\nsimilarity index 100%\nrename from Android/java/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/classtransformer/AbsClassTransformer.kt\nrename to Android/java/Plugin/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/classtransformer/AbsClassTransformer.kt\ndiff --git a/Android/java/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/classtransformer/BigImgTransformer.kt b/Android/java/Plugin/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/classtransformer/BigImgTransformer.kt\nsimilarity index 100%\nrename from Android/java/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/classtransformer/BigImgTransformer.kt\nrename to Android/java/Plugin/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/classtransformer/BigImgTransformer.kt\ndiff --git a/Android/java/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/classtransformer/CommTransformer.kt b/Android/java/Plugin/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/classtransformer/CommTransformer.kt\nsimilarity index 100%\nrename from Android/java/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/classtransformer/CommTransformer.kt\nrename to Android/java/Plugin/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/classtransformer/CommTransformer.kt\ndiff --git a/Android/java/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/classtransformer/EnterMethodStackTransformer.kt b/Android/java/Plugin/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/classtransformer/EnterMethodStackTransformer.kt\nsimilarity index 100%\nrename from Android/java/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/classtransformer/EnterMethodStackTransformer.kt\nrename to Android/java/Plugin/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/classtransformer/EnterMethodStackTransformer.kt\ndiff --git a/Android/java/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/classtransformer/GlobalSlowMethodTransformer.kt b/Android/java/Plugin/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/classtransformer/GlobalSlowMethodTransformer.kt\nsimilarity index 100%\nrename from Android/java/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/classtransformer/GlobalSlowMethodTransformer.kt\nrename to Android/java/Plugin/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/classtransformer/GlobalSlowMethodTransformer.kt\ndiff --git a/Android/java/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/classtransformer/MethodStackDepTransformer.kt b/Android/java/Plugin/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/classtransformer/MethodStackDepTransformer.kt\nsimilarity index 100%\nrename from Android/java/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/classtransformer/MethodStackDepTransformer.kt\nrename to Android/java/Plugin/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/classtransformer/MethodStackDepTransformer.kt\ndiff --git a/Android/java/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/classtransformer/UrlConnectionTransformer.kt b/Android/java/Plugin/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/classtransformer/UrlConnectionTransformer.kt\nsimilarity index 100%\nrename from Android/java/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/classtransformer/UrlConnectionTransformer.kt\nrename to Android/java/Plugin/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/classtransformer/UrlConnectionTransformer.kt\ndiff --git a/Android/java/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/extension/CommExt.kt b/Android/java/Plugin/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/extension/CommExt.kt\nsimilarity index 100%\nrename from Android/java/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/extension/CommExt.kt\nrename to Android/java/Plugin/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/extension/CommExt.kt\ndiff --git a/Android/java/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/extension/DoKitExt.kt b/Android/java/Plugin/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/extension/DoKitExt.kt\nsimilarity index 100%\nrename from Android/java/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/extension/DoKitExt.kt\nrename to Android/java/Plugin/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/extension/DoKitExt.kt\ndiff --git a/Android/java/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/extension/SlowMethodExt.kt b/Android/java/Plugin/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/extension/SlowMethodExt.kt\nsimilarity index 100%\nrename from Android/java/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/extension/SlowMethodExt.kt\nrename to Android/java/Plugin/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/extension/SlowMethodExt.kt\ndiff --git a/Android/java/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/processor/DoKitComponentHandler.kt b/Android/java/Plugin/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/processor/DoKitComponentHandler.kt\nsimilarity index 100%\nrename from Android/java/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/processor/DoKitComponentHandler.kt\nrename to Android/java/Plugin/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/processor/DoKitComponentHandler.kt\ndiff --git a/Android/java/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/processor/DoKitPluginConfigProcessor.kt b/Android/java/Plugin/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/processor/DoKitPluginConfigProcessor.kt\nsimilarity index 100%\nrename from Android/java/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/processor/DoKitPluginConfigProcessor.kt\nrename to Android/java/Plugin/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/processor/DoKitPluginConfigProcessor.kt\ndiff --git a/Android/java/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/stack_method/MethodStackNode.kt b/Android/java/Plugin/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/stack_method/MethodStackNode.kt\nsimilarity index 100%\nrename from Android/java/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/stack_method/MethodStackNode.kt\nrename to Android/java/Plugin/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/stack_method/MethodStackNode.kt\ndiff --git a/Android/java/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/stack_method/MethodStackNodeUtil.kt b/Android/java/Plugin/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/stack_method/MethodStackNodeUtil.kt\nsimilarity index 100%\nrename from Android/java/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/stack_method/MethodStackNodeUtil.kt\nrename to Android/java/Plugin/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/stack_method/MethodStackNodeUtil.kt\ndiff --git a/Android/java/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/transform/DoKitBaseTransform.kt b/Android/java/Plugin/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/transform/DoKitBaseTransform.kt\nsimilarity index 100%\nrename from Android/java/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/transform/DoKitBaseTransform.kt\nrename to Android/java/Plugin/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/transform/DoKitBaseTransform.kt\ndiff --git a/Android/java/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/transform/DoKitCommTransform.kt b/Android/java/Plugin/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/transform/DoKitCommTransform.kt\nsimilarity index 100%\nrename from Android/java/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/transform/DoKitCommTransform.kt\nrename to Android/java/Plugin/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/transform/DoKitCommTransform.kt\ndiff --git a/Android/java/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/transform/DoKitCommTransformV34.kt b/Android/java/Plugin/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/transform/DoKitCommTransformV34.kt\nsimilarity index 100%\nrename from Android/java/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/transform/DoKitCommTransformV34.kt\nrename to Android/java/Plugin/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/transform/DoKitCommTransformV34.kt\ndiff --git a/Android/java/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/transform/DoKitDependTransform.kt b/Android/java/Plugin/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/transform/DoKitDependTransform.kt\nsimilarity index 100%\nrename from Android/java/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/transform/DoKitDependTransform.kt\nrename to Android/java/Plugin/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/transform/DoKitDependTransform.kt\ndiff --git a/Android/java/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/transform/DoKitDependTransformV34.kt b/Android/java/Plugin/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/transform/DoKitDependTransformV34.kt\nsimilarity index 100%\nrename from Android/java/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/transform/DoKitDependTransformV34.kt\nrename to Android/java/Plugin/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/transform/DoKitDependTransformV34.kt\ndiff --git a/Android/java/doraemonkit-plugin/src/main/resources/META-INF/gradle-plugins/com.didi.dokit.properties b/Android/java/Plugin/doraemonkit-plugin/src/main/resources/META-INF/gradle-plugins/com.didi.dokit.properties\nsimilarity index 100%\nrename from Android/java/doraemonkit-plugin/src/main/resources/META-INF/gradle-plugins/com.didi.dokit.properties\nrename to Android/java/Plugin/doraemonkit-plugin/src/main/resources/META-INF/gradle-plugins/com.didi.dokit.properties\ndiff --git a/Android/java/doraemonkit-plugin/upload.sh b/Android/java/Plugin/doraemonkit-plugin/upload.sh\nsimilarity index 100%\nrename from Android/java/doraemonkit-plugin/upload.sh\nrename to Android/java/Plugin/doraemonkit-plugin/upload.sh\ndiff --git a/Android/java/Plugin/gradle.properties b/Android/java/Plugin/gradle.properties\nnew file mode 100644\nindex 00000000..25217527\n--- /dev/null\n+++ b/Android/java/Plugin/gradle.properties\n@@ -0,0 +1,19 @@\n+# Project-wide Gradle settings.\n+# IDE (e.g. Android Studio) users:\n+# Gradle settings configured through the IDE *will override*\n+# any settings specified in this file.\n+# For more details on how to configure your build environment visit\n+# http://www.gradle.org/docs/current/userguide/build_environment.html\n+# Specifies the JVM arguments used for the daemon process.\n+# The setting is particularly useful for tweaking memory settings.\n+org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8\n+# When configured, Gradle will run in incubating parallel mode.\n+# This option should only be used with decoupled projects. More details, visit\n+# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects\n+# org.gradle.parallel=true\n+# AndroidX package structure to make it clearer which packages are bundled with the\n+# Android operating system, and which are packaged with your app"s APK\n+# https://developer.android.com/topic/libraries/support-library/androidx-rn\n+android.useAndroidX=true\n+# Kotlin code style for this project: "official" or "obsolete":\n+kotlin.code.style=official\n\\ No newline at end of file\ndiff --git a/Android/java/Plugin/gradle/wrapper/gradle-wrapper.jar b/Android/java/Plugin/gradle/wrapper/gradle-wrapper.jar\nnew file mode 100644\nindex 00000000..f6b961fd\nBinary files /dev/null and b/Android/java/Plugin/gradle/wrapper/gradle-wrapper.jar differ\ndiff --git a/Android/java/Plugin/gradle/wrapper/gradle-wrapper.properties b/Android/java/Plugin/gradle/wrapper/gradle-wrapper.properties\nnew file mode 100644\nindex 00000000..b571256a\n--- /dev/null\n+++ b/Android/java/Plugin/gradle/wrapper/gradle-wrapper.properties\n@@ -0,0 +1,6 @@\n+#Wed Jul 14 22:41:53 CST 2021\n+distributionBase=GRADLE_USER_HOME\n+distributionUrl=https\\://services.gradle.org/distributions/gradle-6.7.1-bin.zip\n+distributionPath=wrapper/dists\n+zipStorePath=wrapper/dists\n+zipStoreBase=GRADLE_USER_HOME\ndiff --git a/Android/java/Plugin/gradlew b/Android/java/Plugin/gradlew\nnew file mode 100755\nindex 00000000..cccdd3d5\n--- /dev/null\n+++ b/Android/java/Plugin/gradlew\n@@ -0,0 +1,172 @@\n+#!/usr/bin/env sh\n+\n+##############################################################################\n+##\n+##  Gradle start up script for UN*X\n+##\n+##############################################################################\n+\n+# Attempt to set APP_HOME\n+# Resolve links: $0 may be a link\n+PRG="$0"\n+# Need this for relative symlinks.\n+while [ -h "$PRG" ] ; do\n+    ls=`ls -ld "$PRG"`\n+    link=`expr "$ls" : \'.*-> \\(.*\\)$\'`\n+    if expr "$link" : \'/.*\' > /dev/null; then\n+        PRG="$link"\n+    else\n+        PRG=`dirname "$PRG"`"/$link"\n+    fi\n+done\n+SAVED="`pwd`"\n+cd "`dirname \\"$PRG\\"`/" >/dev/null\n+APP_HOME="`pwd -P`"\n+cd "$SAVED" >/dev/null\n+\n+APP_NAME="Gradle"\n+APP_BASE_NAME=`basename "$0"`\n+\n+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\n+DEFAULT_JVM_OPTS=""\n+\n+# Use the maximum available, or set MAX_FD != -1 to use that value.\n+MAX_FD="maximum"\n+\n+warn () {\n+    echo "$*"\n+}\n+\n+die () {\n+    echo\n+    echo "$*"\n+    echo\n+    exit 1\n+}\n+\n+# OS specific support (must be \'true\' or \'false\').\n+cygwin=false\n+msys=false\n+darwin=false\n+nonstop=false\n+case "`uname`" in\n+  CYGWIN* )\n+    cygwin=true\n+    ;;\n+  Darwin* )\n+    darwin=true\n+    ;;\n+  MINGW* )\n+    msys=true\n+    ;;\n+  NONSTOP* )\n+    nonstop=true\n+    ;;\n+esac\n+\n+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar\n+\n+# Determine the Java command to use to start the JVM.\n+if [ -n "$JAVA_HOME" ] ; then\n+    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then\n+        # IBM\'s JDK on AIX uses strange locations for the executables\n+        JAVACMD="$JAVA_HOME/jre/sh/java"\n+    else\n+        JAVACMD="$JAVA_HOME/bin/java"\n+    fi\n+    if [ ! -x "$JAVACMD" ] ; then\n+        die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME\n+\n+Please set the JAVA_HOME variable in your environment to match the\n+location of your Java installation."\n+    fi\n+else\n+    JAVACMD="java"\n+    which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no \'java\' command could be found in your PATH.\n+\n+Please set the JAVA_HOME variable in your environment to match the\n+location of your Java installation."\n+fi\n+\n+# Increase the maximum file descriptors if we can.\n+if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then\n+    MAX_FD_LIMIT=`ulimit -H -n`\n+    if [ $? -eq 0 ] ; then\n+        if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then\n+            MAX_FD="$MAX_FD_LIMIT"\n+        fi\n+        ulimit -n $MAX_FD\n+        if [ $? -ne 0 ] ; then\n+            warn "Could not set maximum file descriptor limit: $MAX_FD"\n+        fi\n+    else\n+        warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"\n+    fi\n+fi\n+\n+# For Darwin, add options to specify how the application appears in the dock\n+if $darwin; then\n+    GRADLE_OPTS="$GRADLE_OPTS \\"-Xdock:name=$APP_NAME\\" \\"-Xdock:icon=$APP_HOME/media/gradle.icns\\""\n+fi\n+\n+# For Cygwin, switch paths to Windows format before running java\n+if $cygwin ; then\n+    APP_HOME=`cygpath --path --mixed "$APP_HOME"`\n+    CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`\n+    JAVACMD=`cygpath --unix "$JAVACMD"`\n+\n+    # We build the pattern for arguments to be converted via cygpath\n+    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`\n+    SEP=""\n+    for dir in $ROOTDIRSRAW ; do\n+        ROOTDIRS="$ROOTDIRS$SEP$dir"\n+        SEP="|"\n+    done\n+    OURCYGPATTERN="(^($ROOTDIRS))"\n+    # Add a user-defined pattern to the cygpath arguments\n+    if [ "$GRADLE_CYGPATTERN" != "" ] ; then\n+        OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"\n+    fi\n+    # Now convert the arguments - kludge to limit ourselves to /bin/sh\n+    i=0\n+    for arg in "$@" ; do\n+        CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`\n+        CHECK2=`echo "$arg"|egrep -c "^-"`                                 ### Determine if an option\n+\n+        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition\n+            eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`\n+        else\n+            eval `echo args$i`="\\"$arg\\""\n+        fi\n+        i=$((i+1))\n+    done\n+    case $i in\n+        (0) set -- ;;\n+        (1) set -- "$args0" ;;\n+        (2) set -- "$args0" "$args1" ;;\n+        (3) set -- "$args0" "$args1" "$args2" ;;\n+        (4) set -- "$args0" "$args1" "$args2" "$args3" ;;\n+        (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;\n+        (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;\n+        (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;\n+        (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;\n+        (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;\n+    esac\n+fi\n+\n+# Escape application args\n+save () {\n+    for i do printf %s\\\\n "$i" | sed "s/\'/\'\\\\\\\\\'\'/g;1s/^/\'/;\\$s/\\$/\' \\\\\\\\/" ; done\n+    echo " "\n+}\n+APP_ARGS=$(save "$@")\n+\n+# Collect all arguments for the java command, following the shell quoting and substitution rules\n+eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\\"-Dorg.gradle.appname=$APP_BASE_NAME\\"" -classpath "\\"$CLASSPATH\\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"\n+\n+# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong\n+if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then\n+  cd "$(dirname "$0")"\n+fi\n+\n+exec "$JAVACMD" "$@"\ndiff --git a/Android/java/Plugin/gradlew.bat b/Android/java/Plugin/gradlew.bat\nnew file mode 100644\nindex 00000000..e95643d6\n--- /dev/null\n+++ b/Android/java/Plugin/gradlew.bat\n@@ -0,0 +1,84 @@\n+@if "%DEBUG%" == "" @echo off\r\n+@rem ##########################################################################\r\n+@rem\r\n+@rem  Gradle startup script for Windows\r\n+@rem\r\n+@rem ##########################################################################\r\n+\r\n+@rem Set local scope for the variables with windows NT shell\r\n+if "%OS%"=="Windows_NT" setlocal\r\n+\r\n+set DIRNAME=%~dp0\r\n+if "%DIRNAME%" == "" set DIRNAME=.\r\n+set APP_BASE_NAME=%~n0\r\n+set APP_HOME=%DIRNAME%\r\n+\r\n+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\r\n+set DEFAULT_JVM_OPTS=\r\n+\r\n+@rem Find java.exe\r\n+if defined JAVA_HOME goto findJavaFromJavaHome\r\n+\r\n+set JAVA_EXE=java.exe\r\n+%JAVA_EXE% -version >NUL 2>&1\r\n+if "%ERRORLEVEL%" == "0" goto init\r\n+\r\n+echo.\r\n+echo ERROR: JAVA_HOME is not set and no \'java\' command could be found in your PATH.\r\n+echo.\r\n+echo Please set the JAVA_HOME variable in your environment to match the\r\n+echo location of your Java installation.\r\n+\r\n+goto fail\r\n+\r\n+:findJavaFromJavaHome\r\n+set JAVA_HOME=%JAVA_HOME:"=%\r\n+set JAVA_EXE=%JAVA_HOME%/bin/java.exe\r\n+\r\n+if exist "%JAVA_EXE%" goto init\r\n+\r\n+echo.\r\n+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%\r\n+echo.\r\n+echo Please set the JAVA_HOME variable in your environment to match the\r\n+echo location of your Java installation.\r\n+\r\n+goto fail\r\n+\r\n+:init\r\n+@rem Get command-line arguments, handling Windows variants\r\n+\r\n+if not "%OS%" == "Windows_NT" goto win9xME_args\r\n+\r\n+:win9xME_args\r\n+@rem Slurp the command line arguments.\r\n+set CMD_LINE_ARGS=\r\n+set _SKIP=2\r\n+\r\n+:win9xME_args_slurp\r\n+if "x%~1" == "x" goto execute\r\n+\r\n+set CMD_LINE_ARGS=%*\r\n+\r\n+:execute\r\n+@rem Setup the command line\r\n+\r\n+set CLASSPATH=%APP_HOME%\\gradle\\wrapper\\gradle-wrapper.jar\r\n+\r\n+@rem Execute Gradle\r\n+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%\r\n+\r\n+:end\r\n+@rem End local scope for the variables with windows NT shell\r\n+if "%ERRORLEVEL%"=="0" goto mainEnd\r\n+\r\n+:fail\r\n+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of\r\n+rem the _cmd.exe /c_ return code!\r\n+if  not "" == "%GRADLE_EXIT_CONSOLE%" exit 1\r\n+exit /b 1\r\n+\r\n+:mainEnd\r\n+if "%OS%"=="Windows_NT" endlocal\r\n+\r\n+:omega\r\ndiff --git a/Android/java/Plugin/settings.gradle b/Android/java/Plugin/settings.gradle\nnew file mode 100644\nindex 00000000..d257e5f3\n--- /dev/null\n+++ b/Android/java/Plugin/settings.gradle\n@@ -0,0 +1 @@\n+include \':doraemonkit-plugin\'\ndiff --git a/Android/java/app/doraemonkit.gradle b/Android/java/app/doraemonkit.gradle\nindex ded690e9..04a93c80 100644\n--- a/Android/java/app/doraemonkit.gradle\n+++ b/Android/java/app/doraemonkit.gradle\n@@ -1,7 +1,7 @@\n def runType = rootProject.ext.publish_config["run_type"]\n if (runType == 0) {\n     // 引用插件\n-    apply plugin: \'com.didi.dokit.debug\'\n+    apply plugin: \'com.didi.dokit\'\n     // 这里引用正常库\n     dependencies {\n         //外部平台依赖\n@@ -9,7 +9,7 @@ if (runType == 0) {\n         debugImplementation project(":doraemonkit-mc")\n         debugImplementation project(":doraemonkit-ft")\n         debugImplementation project(":doraemonkit-weex")\n-        debugImplementation project(":doraemonkit-rpc")\n+//        debugImplementation project(":doraemonkit-rpc")\n         releaseImplementation project(":doraemonkit-no-op")\n     }\n } else if (runType == 1) {\ndiff --git a/Android/java/build.gradle b/Android/java/build.gradle\nindex 36acce20..b80d6268 100644\n--- a/Android/java/build.gradle\n+++ b/Android/java/build.gradle\n@@ -13,13 +13,16 @@ buildscript {\n     }\n \n     repositories {\n+        maven {\n+            url \'https://maven.aliyun.com/repository/central/\'\n+        }\n         google()\n         mavenCentral()\n         jcenter()\n         maven {\n             url "https://oss.sonatype.org/content/groups/public"\n         }\n-        maven { url \'http://artifactory.intra.xiaojukeji.com/artifactory/public\' }\n+      //  maven { url \'http://artifactory.intra.xiaojukeji.com/artifactory/public\' }\n         maven {\n             //本地插件地址\n             url uri(\'/Users/didi/project/dokit_repo\')\n@@ -42,15 +45,23 @@ buildscript {\n \n }\n \n+plugins {\n+    // 这个 id 就是在 versionPlugin 文件夹下 build.gradle 文件内定义的id apply fasle  代表当前build不引入\n+    id "com.didi.dokit.debug" apply false\n+}\n+\n allprojects {\n     repositories {\n+        maven {\n+            url \'https://maven.aliyun.com/repository/central/\'\n+        }\n         google()\n         mavenCentral()\n         jcenter()\n         maven {\n             url "https://oss.sonatype.org/content/groups/public"\n         }\n-        maven { url \'http://artifactory.intra.xiaojukeji.com/artifactory/public\' }\n+       // maven { url \'http://artifactory.intra.xiaojukeji.com/artifactory/public\' }\n         maven {\n             //本地插件地址\n             url uri(\'/Users/didi/project/dokit_repo\')\ndiff --git a/Android/java/buildSrc/build.gradle b/Android/java/buildSrc/build.gradle\ndeleted file mode 100644\nindex b5d400f9..00000000\n--- a/Android/java/buildSrc/build.gradle\n+++ /dev/null\n@@ -1,65 +0,0 @@\n-buildscript {\n-    apply from: "../config.gradle"\n-    repositories {\n-        mavenLocal()\n-        mavenCentral()\n-        google()\n-        jcenter()\n-        maven { url \'https://oss.sonatype.org/content/repositories/public/\' }\n-        maven { url \'https://oss.sonatype.org/content/repositories/snapshots/\' }\n-    }\n-    dependencies {\n-        //classpath \'com.android.tools.build:gradle:3.3.0\'\n-        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:${rootProject.ext.android["kotlin_version"]}"\n-    }\n-}\n-//apply plugin: \'java-library\'\n-apply plugin: \'kotlin\'\n-apply plugin: \'kotlin-kapt\'\n-\n-/**\n- * 由于 buildSrc 的执行时机要早于任何一个 project，因此需要⾃⼰添加仓库\n- */\n-repositories {\n-    mavenLocal()\n-    mavenCentral()\n-    google()\n-    jcenter()\n-    maven { url \'https://oss.sonatype.org/content/repositories/public/\' }\n-    maven { url \'https://oss.sonatype.org/content/repositories/snapshots/\' }\n-}\n-\n-sourceSets {\n-    main {\n-        java {\n-            srcDirs += []\n-        }\n-        kotlin {\n-            srcDirs += [\'src/main/kotlin\', \'src/main/java\']\n-        }\n-    }\n-\n-\n-}\n-\n-compileKotlin {\n-    kotlinOptions.jvmTarget = JavaVersion.VERSION_1_8\n-}\n-\n-def archives_type = rootProject.ext.publish_config["archives_type"]\n-def gradlePluginVersion\n-if (archives_type == 2) {\n-    gradlePluginVersion = rootProject.ext.android["jcenter_gradle_plugin_version"]\n-} else {\n-    gradlePluginVersion = rootProject.ext.android["gradle_plugin_version"]\n-}\n-\n-dependencies {\n-    compileOnly localGroovy()\n-    compileOnly gradleApi()\n-\n-    implementation "com.android.tools.build:gradle:$gradlePluginVersion"\n-    /* 👇👇👇👇 引用这两个模块 👇👇👇👇 */\n-    api "com.didiglobal.booster:booster-api:${rootProject.ext.android["booster_version"]}"\n-    api "com.didiglobal.booster:booster-transform-asm:${rootProject.ext.android["booster_version"]}"\n-}\n\\ No newline at end of file\ndiff --git a/Android/java/buildSrc/src/main/resources/META-INF/gradle-plugins/com.didi.dokit.debug.properties b/Android/java/buildSrc/src/main/resources/META-INF/gradle-plugins/com.didi.dokit.debug.properties\ndeleted file mode 100644\nindex 6a3ff653..00000000\n--- a/Android/java/buildSrc/src/main/resources/META-INF/gradle-plugins/com.didi.dokit.debug.properties\n+++ /dev/null\n@@ -1,3 +0,0 @@\n-#入口文件\n-#文件名为插件名 即 apply plugin "xxx"\n-implementation-class=com.didichuxing.doraemonkit.plugin.DoKitPlugin\n\\ No newline at end of file\ndiff --git a/Android/java/doraemonkit-plugin/.gitignore b/Android/java/doraemonkit-plugin/.gitignore\ndeleted file mode 100644\nindex 796b96d1..00000000\n--- a/Android/java/doraemonkit-plugin/.gitignore\n+++ /dev/null\n@@ -1 +0,0 @@\n-/build\ndiff --git a/Android/java/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/DoKitExt.kt b/Android/java/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/DoKitExt.kt\ndeleted file mode 100644\nindex 3561de36..00000000\n--- a/Android/java/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/DoKitExt.kt\n+++ /dev/null\n@@ -1,138 +0,0 @@\n-package com.didichuxing.doraemonkit.plugin\n-\n-import com.android.build.gradle.api.BaseVariant\n-import com.android.dex.DexFormat\n-import com.android.dx.command.dexer.Main\n-import com.didiglobal.booster.kotlinx.NCPU\n-import com.didiglobal.booster.transform.TransformContext\n-import org.objectweb.asm.Opcodes.*\n-import org.objectweb.asm.tree.*\n-import java.io.File\n-\n-/**\n- * ================================================\n- * 作    者：jint（金台）\n- * 版    本：1.0\n- * 创建日期：2020/5/19-18:00\n- * 描    述：dokit 对象扩展\n- * 修订历史：\n- * ================================================\n- */\n-\n-fun MethodNode.isGetSetMethod(): Boolean {\n-    var ignoreCount = 0\n-    val iterator = instructions.iterator()\n-    while (iterator.hasNext()) {\n-        val insnNode = iterator.next()\n-        val opcode = insnNode.opcode\n-        if (-1 == opcode) {\n-            continue\n-        }\n-        if (opcode != GETFIELD && opcode != GETSTATIC && opcode != H_GETFIELD && opcode != H_GETSTATIC && opcode != RETURN && opcode != ARETURN && opcode != DRETURN && opcode != FRETURN && opcode != LRETURN && opcode != IRETURN && opcode != PUTFIELD && opcode != PUTSTATIC && opcode != H_PUTFIELD && opcode != H_PUTSTATIC && opcode > SALOAD) {\n-            if (name.equals("<init>") && opcode == INVOKESPECIAL) {\n-                ignoreCount++\n-                if (ignoreCount > 1) {\n-                    return false\n-                }\n-                continue\n-            }\n-            return false\n-        }\n-    }\n-    return true\n-}\n-\n-fun MethodNode.isSingleMethod(): Boolean {\n-    val iterator = instructions.iterator()\n-    while (iterator.hasNext()) {\n-        val insnNode = iterator.next()\n-        val opcode = insnNode.opcode\n-        if (-1 == opcode) {\n-            continue\n-        } else if (INVOKEVIRTUAL <= opcode && opcode <= INVOKEDYNAMIC) {\n-            return false\n-        }\n-    }\n-    return true\n-}\n-\n-fun MethodNode.isEmptyMethod(): Boolean {\n-    val iterator = instructions.iterator()\n-    while (iterator.hasNext()) {\n-        val insnNode = iterator.next()\n-        val opcode = insnNode.opcode\n-        return if (-1 == opcode) {\n-            continue\n-        } else {\n-            false\n-        }\n-    }\n-    return true\n-}\n-\n-\n-fun InsnList.getMethodExitInsnNodes(): Sequence<InsnNode>? {\n-    return this.iterator()?.asSequence()?.filterIsInstance(InsnNode::class.java)?.filter {\n-        it.opcode == RETURN ||\n-                it.opcode == IRETURN ||\n-                it.opcode == FRETURN ||\n-                it.opcode == ARETURN ||\n-                it.opcode == LRETURN ||\n-                it.opcode == DRETURN ||\n-                it.opcode == ATHROW\n-    }\n-}\n-\n-fun BaseVariant.isRelease(): Boolean {\n-    if (this.name.contains("release") || this.name.contains("Release")) {\n-        return true\n-    }\n-    return false\n-}\n-\n-\n-fun TransformContext.isRelease(): Boolean {\n-    if (this.name.contains("release") || this.name.contains("Release")) {\n-        return true\n-    }\n-    return false\n-}\n-\n-\n-fun String.println() {\n-    if (DoKitExtUtil.dokitLogSwitchOpen()) {\n-        println("[dokit plugin]===>$this")\n-    }\n-}\n-\n-fun File.lastPath(): String {\n-    return this.path.split("/").last()\n-}\n-\n-val MethodInsnNode.ownerClassName: String\n-    get() = owner.replace(\'/\', \'.\')\n-\n-\n-val ClassNode.formatSuperName: String\n-    get() = superName.replace(\'/\', \'.\')\n-\n-internal fun File.dex(output: File, api: Int = DexFormat.API_NO_EXTENDED_OPCODES): Int {\n-    val args = Main.Arguments().apply {\n-        numThreads = NCPU\n-        debug = true\n-        warnings = true\n-        emptyOk = true\n-        multiDex = true\n-        jarOutput = true\n-        optimize = false\n-        minSdkVersion = api\n-        fileNames = arrayOf(output.canonicalPath)\n-        outName = canonicalPath\n-    }\n-    return try {\n-        Main.run(args)\n-    } catch (t: Throwable) {\n-        t.printStackTrace()\n-        -1\n-    }\n-}\ndiff --git a/Android/java/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/DoKitExtUtil.kt b/Android/java/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/DoKitExtUtil.kt\ndeleted file mode 100644\nindex 1f44a44a..00000000\n--- a/Android/java/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/DoKitExtUtil.kt\n+++ /dev/null\n@@ -1,227 +0,0 @@\n-package com.didichuxing.doraemonkit.plugin\n-\n-import com.didichuxing.doraemonkit.plugin.extension.CommExt\n-import com.didichuxing.doraemonkit.plugin.extension.DoKitExt\n-import com.didichuxing.doraemonkit.plugin.extension.SlowMethodExt\n-import org.gradle.api.Project\n-\n-/**\n- * ================================================\n- * 作    者：jint（金台）\n- * 版    本：1.0\n- * 创建日期：2020/3/24-14:58\n- * 描    述：\n- * 修订历史：\n- * ================================================\n- */\n-object DoKitExtUtil {\n-\n-    /**\n-     * 是否包含dokitx-rpc模块\n-     */\n-    var HAS_DOKIT_RPC_MODULE = false\n-    //private var mApplicationId: String = ""\n-\n-    /**\n-     * 三方库版本信息\n-     */\n-//    val THIRD_LIB_INFOS = mutableMapOf<String, ThirdLibInfo>()\n-\n-    val THIRD_LIB_INFOS = mutableListOf<ThirdLibInfo>()\n-\n-    /**\n-     * dokit 插件开关 字段权限必须为public 否则无法进行赋值\n-     */\n-    var DOKIT_PLUGIN_SWITCH = true\n-    var DOKIT_LOG_SWITCH = false\n-\n-    /**\n-     * 默认函数调用为5级\n-     */\n-    var STACK_METHOD_LEVEL = 5\n-\n-    /**\n-     * 自定义webview全限定名\n-     */\n-    var WEBVIEW_CLASS_NAME: String = ""\n-\n-\n-    /**\n-     * 慢函数默认关闭\n-     */\n-    var SLOW_METHOD_SWITCH = false\n-\n-    /**\n-     * 三方库信息开关\n-     */\n-    var THIRD_LIBINFO_SWITCH = true\n-\n-\n-    /**\n-     * 慢函数策略 默认为函数调用栈策略\n-     */\n-    var SLOW_METHOD_STRATEGY = SlowMethodExt.STRATEGY_STACK\n-\n-    private val applications: MutableSet<String> = mutableSetOf()\n-\n-    /**\n-     * app的packageName\n-     */\n-    private var appPackageName: String = ""\n-\n-    var commExt = CommExt()\n-        private set\n-    val slowMethodExt = SlowMethodExt()\n-\n-\n-    fun dokitPluginSwitchOpen(): Boolean {\n-        return DOKIT_PLUGIN_SWITCH\n-    }\n-\n-\n-    fun dokitLogSwitchOpen(): Boolean {\n-        return DOKIT_LOG_SWITCH\n-    }\n-\n-    fun dokitSlowMethodSwitchOpen(): Boolean {\n-        return SLOW_METHOD_SWITCH\n-    }\n-\n-    /**\n-     * 初始化\n-     *\n-     * @param dokitEx dokitExtension\n-     * @param appExtension   appExtension\n-     */\n-    fun init(dokitEx: DoKitExt) {\n-        //设置普通的配置\n-        commExt = dokitEx.comm\n-        //slowMethodExt.strategy = dokitEx.slowMethod.strategy\n-        //slowMethodExt.methodSwitch = dokitEx.slowMethod.methodSwitch\n-        /**\n-         * ============慢函数普通策略的配置 start==========\n-         */\n-        slowMethodExt.normalMethod.thresholdTime = dokitEx.slowMethod.normalMethod.thresholdTime\n-        //设置慢函数普通策略插装包名\n-        slowMethodExt.normalMethod.packageNames.clear()\n-        for (packageName in dokitEx.slowMethod.normalMethod.packageNames) {\n-            slowMethodExt.normalMethod.packageNames.add(packageName)\n-        }\n-        //添加默认的包名\n-        if (appPackageName.isNotEmpty()) {\n-            if (slowMethodExt.normalMethod.packageNames.isEmpty()) {\n-                slowMethodExt.normalMethod.packageNames.add(appPackageName)\n-            }\n-        }\n-\n-\n-        //设置慢函数普通策略插装包名黑名单\n-        slowMethodExt.normalMethod.methodBlacklist.clear()\n-        for (blackStr in dokitEx.slowMethod.normalMethod.methodBlacklist) {\n-            slowMethodExt.normalMethod.methodBlacklist.add(blackStr)\n-        }\n-        /**\n-         * ============慢函数普通策略的配置end==========\n-         */\n-        /**\n-         * ============慢函数stack策略的配置 start==========\n-         */\n-        slowMethodExt.stackMethod.thresholdTime = dokitEx.slowMethod.stackMethod.thresholdTime\n-        slowMethodExt.stackMethod.enterMethods.clear()\n-        //添加默认的入口函数\n-        for (application in applications) {\n-            val attachBaseContextMethodName = "$application.attachBaseContext"\n-            val onCreateMethodName = "$application.onCreate"\n-            slowMethodExt.stackMethod.enterMethods.add(attachBaseContextMethodName)\n-            slowMethodExt.stackMethod.enterMethods.add(onCreateMethodName)\n-        }\n-        for (methodName in dokitEx.slowMethod.stackMethod.enterMethods) {\n-            slowMethodExt.stackMethod.enterMethods.add(methodName)\n-        }\n-\n-        //设置慢函数调用栈策略插装包名黑名单\n-        slowMethodExt.stackMethod.methodBlacklist.clear()\n-        for (blackStr in dokitEx.slowMethod.stackMethod.methodBlacklist) {\n-            slowMethodExt.stackMethod.methodBlacklist.add(blackStr)\n-        }\n-\n-        /**\n-         * ============慢函数stack策略的配置  end==========\n-         */\n-\n-    }\n-\n-\n-    fun setApplications(applications: MutableSet<String>) {\n-        if (applications.isEmpty()) {\n-            return\n-        }\n-        this.applications.clear()\n-        for (application in applications) {\n-            this.applications.add(application)\n-        }\n-    }\n-\n-    /**\n-     * 设置packageName\n-     */\n-    fun setAppPackageName(packageName: String) {\n-        appPackageName = packageName\n-    }\n-\n-    fun ignorePackageNames(className: String): Boolean {\n-        //命中白名单返回false\n-        for (packageName in whitePackageNames) {\n-            if (className.startsWith(packageName, true)) {\n-                return false\n-            }\n-        }\n-\n-        //命中黑名单返回true\n-        for (packageName in blackPackageNames) {\n-            if (className.startsWith(packageName, true)) {\n-                return true\n-            }\n-        }\n-\n-        return false\n-    }\n-\n-\n-    /**\n-     * 白名单\n-     */\n-    private val whitePackageNames = arrayOf(\n-        "com.didichuxing.doraemonkit.DoraemonKit",\n-        "com.didichuxing.doraemonkit.DoKit",\n-        "com.didichuxing.doraemonkit.DoKitReal"\n-\n-    )\n-\n-\n-    /**\n-     * 黑名单\n-     */\n-    private val blackPackageNames = arrayOf(\n-        "com.didichuxing.doraemonkit.",\n-        "kotlin.",\n-        "java.",\n-        "android.",\n-        "androidx."\n-    )\n-\n-    fun log(\n-        tag: String,\n-        className: String,\n-        methodName: String,\n-        access: Int,\n-        desc: String,\n-        signature: String,\n-        thresholdTime: Int\n-    ) {\n-        if (DOKIT_LOG_SWITCH) {\n-            println("$tag===matched====>  className===$className   methodName===$methodName   access===$access   desc===$desc   signature===$signature    thresholdTime===$thresholdTime")\n-        }\n-    }\n-\n-}\n\\ No newline at end of file\ndiff --git a/Android/java/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/DoKitPlugin.kt b/Android/java/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/DoKitPlugin.kt\ndeleted file mode 100644\nindex 02bfa10e..00000000\n--- a/Android/java/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/DoKitPlugin.kt\n+++ /dev/null\n@@ -1,182 +0,0 @@\n-package com.didichuxing.doraemonkit.plugin\n-\n-import com.android.build.gradle.AppExtension\n-import com.android.build.gradle.LibraryExtension\n-import com.didichuxing.doraemonkit.plugin.extension.DoKitExt\n-import com.didichuxing.doraemonkit.plugin.extension.SlowMethodExt\n-import com.didichuxing.doraemonkit.plugin.processor.DoKitPluginConfigProcessor\n-import com.didichuxing.doraemonkit.plugin.stack_method.MethodStackNodeUtil\n-import com.didichuxing.doraemonkit.plugin.transform.*\n-import com.didiglobal.booster.gradle.GTE_V3_4\n-import com.didiglobal.booster.gradle.dependencies\n-import com.didiglobal.booster.gradle.getAndroid\n-import com.didiglobal.booster.gradle.getProperty\n-import org.gradle.api.Plugin\n-import org.gradle.api.Project\n-import org.gradle.api.artifacts.result.ResolvedArtifactResult\n-\n-/**\n- * ================================================\n- * 作    者：jint（金台）\n- * 版    本：1.0\n- * 创建日期：2020/5/14-10:01\n- * 描    述：\n- * 修订历史：\n- * ================================================\n- */\n-class DoKitPlugin : Plugin<Project> {\n-    override fun apply(project: Project) {\n-        //创建指定扩展 并将project 传入构造函数\n-        val doKitExt = project.extensions.create("dokitExt", DoKitExt::class.java)\n-\n-        project.gradle.addListener(DoKitTransformTaskExecutionListener(project))\n-\n-        //println("project.plugins===>${project.plugins}")\n-        /**\n-         * when 也可以用来取代 if-else if链。\n-         * 如果不提供参数，所有的分支条件都是简单的布尔表达式，而当一个分支的条件为真时则执行该分支：\n-         */\n-\n-        /**\n-         * 作用域函数:let、run、with、apply 以及 also\n-         * 它们的唯一目的是在对象的上下文中执行代码块\n-         * 由于作用域函数本质上都非常相似，因此了解它们之间的区别很重要。每个作用域函数之间有两个主要区别：\n-         * 引用上下文对象的方式:\n-         * 作为 lambda 表达式的接收者（this）或者作为 lambda 表达式的参数（it）\n-         * run、with 以及 apply 通过关键字 this 引用上下文对象\n-         * let 及 also 将上下文对象作为 lambda 表达式参数\n-         *\n-         * 返回值:\n-         * apply 及 also 返回上下文对象。\n-         * let、run 及 with 返回 lambda 表达式结果.\n-         */\n-        /**\n-         * 函数\t对象引用\t   返回值\t    是否是扩展函数\n-         * let\t it\t     Lambda 表达式结果\t是\n-         * run\t this\t Lambda 表达式结果\t是\n-         * run\t  -\t     Lambda 表达式结果\t不是：调用无需上下文对象\n-         * with\t this\t Lambda 表达式结果\t不是：把上下文对象当做参数\n-         * apply this\t 上下文对象\t        是\n-         * also\t it\t     上下文对象\t        是\n-         */\n-\n-        /**\n-         *对一个非空（non-null）对象执行 lambda 表达式：let\n-         *将表达式作为变量引入为局部作用域中：let\n-         *对象配置：apply\n-         *对象配置并且计算结果：run\n-         *在需要表达式的地方运行语句：非扩展的 run\n-         *附加效果：also\n-         *一个对象的一组函数调用：with\n-         */\n-        when {\n-            project.plugins.hasPlugin("com.android.application") || project.plugins.hasPlugin("com.android.dynamic-feature") -> {\n-                if (!isReleaseTask(project)) {\n-                    project.getAndroid<AppExtension>().let { androidExt ->\n-\n-                        val pluginSwitch = project.getProperty("DOKIT_PLUGIN_SWITCH", true)\n-                        val logSwitch = project.getProperty("DOKIT_LOG_SWITCH", false)\n-                        val slowMethodSwitch = project.getProperty("DOKIT_METHOD_SWITCH", false)\n-                        val slowMethodStrategy = project.getProperty("DOKIT_METHOD_STRATEGY", 0)\n-                        val methodStackLevel = project.getProperty("DOKIT_METHOD_STACK_LEVEL", 5)\n-                        val webViewClassName = project.getProperty("DOKIT_WEBVIEW_CLASS_NAME", "")\n-                        val thirdLibInfo = project.getProperty("DOKIT_THIRD_LIB_SWITCH", true)\n-                        DoKitExtUtil.DOKIT_PLUGIN_SWITCH = pluginSwitch\n-                        DoKitExtUtil.DOKIT_LOG_SWITCH = logSwitch\n-                        DoKitExtUtil.SLOW_METHOD_SWITCH = slowMethodSwitch\n-                        DoKitExtUtil.SLOW_METHOD_STRATEGY = slowMethodStrategy\n-                        DoKitExtUtil.STACK_METHOD_LEVEL = methodStackLevel\n-                        DoKitExtUtil.WEBVIEW_CLASS_NAME = webViewClassName\n-                        DoKitExtUtil.THIRD_LIBINFO_SWITCH = thirdLibInfo\n-\n-                        "application module ${project.name} is executing...".println()\n-\n-                        MethodStackNodeUtil.METHOD_STACK_KEYS.clear()\n-                        if (DoKitExtUtil.DOKIT_PLUGIN_SWITCH) {\n-                            //注册transform\n-                            androidExt.registerTransform(commNewInstance(project))\n-                            if (slowMethodSwitch && slowMethodStrategy == SlowMethodExt.STRATEGY_STACK) {\n-                                MethodStackNodeUtil.METHOD_STACK_KEYS.add(0, mutableSetOf<String>())\n-                                val methodStackRange = 1 until methodStackLevel\n-                                if (methodStackLevel > 1) {\n-                                    for (index in methodStackRange) {\n-                                        MethodStackNodeUtil.METHOD_STACK_KEYS.add(\n-                                            index,\n-                                            mutableSetOf<String>()\n-                                        )\n-                                        androidExt.registerTransform(\n-                                            dependNewInstance(project, index)\n-                                        )\n-                                    }\n-                                }\n-                            }\n-                        }\n-\n-                        //项目评估完毕回调\n-//                        project.afterEvaluate { project ->\n-//                            "===afterEvaluate===".println()\n-//                            androidExt.applicationVariants.forEach { variant ->\n-//                                DoKitPluginConfigProcessor(project).process(variant)\n-//                            }\n-//                        }\n-\n-                        /**\n-                         * 所有项目的build.gradle执行完毕\n-                         * wiki:https://juejin.im/post/6844903607679057934\n-                         *\n-                         * **/\n-                        project.gradle.projectsEvaluated {\n-                            "===projectsEvaluated===".println()\n-                            androidExt.applicationVariants.forEach { variant ->\n-                                DoKitPluginConfigProcessor(project).process(variant)\n-                            }\n-\n-                        }\n-\n-\n-                        //task依赖关系图建立完毕\n-                        project.gradle.taskGraph.whenReady {\n-                            "===taskGraph.whenReady===".println()\n-                        }\n-\n-                    }\n-                }\n-\n-            }\n-\n-            project.plugins.hasPlugin("com.android.library") -> {\n-                if (!isReleaseTask(project)) {\n-                    project.getAndroid<LibraryExtension>().let { libraryExt ->\n-                        "library module ${project.name} is executing...".println()\n-                        if (DoKitExtUtil.DOKIT_PLUGIN_SWITCH) {\n-                            libraryExt.registerTransform(commNewInstance(project))\n-                        }\n-                        project.afterEvaluate {\n-                            libraryExt.libraryVariants.forEach { variant ->\n-                                DoKitPluginConfigProcessor(project).process(variant)\n-                            }\n-                        }\n-                    }\n-                }\n-            }\n-        }\n-    }\n-\n-    private fun isReleaseTask(project: Project): Boolean {\n-        return project.gradle.startParameter.taskNames.any {\n-            it.contains("release") || it.contains("Release")\n-        }\n-    }\n-\n-    private fun commNewInstance(project: Project): DoKitBaseTransform = when {\n-        GTE_V3_4 -> DoKitCommTransformV34(project)\n-        else -> DoKitCommTransform(project)\n-    }\n-\n-    private fun dependNewInstance(project: Project, index: Int): DoKitBaseTransform = when {\n-        GTE_V3_4 -> DoKitDependTransformV34(project, index)\n-        else -> DoKitDependTransform(project, index)\n-    }\n-\n-\n-}\n\\ No newline at end of file\ndiff --git a/Android/java/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/DoKitPluginUtil.kt b/Android/java/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/DoKitPluginUtil.kt\ndeleted file mode 100644\nindex 0fefb9f0..00000000\n--- a/Android/java/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/DoKitPluginUtil.kt\n+++ /dev/null\n@@ -1,100 +0,0 @@\n-package com.didichuxing.doraemonkit.plugin\n-\n-import java.io.File\n-\n-/**\n- * ================================================\n- * 作    者：jint（金台）\n- * 版    本：1.0\n- * 创建日期：2020/10/20-15:13\n- * 描    述：\n- * 修订历史：\n- * ================================================\n- */\n-object DoKitPluginUtil {\n-    const val BYTE = 1\n-    const val KB = 1024\n-    const val MB = 1048576\n-    const val GB = 1073741824\n-\n-    fun fileSize(file: File, precision: Int): String? {\n-        if (!file.isFile) {\n-            return "0kb"\n-        }\n-        if (file.isDirectory) {\n-            return "0kb"\n-        }\n-        val fileLength = file.length()\n-        return byte2FitMemorySize(fileLength, precision)\n-    }\n-\n-    private fun byte2FitMemorySize(byteSize: Long, precision: Int): String? {\n-        require(precision >= 0) { "precision shouldn\'t be less than zero!" }\n-        return if (byteSize < 0) {\n-            throw IllegalArgumentException("byteSize shouldn\'t be less than zero!")\n-        } else if (byteSize < KB) {\n-            String.format("%." + precision + "fB", byteSize.toDouble())\n-        } else if (byteSize < MB) {\n-            String.format("%." + precision + "fKB", byteSize.toDouble() / KB)\n-        } else if (byteSize < GB) {\n-            String.format("%." + precision + "fMB", byteSize.toDouble() / MB)\n-        } else {\n-            String.format("%." + precision + "fGB", byteSize.toDouble() / GB)\n-        }\n-    }\n-\n-    private fun getNextChunk(version: String, n: Int, p: Int): Pair<Int, Int> {\n-        // if pointer is set to the end of string\n-        // return 0\n-        if (p > n - 1) {\n-            return Pair(0, p)\n-        }\n-        // find the end of chunk\n-        var i = 0\n-        var pEnd = p\n-        while (pEnd < n && version[pEnd].equals(".")) {\n-            ++pEnd\n-        }\n-        // retrieve the chunk\n-        i = if (pEnd != n - 1) {\n-            version.substring(p, pEnd).toInt()\n-        } else {\n-            version.substring(p, n).toInt()\n-        }\n-        // find the beginning of next chunk\n-        val q = pEnd + 1\n-\n-        return Pair(i, q)\n-\n-    }\n-\n-    /**\n-     * 比较version的大小\n-     */\n-    fun compareVersion(version1: String, version2: String): Int {\n-        var p1 = 0\n-        var p2 = 0\n-        val n1 = version1.length\n-        val n2 = version2.length\n-        var i1: Int\n-        var i2: Int\n-        var pair: Pair<Int, Int>\n-        while (p1 < n1 || p2 < n2) {\n-            pair = getNextChunk(version1, n1, p1)\n-            i1 = pair.first\n-            p1 = pair.second\n-\n-            pair = getNextChunk(version2, n2, p2)\n-            i2 = pair.first\n-            p2 = pair.second\n-            if (i1 != i2) {\n-                return if (i1 > i2) {\n-                    1\n-                } else {\n-                    -1\n-                }\n-            }\n-        }\n-        return 0\n-    }\n-}\n\\ No newline at end of file\ndiff --git a/Android/java/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/DoKitTransformInvocation.kt b/Android/java/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/DoKitTransformInvocation.kt\ndeleted file mode 100644\nindex e5e6b290..00000000\n--- a/Android/java/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/DoKitTransformInvocation.kt\n+++ /dev/null\n@@ -1,231 +0,0 @@\n-package com.didichuxing.doraemonkit.plugin\n-\n-import com.android.build.api.transform.*\n-import com.android.build.api.transform.Status.*\n-import com.android.dex.DexFormat\n-import com.android.dx.command.dexer.Main\n-import com.didichuxing.doraemonkit.plugin.transform.DoKitBaseTransform\n-import com.didiglobal.booster.gradle.*\n-import com.didiglobal.booster.kotlinx.NCPU\n-import com.didiglobal.booster.kotlinx.file\n-import com.didiglobal.booster.kotlinx.green\n-import com.didiglobal.booster.kotlinx.red\n-import com.didiglobal.booster.transform.AbstractKlassPool\n-import com.didiglobal.booster.transform.ArtifactManager\n-import com.didiglobal.booster.transform.TransformContext\n-import com.didiglobal.booster.transform.artifacts\n-import com.didiglobal.booster.transform.util.transform\n-import java.io.File\n-import java.net.URI\n-import java.util.concurrent.*\n-\n-/**\n- * Represents a delegate of TransformInvocation\n- *\n- * @author johnsonlee\n- */\n-internal class DoKitTransformInvocation(\n-    private val delegate: TransformInvocation,\n-    internal val transform: DoKitBaseTransform\n-) : TransformInvocation by delegate, TransformContext, ArtifactManager {\n-\n-    private val project = transform.project\n-\n-    private val outputs = CopyOnWriteArrayList<File>()\n-\n-    override val name: String = delegate.context.variantName\n-\n-    override val projectDir: File = project.projectDir\n-\n-    override val buildDir: File = project.buildDir\n-\n-    override val temporaryDir: File = delegate.context.temporaryDir\n-\n-    override val reportsDir: File = File(buildDir, "reports").also { it.mkdirs() }\n-\n-    override val bootClasspath = delegate.bootClasspath\n-\n-    override val compileClasspath = delegate.compileClasspath\n-\n-    override val runtimeClasspath = delegate.runtimeClasspath\n-\n-    override val artifacts = this\n-\n-    override val dependencies: Collection<String> by lazy {\n-        ResolvedArtifactResults(variant).map {\n-            it.id.displayName\n-        }\n-    }\n-\n-    override val klassPool: AbstractKlassPool =\n-        object : AbstractKlassPool(compileClasspath, transform.bootKlassPool) {}\n-\n-    override val applicationId = delegate.applicationId\n-\n-    override val originalApplicationId = delegate.originalApplicationId\n-\n-    override val isDebuggable = variant.buildType.isDebuggable\n-\n-    override val isDataBindingEnabled = delegate.isDataBindingEnabled\n-\n-    override fun hasProperty(name: String) = project.hasProperty(name)\n-\n-    override fun <T> getProperty(name: String, default: T): T = project.getProperty(name, default)\n-\n-    override fun get(type: String) = variant.artifacts.get(type)\n-\n-    internal fun doFullTransform() = doTransform(this::transformFully)\n-\n-    internal fun doIncrementalTransform() = doTransform(this::transformIncrementally)\n-\n-    private fun onPreTransform() {\n-        transform.transformers.forEach {\n-            it.onPreTransform(this)\n-        }\n-    }\n-\n-    private fun onPostTransform() {\n-        transform.transformers.forEach {\n-            it.onPostTransform(this)\n-        }\n-    }\n-\n-    private fun doTransform(block: (ExecutorService) -> Iterable<Future<*>>) {\n-        this.outputs.clear()\n-        this.onPreTransform()\n-\n-        val executor = Executors.newFixedThreadPool(NCPU)\n-        try {\n-            block(executor).forEach {\n-                it.get()\n-            }\n-        } finally {\n-            executor.shutdown()\n-            executor.awaitTermination(1, TimeUnit.HOURS)\n-        }\n-\n-        this.onPostTransform()\n-\n-        if (transform.verifyEnabled) {\n-            this.doVerify()\n-        }\n-    }\n-\n-    private fun transformFully(executor: ExecutorService) = this.inputs.map {\n-        it.jarInputs + it.directoryInputs\n-    }.flatten().map { input ->\n-        executor.submit {\n-            val format = if (input is DirectoryInput) Format.DIRECTORY else Format.JAR\n-            outputProvider?.let { provider ->\n-                project.logger.info("Transforming ${input.file}")\n-                input.transform(\n-                    provider.getContentLocation(\n-                        input.name,\n-                        input.contentTypes,\n-                        input.scopes,\n-                        format\n-                    )\n-                )\n-            }\n-        }\n-    }\n-\n-    private fun transformIncrementally(executor: ExecutorService) = this.inputs.map { input ->\n-        input.jarInputs.filter { it.status != NOTCHANGED }.map { jarInput ->\n-            executor.submit {\n-                doIncrementalTransform(jarInput)\n-            }\n-        } + input.directoryInputs.filter { it.changedFiles.isNotEmpty() }.map { dirInput ->\n-            val base = dirInput.file.toURI()\n-            executor.submit {\n-                doIncrementalTransform(dirInput, base)\n-            }\n-        }\n-    }.flatten()\n-\n-    @Suppress("NON_EXHAUSTIVE_WHEN")\n-    private fun doIncrementalTransform(jarInput: JarInput) {\n-        when (jarInput.status) {\n-            REMOVED -> jarInput.file.delete()\n-            CHANGED, ADDED -> {\n-                project.logger.info("Transforming ${jarInput.file}")\n-                outputProvider?.let { provider ->\n-                    jarInput.transform(\n-                        provider.getContentLocation(\n-                            jarInput.name,\n-                            jarInput.contentTypes,\n-                            jarInput.scopes,\n-                            Format.JAR\n-                        )\n-                    )\n-                }\n-            }\n-        }\n-    }\n-\n-    @Suppress("NON_EXHAUSTIVE_WHEN")\n-    private fun doIncrementalTransform(dirInput: DirectoryInput, base: URI) {\n-        dirInput.changedFiles.forEach { (file, status) ->\n-            when (status) {\n-                REMOVED -> {\n-                    project.logger.info("Deleting $file")\n-                    outputProvider?.let { provider ->\n-                        provider.getContentLocation(\n-                            dirInput.name,\n-                            dirInput.contentTypes,\n-                            dirInput.scopes,\n-                            Format.DIRECTORY\n-                        ).parentFile.listFiles()?.asSequence()\n-                            ?.filter { it.isDirectory }\n-                            ?.map { File(it, dirInput.file.toURI().relativize(file.toURI()).path) }\n-                            ?.filter { it.exists() }\n-                            ?.forEach { it.delete() }\n-                    }\n-                    file.delete()\n-                }\n-                ADDED, CHANGED -> {\n-                    project.logger.info("Transforming $file")\n-                    outputProvider?.let { provider ->\n-                        val root = provider.getContentLocation(\n-                            dirInput.name,\n-                            dirInput.contentTypes,\n-                            dirInput.scopes,\n-                            Format.DIRECTORY\n-                        )\n-                        val output = File(root, base.relativize(file.toURI()).path)\n-                        outputs += output\n-                        file.transform(output) { bytecode ->\n-                            bytecode.transform()\n-                        }\n-                    }\n-                }\n-            }\n-        }\n-    }\n-\n-    private fun doVerify() {\n-        outputs.sortedBy(File::nameWithoutExtension).forEach { output ->\n-            val out = temporaryDir.file(output.name)\n-            val rc = out.dex(\n-                output,\n-                variant.extension.defaultConfig.targetSdkVersion?.apiLevel\n-                    ?: DexFormat.API_NO_EXTENDED_OPCODES\n-            )\n-            println("${if (rc != 0) red("✗") else green("✓")} $output")\n-            out.deleteRecursively()\n-        }\n-    }\n-\n-    private fun QualifiedContent.transform(output: File) {\n-        outputs += output\n-        this.file.transform(output) { bytecode ->\n-            bytecode.transform()\n-        }\n-    }\n-\n-    private fun ByteArray.transform(): ByteArray {\n-        return transform.transformers.fold(this) { bytes, transformer ->\n-            transformer.transform(this@DoKitTransformInvocation, bytes)\n-        }\n-    }\n-}\n\\ No newline at end of file\ndiff --git a/Android/java/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/DoKitTransformTaskExecutionListener.kt b/Android/java/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/DoKitTransformTaskExecutionListener.kt\ndeleted file mode 100644\nindex 43579768..00000000\n--- a/Android/java/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/DoKitTransformTaskExecutionListener.kt\n+++ /dev/null\n@@ -1,23 +0,0 @@\n-package com.didichuxing.doraemonkit.plugin\n-\n-import com.android.build.gradle.internal.pipeline.TransformTask\n-import com.didiglobal.booster.kotlinx.call\n-import com.didiglobal.booster.kotlinx.get\n-import org.gradle.api.Project\n-import org.gradle.api.Task\n-import org.gradle.api.execution.TaskExecutionAdapter\n-\n-/**\n- * @author neighbWang\n- */\n-class DoKitTransformTaskExecutionListener(private val project: Project) : TaskExecutionAdapter() {\n-\n-    override fun beforeExecute(task: Task) {\n-        task.takeIf {\n-            it.project == project && it is TransformTask && it.transform.scopes.isNotEmpty()\n-        }?.run {\n-            task["outputStream"]?.call<Unit>("init")\n-        }\n-    }\n-\n-}\n\\ No newline at end of file\ndiff --git a/Android/java/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/ServiceLoader.kt b/Android/java/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/ServiceLoader.kt\ndeleted file mode 100644\nindex aeff63e8..00000000\n--- a/Android/java/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/ServiceLoader.kt\n+++ /dev/null\n@@ -1,76 +0,0 @@\n-package com.didichuxing.doraemonkit.plugin\n-\n-import com.didiglobal.booster.task.spi.VariantProcessor\n-import com.didiglobal.booster.transform.Transformer\n-import org.gradle.api.Project\n-import java.net.URL\n-import java.nio.charset.StandardCharsets\n-import java.util.ServiceConfigurationError\n-\n-//internal interface ServiceLoader<T> {\n-//    fun load(vararg args: Any): List<T>\n-//}\n-\n-//internal class ServiceLoaderFactory<T>(private val classLoader: ClassLoader, private val service: Class<T>) {\n-//\n-//    fun newServiceLoader(vararg types: Class<*>) = object : ServiceLoader<T> {\n-//\n-//        @Suppress("UNCHECKED_CAST")\n-//        override fun load(vararg args: Any) = classLoader.getResources("META-INF/services/${service.name}")?.asSequence()?.map(::parse)?.flatten()?.toSet()?.map { provider ->\n-//            try {\n-//                val providerClass = Class.forName(provider, false, classLoader)\n-//                if (!service.isAssignableFrom(providerClass)) {\n-//                    throw ServiceConfigurationError("Provider $provider not a subtype")\n-//                }\n-//\n-//                try {\n-//                    providerClass.getConstructor(*types).newInstance(*args) as T\n-//                } catch (e: NoSuchMethodException) {\n-//                    providerClass.newInstance() as T\n-//                }\n-//            } catch (e: ClassNotFoundException) {\n-//                throw ServiceConfigurationError("Provider $provider not found")\n-//            }\n-//        } ?: emptyList()\n-//\n-//    }\n-//\n-//}\n-//\n-//internal inline fun <reified T> newServiceLoader(classLoader: ClassLoader, vararg types: Class<*>) = ServiceLoaderFactory(classLoader, T::class.java).newServiceLoader(*types)\n-\n-/**\n- * Load [Transformer]s with the specified [classLoader]\n- */\n-//@Throws(ServiceConfigurationError::class)\n-//internal fun loadTransformers(classLoader: ClassLoader) = newServiceLoader<Transformer>(classLoader, ClassLoader::class.java).load(classLoader)\n-\n-/**\n- * Load [VariantProcessor]s with the specified [classLoader]\n- */\n-//@Throws(ServiceConfigurationError::class)\n-//internal fun loadVariantProcessors(project: Project) = newServiceLoader<VariantProcessor>(project.buildscript.classLoader, Project::class.java).load(project)\n-\n-@Throws(ServiceConfigurationError::class)\n-private fun parse(u: URL) = try {\n-    u.openStream().bufferedReader(StandardCharsets.UTF_8).readLines().filter {\n-        it.isNotEmpty() && it.isNotBlank() && !it.startsWith(\'#\')\n-    }.map(String::trim).filter(::isJavaClassName)\n-} catch (e: Throwable) {\n-    emptyList<String>()\n-}\n-\n-private fun isJavaClassName(text: String): Boolean {\n-    if (!Character.isJavaIdentifierStart(text[0])) {\n-        throw ServiceConfigurationError("Illegal provider-class name: $text")\n-    }\n-\n-    for (i in 1 until text.length) {\n-        val cp = text.codePointAt(i)\n-        if (!Character.isJavaIdentifierPart(cp) && cp != \'.\'.toInt()) {\n-            throw ServiceConfigurationError("Illegal provider-class name: $text")\n-        }\n-    }\n-\n-    return true\n-}\n\\ No newline at end of file\ndiff --git a/Android/java/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/ThirdLibInfo.kt b/Android/java/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/ThirdLibInfo.kt\ndeleted file mode 100644\nindex 0e641f23..00000000\n--- a/Android/java/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/ThirdLibInfo.kt\n+++ /dev/null\n@@ -1,22 +0,0 @@\n-package com.didichuxing.doraemonkit.plugin\n-\n-/**\n- * ================================================\n- * 作    者：jint（金台）\n- * 版    本：1.0\n- * 创建日期：2020/10/20-14:50\n- * 描    述：\n- * 修订历史：\n- * ================================================\n- */\n-//data class ThirdLibInfo(\n-//    val groupId: String,\n-//    val artifactId: String,\n-//    val version: String,\n-//    val fileName: String,\n-//    val fileSize: Long,\n-//    val variant: String\n-//)\n-\n-data class ThirdLibInfo(val variant: String, val fileSize: Long)\n-\ndiff --git a/Android/java/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/asmtransformer/BaseDoKitAsmTransformer.kt b/Android/java/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/asmtransformer/BaseDoKitAsmTransformer.kt\ndeleted file mode 100644\nindex 081e0838..00000000\n--- a/Android/java/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/asmtransformer/BaseDoKitAsmTransformer.kt\n+++ /dev/null\n@@ -1,93 +0,0 @@\n-package com.didichuxing.doraemonkit.plugin.asmtransformer\n-\n-import com.didiglobal.booster.annotations.Priority\n-import com.didiglobal.booster.transform.TransformContext\n-import com.didiglobal.booster.transform.Transformer\n-import com.didiglobal.booster.transform.asm.ClassTransformer\n-import org.objectweb.asm.ClassReader\n-import org.objectweb.asm.ClassWriter\n-import org.objectweb.asm.tree.ClassNode\n-import java.lang.management.ManagementFactory\n-import java.lang.management.ThreadMXBean\n-import java.util.*\n-\n-/**\n- * ================================================\n- * 作    者：jint（金台）\n- * 版    本：1.0\n- * 创建日期：2020/5/21-16:44\n- * 描    述：\n- * 修订历史：\n- * ================================================\n- */\n-open class BaseDoKitAsmTransformer : Transformer {\n-    private val threadMxBean = ManagementFactory.getThreadMXBean()\n-\n-    private val durations = mutableMapOf<ClassTransformer, Long>()\n-\n-    private val classLoader: ClassLoader\n-\n-    internal val transformers: Iterable<ClassTransformer>\n-\n-    constructor() : this(Thread.currentThread().contextClassLoader)\n-\n-    constructor(classLoader: ClassLoader = Thread.currentThread().contextClassLoader) : this(\n-        ServiceLoader.load(ClassTransformer::class.java, classLoader).sortedBy {\n-            it.javaClass.getAnnotation(Priority::class.java)?.value ?: 0\n-        }, classLoader\n-    )\n-\n-    constructor(\n-        transformers: Iterable<ClassTransformer>,\n-        classLoader: ClassLoader = Thread.currentThread().contextClassLoader\n-    ) {\n-        this.classLoader = classLoader\n-        this.transformers = transformers\n-    }\n-\n-\n-    override fun onPreTransform(context: TransformContext) {\n-        this.transformers.forEach { transformer ->\n-            this.threadMxBean.sumCpuTime(transformer) {\n-                transformer.onPreTransform(context)\n-            }\n-        }\n-    }\n-\n-    override fun transform(context: TransformContext, bytecode: ByteArray): ByteArray {\n-        return ClassWriter(ClassWriter.COMPUTE_MAXS).also { writer ->\n-            this.transformers.fold(ClassNode().also { klass ->\n-                ClassReader(bytecode).accept(klass, 0)\n-            }) { klass, transformer ->\n-                this.threadMxBean.sumCpuTime(transformer) {\n-                    transformer.transform(context, klass)\n-                }\n-            }.accept(writer)\n-        }.toByteArray()\n-    }\n-\n-    override fun onPostTransform(context: TransformContext) {\n-        this.transformers.forEach { transformer ->\n-            this.threadMxBean.sumCpuTime(transformer) {\n-                transformer.onPostTransform(context)\n-            }\n-        }\n-\n-        val w1 = this.durations.keys.map {\n-            it.javaClass.name.length\n-        }.max() ?: 20\n-        this.durations.forEach { (transformer, ns) ->\n-            println("${transformer.javaClass.name.padEnd(w1 + 1)}: ${ns / 1000000} ms")\n-        }\n-    }\n-\n-    private fun <R> ThreadMXBean.sumCpuTime(transformer: ClassTransformer, action: () -> R): R {\n-        val ct0 = this.currentThreadCpuTime\n-        val result = action()\n-        val ct1 = this.currentThreadCpuTime\n-        durations[transformer] = durations.getOrDefault(transformer, 0) + (ct1 - ct0)\n-        return result\n-    }\n-\n-}\n-\ndiff --git a/Android/java/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/asmtransformer/DoKitAsmTransformer.kt b/Android/java/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/asmtransformer/DoKitAsmTransformer.kt\ndeleted file mode 100644\nindex aa358110..00000000\n--- a/Android/java/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/asmtransformer/DoKitAsmTransformer.kt\n+++ /dev/null\n@@ -1,15 +0,0 @@\n-package com.didichuxing.doraemonkit.plugin.asmtransformer\n-\n-import com.didiglobal.booster.transform.asm.ClassTransformer\n-\n-/**\n- * ================================================\n- * 作    者：jint（金台）\n- * 版    本：1.0\n- * 创建日期：2020/5/21-16:44\n- * 描    述：\n- * 修订历史：\n- * ================================================\n- */\n-class DoKitAsmTransformer(transformers: Iterable<ClassTransformer>) :\n-    BaseDoKitAsmTransformer(transformers)\ndiff --git a/Android/java/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/classtransformer/AbsClassTransformer.kt b/Android/java/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/classtransformer/AbsClassTransformer.kt\ndeleted file mode 100644\nindex 410f4135..00000000\n--- a/Android/java/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/classtransformer/AbsClassTransformer.kt\n+++ /dev/null\n@@ -1,39 +0,0 @@\n-package com.didichuxing.doraemonkit.plugin.classtransformer\n-\n-import com.didichuxing.doraemonkit.plugin.DoKitExtUtil\n-import com.didichuxing.doraemonkit.plugin.isRelease\n-import com.didichuxing.doraemonkit.plugin.println\n-import com.didiglobal.booster.transform.TransformContext\n-import com.didiglobal.booster.transform.asm.ClassTransformer\n-import com.didiglobal.booster.transform.asm.className\n-import org.objectweb.asm.tree.ClassNode\n-\n-/**\n- * ================================================\n- * 作    者：jint（金台）\n- * 版    本：1.0\n- * 创建日期：2021/5/12-18:06\n- * 描    述：\n- * 修订历史：\n- * ================================================\n- */\n-\n-open class AbsClassTransformer : ClassTransformer {\n-\n-    fun onCommInterceptor(context: TransformContext, klass: ClassNode): Boolean {\n-        if (context.isRelease()) {\n-            return true\n-        }\n-\n-        if (!DoKitExtUtil.dokitPluginSwitchOpen()) {\n-            return true\n-        }\n-        //过滤kotlin module-info\n-        if (klass.className == "module-info") {\n-            return true\n-        }\n-\n-\n-        return false\n-    }\n-}\n\\ No newline at end of file\ndiff --git a/Android/java/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/classtransformer/BigImgTransformer.kt b/Android/java/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/classtransformer/BigImgTransformer.kt\ndeleted file mode 100644\nindex d4e8bdb5..00000000\n--- a/Android/java/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/classtransformer/BigImgTransformer.kt\n+++ /dev/null\n@@ -1,205 +0,0 @@\n-package com.didichuxing.doraemonkit.plugin.classtransformer\n-\n-import com.didichuxing.doraemonkit.plugin.*\n-import com.didiglobal.booster.annotations.Priority\n-import com.didiglobal.booster.transform.TransformContext\n-import com.didiglobal.booster.transform.asm.ClassTransformer\n-import com.didiglobal.booster.transform.asm.className\n-import com.google.auto.service.AutoService\n-import org.objectweb.asm.Opcodes.*\n-import org.objectweb.asm.tree.ClassNode\n-import org.objectweb.asm.tree.InsnList\n-import org.objectweb.asm.tree.MethodInsnNode\n-import org.objectweb.asm.tree.VarInsnNode\n-\n-/**\n- * ================================================\n- * 作    者：jint（金台）\n- * 版    本：1.0\n- * 创建日期：2020/5/14-18:07\n- * 描    述：wiki:https://juejin.im/post/5e8d87c4f265da47ad218e6b\n- * 修订历史：\n- * ================================================\n- */\n-//@Priority(1)\n-//@AutoService(ClassTransformer::class)\n-class BigImgTransformer : AbsClassTransformer() {\n-\n-    override fun transform(context: TransformContext, klass: ClassNode): ClassNode {\n-        if (onCommInterceptor(context, klass)) {\n-            return klass\n-        }\n-\n-\n-        if (!DoKitExtUtil.commExt.bigImgSwitch) {\n-            return klass\n-        }\n-\n-        if (DoKitExtUtil.ignorePackageNames(klass.className)) {\n-            return klass\n-        }\n-\n-\n-        val className = klass.className\n-        //glide\n-        if (className == "com.bumptech.glide.request.SingleRequest") {\n-            klass.methods.find { methodNode ->\n-                (methodNode.name == "init" || methodNode.name == "<init>") && methodNode.desc != null\n-            }.let { methodNode ->\n-                //函数结束的地方插入\n-                methodNode?.instructions?.getMethodExitInsnNodes()?.forEach {\n-                    "${context.projectDir.lastPath()}->hook glide  succeed: ${className}_${methodNode.name}_${methodNode.desc}".println()\n-                    methodNode.instructions?.insertBefore(it, createGlideInsnList())\n-                }\n-            }\n-        }\n-\n-        //picasso\n-        if (className == "com.squareup.picasso.Request") {\n-            klass.methods.find { methodNode ->\n-                methodNode.name == "<init>" && methodNode.desc != null\n-            }.let { methodNode ->\n-                //函数结束的地方插入\n-                methodNode?.instructions?.getMethodExitInsnNodes()?.forEach {\n-                    "${context.projectDir.lastPath()}->hook picasso  succeed: ${className}_${methodNode.name}_${methodNode.desc}".println()\n-                    methodNode.instructions?.insertBefore(it, createPicassoInsnList())\n-                }\n-            }\n-        }\n-\n-        //Fresco\n-        if (className == "com.facebook.imagepipeline.request.ImageRequest") {\n-            klass.methods.find { methodNode ->\n-                methodNode.name == "<init>" && methodNode.desc != null\n-            }.let { methodNode ->\n-                "${context.projectDir.lastPath()}->hook Fresco succeed: ${className}_${methodNode?.name}_${methodNode?.desc}".println()\n-                //函数开始的地方插入\n-                methodNode?.instructions?.insert(createFrescoInsnList())\n-            }\n-        }\n-\n-        //ImageLoader\n-        if (className == "com.nostra13.universalimageloader.core.ImageLoadingInfo") {\n-            klass.methods.find { methodNode ->\n-                methodNode.name == "<init>" && methodNode.desc != null\n-            }.let { methodNode ->\n-                "${context.projectDir.lastPath()}->hook ImageLoader  succeed: ${className}_${methodNode?.name}_${methodNode?.desc}".println()\n-                methodNode?.instructions?.insert(createImageLoaderInsnList())\n-            }\n-        }\n-\n-\n-        return klass\n-    }\n-\n-    /**\n-     * 创建Glide Aop代码指令\n-     */\n-    private fun createGlideInsnList(): InsnList {\n-        return with(InsnList()) {\n-            add(VarInsnNode(ALOAD, 0))\n-            add(\n-                MethodInsnNode(\n-                    INVOKESTATIC,\n-                    "com/didichuxing/doraemonkit/aop/bigimg/glide/GlideHook",\n-                    "proxy",\n-                    "(Ljava/lang/Object;)V",\n-                    false\n-                )\n-            )\n-            this\n-        }\n-    }\n-\n-    /**\n-     * 创建Picasso Aop代码指令\n-     */\n-    private fun createPicassoInsnList(): InsnList {\n-        return with(InsnList()) {\n-            add(VarInsnNode(ALOAD, 0))\n-            add(\n-                MethodInsnNode(\n-                    INVOKESTATIC,\n-                    "com/didichuxing/doraemonkit/aop/bigimg/picasso/PicassoHook",\n-                    "proxy",\n-                    "(Ljava/lang/Object;)V",\n-                    false\n-                )\n-            )\n-            this\n-        }\n-\n-    }\n-\n-\n-    /**\n-     * 创建Fresco Aop代码指令\n-     */\n-    private fun createFrescoInsnList(): InsnList {\n-        return with(InsnList()) {\n-            add(VarInsnNode(ALOAD, 1))\n-            add(VarInsnNode(ALOAD, 1))\n-            add(\n-                MethodInsnNode(\n-                    INVOKEVIRTUAL,\n-                    "com/facebook/imagepipeline/request/ImageRequestBuilder",\n-                    "getSourceUri",\n-                    "()Landroid/net/Uri;",\n-                    false\n-                )\n-            )\n-            add(VarInsnNode(ALOAD, 1))\n-            add(\n-                MethodInsnNode(\n-                    INVOKEVIRTUAL,\n-                    "com/facebook/imagepipeline/request/ImageRequestBuilder",\n-                    "getPostprocessor",\n-                    "()Lcom/facebook/imagepipeline/request/Postprocessor;",\n-                    false\n-                )\n-            )\n-            add(\n-                MethodInsnNode(\n-                    INVOKESTATIC,\n-                    "com/didichuxing/doraemonkit/aop/bigimg/fresco/FrescoHook",\n-                    "proxy",\n-                    "(Landroid/net/Uri;Lcom/facebook/imagepipeline/request/Postprocessor;)Lcom/facebook/imagepipeline/request/Postprocessor;",\n-                    false\n-                )\n-            )\n-            add(\n-                MethodInsnNode(\n-                    INVOKEVIRTUAL,\n-                    "com/facebook/imagepipeline/request/ImageRequestBuilder",\n-                    "setPostprocessor",\n-                    "(Lcom/facebook/imagepipeline/request/Postprocessor;)Lcom/facebook/imagepipeline/request/ImageRequestBuilder;",\n-                    false\n-                )\n-            )\n-            this\n-        }\n-\n-    }\n-\n-\n-    /**\n-     * 创建ImageLoader Aop代码指令\n-     */\n-    private fun createImageLoaderInsnList(): InsnList {\n-        return with(InsnList()) {\n-            add(VarInsnNode(ALOAD, 6))\n-            add(\n-                MethodInsnNode(\n-                    INVOKESTATIC,\n-                    "com/didichuxing/doraemonkit/aop/bigimg/imageloader/ImageLoaderHook",\n-                    "proxy",\n-                    "(Lcom/nostra13/universalimageloader/core/listener/ImageLoadingListener;)Lcom/nostra13/universalimageloader/core/listener/ImageLoadingListener;",\n-                    false\n-                )\n-            )\n-            add(VarInsnNode(ASTORE, 6))\n-            this\n-        }\n-    }\n-}\n-\ndiff --git a/Android/java/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/classtransformer/CommTransformer.kt b/Android/java/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/classtransformer/CommTransformer.kt\ndeleted file mode 100644\nindex 1b72f62d..00000000\n--- a/Android/java/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/classtransformer/CommTransformer.kt\n+++ /dev/null\n@@ -1,1111 +0,0 @@\n-package com.didichuxing.doraemonkit.plugin.classtransformer\n-\n-import com.didichuxing.doraemonkit.plugin.*\n-import com.didichuxing.doraemonkit.plugin.extension.SlowMethodExt\n-import com.didiglobal.booster.annotations.Priority\n-import com.didiglobal.booster.kotlinx.asIterable\n-import com.didiglobal.booster.transform.TransformContext\n-import com.didiglobal.booster.transform.asm.ClassTransformer\n-import com.didiglobal.booster.transform.asm.className\n-import com.google.auto.service.AutoService\n-import org.objectweb.asm.Label\n-import org.objectweb.asm.Opcodes.*\n-import org.objectweb.asm.tree.*\n-\n-/**\n- * ================================================\n- * 作    者：jint（金台）\n- * 版    本：1.0\n- * 创建日期：2020/5/14-18:07\n- * 描    述：wiki:https://juejin.im/post/5e8d87c4f265da47ad218e6b\n- * 修订历史：\n- * ================================================\n- */\n-//@Priority(0)\n-//@AutoService(ClassTransformer::class)\n-class CommTransformer : AbsClassTransformer() {\n-\n-\n-    private val SHADOW_URL =\n-        "com/didichuxing/doraemonkit/aop/urlconnection/HttpUrlConnectionProxyUtil"\n-    private val DESC = "(Ljava/net/URLConnection;)Ljava/net/URLConnection;"\n-\n-\n-    /**\n-     * 转化\n-     */\n-    override fun transform(context: TransformContext, klass: ClassNode): ClassNode {\n-\n-        if (onCommInterceptor(context, klass)) {\n-            return klass\n-        }\n-\n-\n-        val className = klass.className\n-        val superName = klass.formatSuperName\n-\n-//        if (className.contains("didihttp")) {\n-//            "${context.projectDir.lastPath()}==className===>$className".println()\n-//        }\n-\n-        //查找DoraemonKitReal&pluginConfig方法并插入指定字节码\n-        if (className == "com.didichuxing.doraemonkit.DoKitReal") {\n-            //插件配置\n-            klass.methods?.find {\n-                it.name == "pluginConfig"\n-            }.let { methodNode ->\n-                "${context.projectDir.lastPath()}->insert map to the DoKitReal pluginConfig succeed".println()\n-                methodNode?.instructions?.insert(createPluginConfigInsnList())\n-            }\n-            //三方库信息注入\n-            klass.methods?.find {\n-                it.name == "initThirdLibraryInfo"\n-            }.let { methodNode ->\n-                "${context.projectDir.lastPath()}->insert map to the DoKitReal initThirdLibraryInfo succeed".println()\n-                methodNode?.instructions?.insert(createThirdLibInfoInsnList())\n-            }\n-        }\n-\n-        //gps字节码操作\n-        if (DoKitExtUtil.commExt.gpsSwitch) {\n-            //系统 gpsStatus hook\n-            klass.methods.forEach { method ->\n-                method.instructions?.iterator()?.asIterable()\n-                    ?.filterIsInstance(MethodInsnNode::class.java)?.filter {\n-                        it.opcode == INVOKEVIRTUAL &&\n-                                it.owner == "android/location/LocationManager" &&\n-                                it.name == "getGpsStatus" &&\n-                                it.desc == "(Landroid/location/GpsStatus;)Landroid/location/GpsStatus;"\n-                    }?.forEach {\n-                        "${context.projectDir.lastPath()}->hook LocationManager#getGpsStatus method  succeed in : ${className}_${method.name}_${method.desc}".println()\n-                        method.instructions.insert(\n-                            it,\n-                            MethodInsnNode(\n-                                INVOKESTATIC,\n-                                "com/didichuxing/doraemonkit/aop/location/GpsStatusUtil",\n-                                "wrap",\n-                                "(Landroid/location/GpsStatus;)Landroid/location/GpsStatus;",\n-                                false\n-                            )\n-                        )\n-                    }\n-            }\n-\n-            //插入高德地图定位相关字节码\n-            if (className == "com.amap.api.location.AMapLocationClient") {\n-                //设置监听器\n-                klass.methods?.find {\n-                    it.name == "setLocationListener"\n-                }.let { methodNode ->\n-                    "${context.projectDir.lastPath()}->hook amap map  succeed: ${className}_${methodNode?.name}_${methodNode?.desc}".println()\n-                    methodNode?.instructions?.insert(createAmapLocationInsnList())\n-                }\n-\n-                //反注册监听器\n-                klass.methods?.find {\n-                    it.name == "unRegisterLocationListener"\n-                }.let { methodNode ->\n-                    "${context.projectDir.lastPath()}->hook amap map  succeed: ${className}_${methodNode?.name}_${methodNode?.desc}".println()\n-                    methodNode?.instructions?.getMethodExitInsnNodes()?.forEach {\n-                        methodNode.instructions.insertBefore(\n-                            it,\n-                            createAmapLocationUnRegisterInsnList()\n-                        )\n-                    }\n-                }\n-\n-                //代理getLastKnownLocation\n-                klass.methods?.find {\n-                    it.name == "getLastKnownLocation"\n-                }.let { methodNode ->\n-                    "${context.projectDir.lastPath()}->hook AMapLocationClient getLastKnownLocation  succeed: ${className}_${methodNode?.name}_${methodNode?.desc}".println()\n-                    methodNode?.instructions?.insert(createAMapClientLastKnownLocation())\n-                }\n-\n-            }\n-            //插入高德 地图定位相关字节码\n-//            if (className == "com.amap.api.maps.AMap") {\n-//                //设置LocationSource代理\n-//                klass.methods?.find {\n-//                    it.name == "setLocationSource"\n-//                }.let { methodNode ->\n-//                    "${context.projectDir.lastPath()}->hook amap map LocationSource  succeed: ${className}_${methodNode?.name}_${methodNode?.desc}".println()\n-//                    methodNode?.instructions?.insert(createAmapLocationSourceInsnList())\n-//                }\n-//            }\n-\n-            //插入高德地图导航相关字节码\n-//            if (className == "com.amap.api.navi.AMapNavi") {\n-//                //设置监听器\n-//                klass.methods?.find {\n-//                    it.name == "addAMapNaviListener"\n-//                }.let { methodNode ->\n-//                    "${context.projectDir.lastPath()}->hook amap map navi  succeed: ${className}_${methodNode?.name}_${methodNode?.desc}".println()\n-//                    methodNode?.instructions?.insert(createAmapNaviInsnList())\n-//                }\n-//\n-//                //反注册监听器\n-//                klass.methods?.find {\n-//                    it.name == "removeAMapNaviListener"\n-//                }.let { methodNode ->\n-//                    "${context.projectDir.lastPath()}->hook amap map navi  succeed: ${className}_${methodNode?.name}_${methodNode?.desc}".println()\n-//                    methodNode?.instructions?.getMethodExitInsnNodes()?.forEach {\n-//                        methodNode.instructions.insertBefore(\n-//                            it,\n-//                            createAmapNaviUnRegisterInsnList()\n-//                        )\n-//                    }\n-//                }\n-//            }\n-\n-\n-            //插入腾讯地图相关字节码\n-            if (className == "com.tencent.map.geolocation.TencentLocationManager") {\n-                //持续定位和单次定位\n-                klass.methods?.filter {\n-                    it.name == "requestSingleFreshLocation" || it.name == "requestLocationUpdates"\n-                }?.forEach { methodNode ->\n-                    "${context.projectDir.lastPath()}->hook tencent map  succeed: ${className}_${methodNode?.name}_${methodNode?.desc}".println()\n-                    methodNode?.instructions?.insert(createTencentLocationInsnList())\n-                }\n-\n-\n-                //反注册监听器\n-                klass.methods?.find {\n-                    it.name == "removeUpdates"\n-                }.let { methodNode ->\n-                    "${context.projectDir.lastPath()}->hook tencent map  succeed: ${className}_${methodNode?.name}_${methodNode?.desc}".println()\n-                    methodNode?.instructions?.getMethodExitInsnNodes()?.forEach {\n-                        methodNode.instructions.insertBefore(\n-                            it,\n-                            createTencentLocationUnRegisterInsnList()\n-                        )\n-                    }\n-                }\n-            }\n-\n-            //插入百度地图相关字节码\n-            if (className == "com.baidu.location.LocationClient") {\n-                //拦截注册监听器\n-                klass.methods?.filter {\n-                    it.name == "registerLocationListener"\n-                            && (it.desc == "(Lcom/baidu/location/BDLocationListener;)V" || it.desc == "(Lcom/baidu/location/BDAbstractLocationListener;)V")\n-                }?.forEach { methodNode ->\n-                    "${context.projectDir.lastPath()}->hook baidu map  succeed: ${className}_${methodNode?.name}_${methodNode?.desc}".println()\n-                    if (methodNode.desc == "(Lcom/baidu/location/BDLocationListener;)V") {\n-                        methodNode?.instructions?.insert(createBDLocationListenerInsnList())\n-                    } else if (methodNode.desc == "(Lcom/baidu/location/BDAbstractLocationListener;)V") {\n-                        methodNode?.instructions?.insert(createBDLocationAbsListenerInsnList())\n-                    }\n-                }\n-\n-\n-                //反注册监听器\n-                klass.methods?.find {\n-                    it.name == "unRegisterLocationListener" && it.desc == "(Lcom/baidu/location/BDLocationListener;)V"\n-                }.let { methodNode ->\n-                    "${context.projectDir.lastPath()}->hook baidu map  succeed: ${className}_${methodNode?.name}_${methodNode?.desc}".println()\n-                    methodNode?.instructions?.getMethodExitInsnNodes()?.forEach {\n-                        methodNode.instructions.insertBefore(\n-                            it,\n-                            createBDLocationUnRegisterInsnList()\n-                        )\n-                    }\n-                }\n-\n-\n-                //反注册监听器\n-                klass.methods?.find {\n-                    it.name == "unRegisterLocationListener" && it.desc == "(Lcom/baidu/location/BDAbstractLocationListener;)V"\n-                }.let { methodNode ->\n-                    "${context.projectDir.lastPath()}->hook baidu map  succeed: ${className}_${methodNode?.name}_${methodNode?.desc}".println()\n-                    methodNode?.instructions?.getMethodExitInsnNodes()?.forEach {\n-                        methodNode.instructions.insertBefore(\n-                            it,\n-                            createBDAbsLocationUnRegisterInsnList()\n-                        )\n-                    }\n-                }\n-            }\n-\n-\n-        }\n-\n-\n-        //网络 OkHttp&didi platform aop\n-        if (DoKitExtUtil.commExt.networkSwitch) {\n-            //hook OkhttpClient\n-            if (className == "okhttp3.OkHttpClient") {\n-                klass.methods?.find {\n-                    it.name == "<init>" && it.desc != "()V"\n-                }.let {\n-                    "${context.projectDir.lastPath()}->hook OkhttpClient  succeed: ${className}_${it?.name}_${it?.desc}".println()\n-                    it?.instructions\n-                        ?.iterator()\n-                        ?.asIterable()\n-                        ?.filterIsInstance(FieldInsnNode::class.java)\n-                        ?.filter { fieldInsnNode ->\n-                            fieldInsnNode.opcode == PUTFIELD\n-                                    && fieldInsnNode.owner == "okhttp3/OkHttpClient"\n-                                    && fieldInsnNode.name == "networkInterceptors"\n-                                    && fieldInsnNode.desc == "Ljava/util/List;"\n-                        }?.forEach { fieldInsnNode ->\n-                            it.instructions.insert(fieldInsnNode, createOkHttpClientInsnList())\n-                        }\n-                }\n-            }\n-\n-            //didi platform 判断是否引入了dokit-rpc模块\n-            if (className == "didihttp.DidiHttpClient" && DoKitExtUtil.commExt.didinetSwitch && DoKitExtUtil.HAS_DOKIT_RPC_MODULE) {\n-                klass.methods?.find {\n-                    it.name == "<init>" && it.desc != "()V"\n-                }.let {\n-                    "${context.projectDir.lastPath()}->hook DidiHttpClient  succeed: ${className}_${it?.name}_${it?.desc}".println()\n-                    it?.instructions\n-                        ?.iterator()\n-                        ?.asIterable()\n-                        ?.filterIsInstance(FieldInsnNode::class.java)\n-                        ?.filter { fieldInsnNode ->\n-                            fieldInsnNode.opcode == PUTFIELD\n-                                    && fieldInsnNode.owner == "didihttp/DidiHttpClient"\n-                                    && fieldInsnNode.name == "networkInterceptors"\n-                                    && fieldInsnNode.desc == "Ljava/util/List;"\n-                        }\n-                        ?.forEach { fieldInsnNode ->\n-                            it.instructions.insert(\n-                                fieldInsnNode,\n-                                createDidiHttpClientInsnList()\n-                            )\n-                        }\n-                }\n-            }\n-\n-\n-            //webView 字节码操作\n-            if (DoKitExtUtil.commExt.webViewSwitch) {\n-                //普通的webview\n-                klass.methods.forEach { method ->\n-                    method.instructions?.iterator()?.asIterable()\n-                        ?.filterIsInstance(MethodInsnNode::class.java)?.filter {\n-                            it.opcode == INVOKEVIRTUAL &&\n-                                    it.name == "loadUrl" &&\n-                                    it.desc == "(Ljava/lang/String;)V" &&\n-                                    isWebViewOwnerNameMatched(it.owner)\n-                        }?.forEach {\n-                            "${context.projectDir.lastPath()}->hook WebView#loadurl method  succeed in :  ${className}_${method.name}_${method.desc} | ${it.owner}".println()\n-                            method.instructions.insertBefore(\n-                                it,\n-                                createWebViewInsnList()\n-                            )\n-                        }\n-                }\n-            }\n-\n-            // url connection\n-            klass.methods.forEach { method ->\n-                method.instructions?.iterator()?.asIterable()\n-                    ?.filterIsInstance(MethodInsnNode::class.java)?.filter {\n-                        it.opcode == INVOKEVIRTUAL &&\n-                                it.owner == "java/net/URL" &&\n-                                it.name == "openConnection" &&\n-                                it.desc == "()Ljava/net/URLConnection;"\n-                    }?.forEach {\n-                        "${context.projectDir.lastPath()}->hook URL#openConnection method  succeed in : ${className}_${method.name}_${method.desc}".println()\n-                        method.instructions.insert(\n-                            it,\n-                            MethodInsnNode(INVOKESTATIC, SHADOW_URL, "proxy", DESC, false)\n-                        )\n-                    }\n-            }\n-\n-        }\n-\n-\n-        //hook Androidx的ComponentActivity\n-        if (className != "com.didichuxing.doraemonkit.aop.mc.DoKitProxyActivity" && superName == "android.app.Activity") {\n-            createComponentActivitySuperActivityImpl(klass)\n-        }\n-\n-\n-        //hook androidx的AppCompatDelegateImpl\n-//        if (className == "androidx.appcompat.app.AppCompatDelegate") {\n-//            klass.methods?.filter {\n-//                it.name == "create"\n-//                        && (it.desc == "(Landroid/app/Activity;Landroidx/appcompat/app/AppCompatCallback;)Landroidx/appcompat/app/AppCompatDelegate;"\n-//                        || it.desc == "(Landroid/app/Dialog;Landroidx/appcompat/app/AppCompatCallback;)Landroidx/appcompat/app/AppCompatDelegate;"\n-//                        || it.desc == "(Landroid/content/Context;Landroid/view/Window;Landroidx/appcompat/app/AppCompatCallback;)Landroidx/appcompat/app/AppCompatDelegate;"\n-//                        || it.desc == "(Landroid/content/Context;Landroid/app/Activity;Landroidx/appcompat/app/AppCompatCallback;)Landroidx/appcompat/app/AppCompatDelegate;")\n-//            }?.asIterable()\n-//                ?.forEach { methodNode ->\n-//                    //操作方法\n-//                    val typeInsnNodes = methodNode.instructions\n-//                        ?.iterator()\n-//                        ?.asIterable()\n-//                        ?.filterIsInstance(TypeInsnNode::class.java)\n-//                    //操作New指令\n-//                    typeInsnNodes?.filter {\n-//                        it.opcode == NEW && it.desc == "androidx/appcompat/app/AppCompatDelegateImpl"\n-//                    }?.forEach {\n-//                        "${context.projectDir.lastPath()}->hook ${klass.name}-${methodNode.name}-${it.opcode}-${it.desc} succeed".println()\n-//                        methodNode.instructions.insertBefore(\n-//                            it,\n-//                            createNewDoKitAppCompatDelegateImplInsnList()\n-//                        )\n-//                    }\n-//\n-//                    //操作方法\n-//                    val methodInsnNodes = methodNode.instructions\n-//                        ?.iterator()\n-//                        ?.asIterable()\n-//                        ?.filterIsInstance(MethodInsnNode::class.java)\n-//\n-//                    methodInsnNodes?.filter {\n-//                        //"${context.projectDir.lastPath()}->hook AppCompatDelegate create matched ${it.opcode}  ${it.ownerClassName}  ${it.name}".println()\n-//                        it.opcode == INVOKESPECIAL\n-//                                && it.ownerClassName == "androidx.appcompat.app.AppCompatDelegateImpl"\n-//                                && it.name == "<init>"\n-//                    }?.forEach {\n-//                        //"${context.projectDir.lastPath()}->hook AppCompatDelegate create  method succeed".println()\n-//                        "${context.projectDir.lastPath()}->hook ${klass.name}-${methodNode.name}-${it.owner}-${it.name}-${it.desc} succeed".println()\n-//                        methodNode.instructions.insert(\n-//                            it,\n-//                            MethodInsnNode(\n-//                                INVOKESPECIAL,\n-//                                "androidx/appcompat/app/DoKitAppCompatDelegateImpl",\n-//                                "<init>",\n-//                                "(Landroidx/appcompat/app/AppCompatDelegate;)V",\n-//                                false\n-//                            )\n-//                        )\n-//                    }\n-//                }\n-//        }\n-\n-        //hook 所有的view的事件\n-//        klass.methods?.forEach { methodNode ->\n-//            if (methodNode.name == "onClick" && methodNode.desc == "(Landroid/view/View;)V") {\n-//                val insnList = with(InsnList()) {\n-//                    add(VarInsnNode(ALOAD, 1))\n-//                    add(\n-//                        MethodInsnNode(\n-//                            INVOKESTATIC,\n-//                            "com/didichuxing/doraemonkit/aop/mc/DoKitListenerHelper",\n-//                            "hookViewClickListener",\n-//                            "(Landroid/view/View;)V",\n-//                            false\n-//                        )\n-//                    )\n-//                    this\n-//                }\n-//                methodNode.instructions.insert(insnList)\n-//            }\n-//        }\n-\n-\n-        // hook 所有的View\n-//        if (className != "com.didichuxing.doraemonkit.aop.mc.DoKitProxyView" && superName == "android.view.View") {\n-//            createViewImpl(klass)\n-//        }\n-\n-        // hook 所有的ViewGroup\n-//        if (className != "com.didichuxing.doraemonkit.aop.mc.DoKitProxyViewGroup" && superName == "android.view.ViewGroup") {\n-//            createViewGroupImpl(klass)\n-//        }\n-\n-//        if (className == "androidx.appcompat.app.AppCompatDelegateImpl") {\n-//            //插件配置\n-//            klass.methods?.find {\n-//                it.name == "onCreateView" && it.desc == "(Landroid/view/View;Ljava/lang/String;Landroid/content/Context;Landroid/util/AttributeSet;)Landroid/view/View;"\n-//            }.let { method ->\n-//                method?.instructions?.iterator()?.asIterable()\n-//                    ?.filterIsInstance(MethodInsnNode::class.java)?.filter {\n-//                        it.opcode == INVOKEVIRTUAL &&\n-//                                it.owner == "androidx/appcompat/app/AppCompatDelegateImpl" &&\n-//                                it.name == "createView" &&\n-//                                it.desc == "(Landroid/view/View;Ljava/lang/String;Landroid/content/Context;Landroid/util/AttributeSet;)Landroid/view/View;"\n-//                    }?.forEach {\n-//                        "${context.projectDir.lastPath()}->hook AppCompatDelegateImpl onCreateView method succeed".println()\n-//                        method.instructions.insert(\n-//                            it,\n-//                            MethodInsnNode(\n-//                                INVOKESTATIC,\n-//                                "com/didichuxing/doraemonkit/aop/mc/AppCompatDelegateImplProxy",\n-//                                "onCreateView",\n-//                                "(Landroid/view/View;)Landroid/view/View;",\n-//                                false\n-//                            )\n-//                        )\n-//                    }\n-//            }\n-//        }\n-\n-        return klass\n-    }\n-\n-    private fun isWebViewOwnerNameMatched(ownerName: String): Boolean {\n-        return ownerName == "android/webkit/WebView" ||\n-                ownerName == "com/tencent/smtt/sdk/WebView" ||\n-                ownerName.contentEquals("WebView") ||\n-                ownerName == DoKitExtUtil.WEBVIEW_CLASS_NAME\n-    }\n-\n-\n-    /**\n-     * 创建pluginConfig代码指令\n-     */\n-    private fun createPluginConfigInsnList(): InsnList {\n-        //val insnList = InsnList()\n-        return with(InsnList()) {\n-            //new HashMap\n-            add(TypeInsnNode(NEW, "java/util/HashMap"))\n-            add(InsnNode(DUP))\n-            add(MethodInsnNode(INVOKESPECIAL, "java/util/HashMap", "<init>", "()V", false))\n-            //保存变量\n-            add(VarInsnNode(ASTORE, 0))\n-            //获取第一个变量\n-            //put("dokitPluginSwitch",true)\n-            add(VarInsnNode(ALOAD, 0))\n-            add(LdcInsnNode("dokitPluginSwitch"))\n-            add(InsnNode(if (DoKitExtUtil.dokitPluginSwitchOpen()) ICONST_1 else ICONST_0))\n-            add(\n-                MethodInsnNode(\n-                    INVOKESTATIC,\n-                    "java/lang/Boolean",\n-                    "valueOf",\n-                    "(Z)Ljava/lang/Boolean;",\n-                    false\n-                )\n-            )\n-            add(\n-                MethodInsnNode(\n-                    INVOKEINTERFACE,\n-                    "java/util/Map",\n-                    "put",\n-                    "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;",\n-                    true\n-                )\n-            )\n-            add(InsnNode(POP))\n-\n-            //put("gpsSwitch",true)\n-            add(VarInsnNode(ALOAD, 0))\n-            add(LdcInsnNode("gpsSwitch"))\n-            add(InsnNode(if (DoKitExtUtil.commExt.gpsSwitch) ICONST_1 else ICONST_0))\n-            add(\n-                MethodInsnNode(\n-                    INVOKESTATIC,\n-                    "java/lang/Boolean",\n-                    "valueOf",\n-                    "(Z)Ljava/lang/Boolean;",\n-                    false\n-                )\n-            )\n-            add(\n-                MethodInsnNode(\n-                    INVOKEINTERFACE,\n-                    "java/util/Map",\n-                    "put",\n-                    "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;",\n-                    true\n-                )\n-            )\n-            add(InsnNode(POP))\n-\n-            //put("networkSwitch",true)\n-            add(VarInsnNode(ALOAD, 0))\n-            add(LdcInsnNode("networkSwitch"))\n-            add(InsnNode(if (DoKitExtUtil.commExt.networkSwitch) ICONST_1 else ICONST_0))\n-            add(\n-                MethodInsnNode(\n-                    INVOKESTATIC,\n-                    "java/lang/Boolean",\n-                    "valueOf",\n-                    "(Z)Ljava/lang/Boolean;",\n-                    false\n-                )\n-            )\n-            add(\n-                MethodInsnNode(\n-                    INVOKEINTERFACE,\n-                    "java/util/Map",\n-                    "put",\n-                    "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;",\n-                    true\n-                )\n-            )\n-            add(InsnNode(POP))\n-\n-            //put("bigImgSwitch",true)\n-            add(VarInsnNode(ALOAD, 0))\n-            add(LdcInsnNode("bigImgSwitch"))\n-            add(InsnNode(if (DoKitExtUtil.commExt.bigImgSwitch) ICONST_1 else ICONST_0))\n-            add(\n-                MethodInsnNode(\n-                    INVOKESTATIC,\n-                    "java/lang/Boolean",\n-                    "valueOf",\n-                    "(Z)Ljava/lang/Boolean;",\n-                    false\n-                )\n-            )\n-            add(\n-                MethodInsnNode(\n-                    INVOKEINTERFACE,\n-                    "java/util/Map",\n-                    "put",\n-                    "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;",\n-                    true\n-                )\n-            )\n-            add(InsnNode(POP))\n-\n-            //put("methodSwitch",true)\n-            add(VarInsnNode(ALOAD, 0))\n-            add(LdcInsnNode("methodSwitch"))\n-            add(InsnNode(if (DoKitExtUtil.dokitSlowMethodSwitchOpen()) ICONST_1 else ICONST_0))\n-            add(\n-                MethodInsnNode(\n-                    INVOKESTATIC,\n-                    "java/lang/Boolean",\n-                    "valueOf",\n-                    "(Z)Ljava/lang/Boolean;",\n-                    false\n-                )\n-            )\n-            add(\n-                MethodInsnNode(\n-                    INVOKEINTERFACE,\n-                    "java/util/Map",\n-                    "put",\n-                    "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;",\n-                    true\n-                )\n-            )\n-            add(InsnNode(POP))\n-\n-\n-            //put("methodStrategy",0)\n-            add(VarInsnNode(ALOAD, 0))\n-            add(LdcInsnNode("methodStrategy"))\n-            add(InsnNode(if (DoKitExtUtil.SLOW_METHOD_STRATEGY == SlowMethodExt.STRATEGY_STACK) ICONST_0 else ICONST_1))\n-            add(\n-                MethodInsnNode(\n-                    INVOKESTATIC,\n-                    "java/lang/Integer",\n-                    "valueOf",\n-                    "(I)Ljava/lang/Integer;",\n-                    false\n-                )\n-            )\n-            add(\n-                MethodInsnNode(\n-                    INVOKEINTERFACE,\n-                    "java/util/Map",\n-                    "put",\n-                    "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;",\n-                    true\n-                )\n-            )\n-            add(InsnNode(POP))\n-\n-            //将HashMap注入到DokitPluginConfig中\n-            add(VarInsnNode(ALOAD, 0))\n-            add(\n-                MethodInsnNode(\n-                    INVOKESTATIC,\n-                    "com/didichuxing/doraemonkit/aop/DokitPluginConfig",\n-                    "inject",\n-                    "(Ljava/util/Map;)V",\n-                    false\n-                )\n-            )\n-\n-            this\n-        }\n-\n-        //return insnList\n-\n-    }\n-\n-\n-    /**\n-     * 创建pluginConfig代码指令\n-     */\n-    private fun createThirdLibInfoInsnList(): InsnList {\n-        //val insnList = InsnList()\n-        return with(InsnList()) {\n-            //new HashMap\n-            add(TypeInsnNode(NEW, "java/util/HashMap"))\n-            add(InsnNode(DUP))\n-            add(MethodInsnNode(INVOKESPECIAL, "java/util/HashMap", "<init>", "()V", false))\n-            //保存变量\n-            add(VarInsnNode(ASTORE, 0))\n-            DoKitExtUtil.THIRD_LIB_INFOS.forEach { thirdLibInfo ->\n-                add(VarInsnNode(ALOAD, 0))\n-                add(LdcInsnNode(thirdLibInfo.variant))\n-                add(LdcInsnNode(thirdLibInfo.fileSize.toString()))\n-\n-                add(\n-                    MethodInsnNode(\n-                        INVOKEINTERFACE,\n-                        "java/util/Map",\n-                        "put",\n-                        "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;",\n-                        false\n-                    )\n-                )\n-                add(InsnNode(POP))\n-            }\n-\n-\n-            //将HashMap注入到DokitPluginConfig中\n-            add(VarInsnNode(ALOAD, 0))\n-            add(\n-                MethodInsnNode(\n-                    INVOKESTATIC,\n-                    "com/didichuxing/doraemonkit/aop/DokitThirdLibInfo",\n-                    "inject",\n-                    "(Ljava/util/Map;)V",\n-                    false\n-                )\n-            )\n-\n-            this\n-        }\n-\n-        //return insnList\n-\n-    }\n-\n-\n-    /**\n-     * 创建Amap地图代码指令\n-     */\n-    private fun createAmapLocationInsnList(): InsnList {\n-        return with(InsnList()) {\n-            //在AMapLocationClient的setLocationListener方法之中插入自定义代理回调类\n-            add(TypeInsnNode(NEW, "com/didichuxing/doraemonkit/aop/map/AMapLocationListenerProxy"))\n-            add(InsnNode(DUP))\n-            //访问第一个参数\n-            add(VarInsnNode(ALOAD, 1))\n-            add(\n-                MethodInsnNode(\n-                    INVOKESPECIAL,\n-                    "com/didichuxing/doraemonkit/aop/map/AMapLocationListenerProxy",\n-                    "<init>",\n-                    "(Lcom/amap/api/location/AMapLocationListener;)V",\n-                    false\n-                )\n-            )\n-            //对第一个参数进行重新赋值\n-            add(VarInsnNode(ASTORE, 1))\n-            this\n-        }\n-\n-    }\n-\n-    /**\n-     * 创建Amap地图导航代码指令\n-     */\n-    private fun createAmapNaviInsnList(): InsnList {\n-        return with(InsnList()) {\n-            //在AMapNavi的addAMapNaviListener方法之中插入自定义代理回调类\n-            add(TypeInsnNode(NEW, "com/didichuxing/doraemonkit/aop/map/AMapNaviListenerProxy"))\n-            add(InsnNode(DUP))\n-            //访问第一个参数\n-            add(VarInsnNode(ALOAD, 1))\n-            add(\n-                MethodInsnNode(\n-                    INVOKESPECIAL,\n-                    "com/didichuxing/doraemonkit/aop/map/AMapNaviListenerProxy",\n-                    "<init>",\n-                    "(Lcom/amap/api/navi/AMapNaviListener;)V",\n-                    false\n-                )\n-            )\n-            //对第一个参数进行重新赋值\n-            add(VarInsnNode(ASTORE, 1))\n-            this\n-        }\n-\n-    }\n-\n-\n-    /**\n-     * 创建Amap LocationSource代码指令\n-     */\n-    private fun createAmapLocationSourceInsnList(): InsnList {\n-        return with(InsnList()) {\n-            //在AMapNavi的addAMapNaviListener方法之中插入自定义代理回调类\n-            add(TypeInsnNode(NEW, "com/didichuxing/doraemonkit/aop/map/AMapLocationSourceProxy"))\n-            add(InsnNode(DUP))\n-            //访问第一个参数\n-            add(VarInsnNode(ALOAD, 1))\n-            add(\n-                MethodInsnNode(\n-                    INVOKESPECIAL,\n-                    "com/didichuxing/doraemonkit/aop/map/AMapLocationSourceProxy",\n-                    "<init>",\n-                    "(Lcom/amap/api/maps/LocationSource;)V",\n-                    false\n-                )\n-            )\n-            //对第一个参数进行重新赋值\n-            add(VarInsnNode(ASTORE, 1))\n-            this\n-        }\n-\n-    }\n-\n-    /**\n-     * 创建AMapLocationClient#LastKnownLocation 字节码替换\n-     */\n-    private fun createAMapClientLastKnownLocation(): InsnList {\n-        return with(InsnList()) {\n-            add(VarInsnNode(ALOAD, 0))\n-            add(\n-                MethodInsnNode(\n-                    INVOKESTATIC,\n-                    "com/didichuxing/doraemonkit/aop/map/AMapLocationClientProxy",\n-                    "getLastKnownLocation",\n-                    "(Lcom/amap/api/location/AMapLocationClient;)Lcom/amap/api/location/AMapLocation;",\n-                    false\n-                )\n-            )\n-//            add(VarInsnNode(ASTORE, 1))\n-//            add(VarInsnNode(ALOAD, 1))\n-            add(InsnNode(ARETURN))\n-            this\n-        }\n-\n-    }\n-\n-    /**\n-     * 创建Amap地图UnRegister代码指令\n-     */\n-    private fun createAmapLocationUnRegisterInsnList(): InsnList {\n-        return with(InsnList()) {\n-            //访问第一个参数\n-            add(VarInsnNode(ALOAD, 1))\n-            add(\n-                MethodInsnNode(\n-                    INVOKESTATIC,\n-                    "com/didichuxing/doraemonkit/aop/map/ThirdMapLocationListenerUtil",\n-                    "unRegisterAmapLocationListener",\n-                    "(Lcom/amap/api/location/AMapLocationListener;)V",\n-                    false\n-                )\n-            )\n-            this\n-        }\n-\n-    }\n-\n-    /**\n-     * 创建Amap地图 Navi UnRegister代码指令\n-     */\n-    private fun createAmapNaviUnRegisterInsnList(): InsnList {\n-        return with(InsnList()) {\n-            //访问第一个参数\n-            add(VarInsnNode(ALOAD, 1))\n-            add(\n-                MethodInsnNode(\n-                    INVOKESTATIC,\n-                    "com/didichuxing/doraemonkit/aop/map/ThirdMapLocationListenerUtil",\n-                    "unRegisterAmapNaviListener",\n-                    "(Lcom/amap/api/navi/AMapNaviListener;)V",\n-                    false\n-                )\n-            )\n-            this\n-        }\n-\n-    }\n-\n-\n-    /**\n-     * 创建tencent地图代码指令\n-     */\n-    private fun createTencentLocationInsnList(): InsnList {\n-        return with(InsnList()) {\n-            //在AMapLocationClient的setLocationListener方法之中插入自定义代理回调类\n-            add(\n-                TypeInsnNode(\n-                    NEW,\n-                    "com/didichuxing/doraemonkit/aop/map/TencentLocationListenerProxy"\n-                )\n-            )\n-            add(InsnNode(DUP))\n-            //访问第一个参数\n-            add(VarInsnNode(ALOAD, 2))\n-            add(\n-                MethodInsnNode(\n-                    INVOKESPECIAL,\n-                    "com/didichuxing/doraemonkit/aop/map/TencentLocationListenerProxy",\n-                    "<init>",\n-                    "(Lcom/tencent/map/geolocation/TencentLocationListener;)V",\n-                    false\n-                )\n-            )\n-            //对第二个参数进行重新赋值\n-            add(VarInsnNode(ASTORE, 2))\n-\n-            this\n-        }\n-\n-    }\n-\n-\n-    /**\n-     * 创建Tencent地图UnRegister代码指令\n-     */\n-    private fun createTencentLocationUnRegisterInsnList(): InsnList {\n-        return with(InsnList()) {\n-            //访问第一个参数\n-            add(VarInsnNode(ALOAD, 1))\n-            add(\n-                MethodInsnNode(\n-                    INVOKESTATIC,\n-                    "com/didichuxing/doraemonkit/aop/map/ThirdMapLocationListenerUtil",\n-                    "unRegisterTencentLocationListener",\n-                    "(Lcom/tencent/map/geolocation/TencentLocationListener;)V",\n-                    false\n-                )\n-            )\n-            this\n-        }\n-\n-    }\n-\n-\n-    /**\n-     * 创建百度地图代码指令\n-     */\n-    private fun createBDLocationListenerInsnList(): InsnList {\n-        return with(InsnList()) {\n-            //在LocationClient的registerLocationListener方法之中插入自定义代理回调类\n-            add(TypeInsnNode(NEW, "com/didichuxing/doraemonkit/aop/map/BDLocationListenerProxy"))\n-            add(InsnNode(DUP))\n-            //访问第一个参数\n-            add(VarInsnNode(ALOAD, 1))\n-            add(\n-                MethodInsnNode(\n-                    INVOKESPECIAL,\n-                    "com/didichuxing/doraemonkit/aop/map/BDLocationListenerProxy",\n-                    "<init>",\n-                    "(Lcom/baidu/location/BDLocationListener;)V",\n-                    false\n-                )\n-            )\n-            //对第一个参数进行重新赋值\n-            add(VarInsnNode(ASTORE, 1))\n-\n-            this\n-        }\n-\n-    }\n-\n-    /**\n-     * 创建百度地图代码指令\n-     */\n-    private fun createBDLocationAbsListenerInsnList(): InsnList {\n-        return with(InsnList()) {\n-            //在LocationClient的registerLocationListener方法之中插入自定义代理回调类\n-            add(TypeInsnNode(NEW, "com/didichuxing/doraemonkit/aop/map/BDAbsLocationListenerProxy"))\n-            add(InsnNode(DUP))\n-            //访问第一个参数\n-            add(VarInsnNode(ALOAD, 1))\n-            add(\n-                MethodInsnNode(\n-                    INVOKESPECIAL,\n-                    "com/didichuxing/doraemonkit/aop/map/BDAbsLocationListenerProxy",\n-                    "<init>",\n-                    "(Lcom/baidu/location/BDAbstractLocationListener;)V",\n-                    false\n-                )\n-            )\n-            //对第一个参数进行重新赋值\n-            add(VarInsnNode(ASTORE, 1))\n-            this\n-        }\n-    }\n-\n-\n-    /**\n-     * 创建百度地图UnRegister代码指令\n-     */\n-    private fun createBDLocationUnRegisterInsnList(): InsnList {\n-        return with(InsnList()) {\n-            //访问第一个参数\n-            add(VarInsnNode(ALOAD, 1))\n-            add(\n-                MethodInsnNode(\n-                    INVOKESTATIC,\n-                    "com/didichuxing/doraemonkit/aop/map/ThirdMapLocationListenerUtil",\n-                    "unRegisterBDLocationListener",\n-                    "(Lcom/baidu/location/BDLocationListener;)V",\n-                    false\n-                )\n-            )\n-            this\n-        }\n-\n-    }\n-\n-    /**\n-     * 创建百度地图UnRegister代码指令\n-     */\n-    private fun createBDAbsLocationUnRegisterInsnList(): InsnList {\n-        return with(InsnList()) {\n-            //访问第一个参数\n-            add(VarInsnNode(ALOAD, 1))\n-            add(\n-                MethodInsnNode(\n-                    INVOKESTATIC,\n-                    "com/didichuxing/doraemonkit/aop/map/ThirdMapLocationListenerUtil",\n-                    "unRegisterBDLocationListener",\n-                    "(Lcom/baidu/location/BDAbstractLocationListener;)V",\n-                    false\n-                )\n-            )\n-            this\n-        }\n-\n-    }\n-\n-    /**\n-     * 创建百度地图代码指令\n-     */\n-    private fun createBaiduLocationInsnList(): InsnList {\n-        return with(InsnList()) {\n-            //在AMapLocationClient的setLocationListener方法之中插入自定义代理回调类\n-            add(VarInsnNode(ALOAD, 1))\n-            add(\n-                MethodInsnNode(\n-                    INVOKESTATIC,\n-                    "com/didichuxing/doraemonkit/aop/BDLocationUtil",\n-                    "proxy",\n-                    "(Lcom/baidu/location/BDLocation;)Lcom/baidu/location/BDLocation;",\n-                    false\n-                )\n-            )\n-            //对第一个参数进行重新赋值\n-            add(VarInsnNode(ASTORE, 1))\n-            this\n-        }\n-\n-    }\n-\n-\n-    /**\n-     * 创建OkhttpClient一个数构造函数指令\n-     */\n-    private fun createOkHttpClientInsnList(): InsnList {\n-        return with(InsnList()) {\n-            //插入application 拦截器\n-            add(VarInsnNode(ALOAD, 0))\n-\n-            add(\n-                MethodInsnNode(\n-                    INVOKESTATIC,\n-                    "com/didichuxing/doraemonkit/aop/OkHttpHook",\n-                    "addDoKitIntercept",\n-                    "(Lokhttp3/OkHttpClient;)V",\n-                    false\n-                )\n-            )\n-            this\n-        }\n-\n-    }\n-\n-    /**\n-     * 创建OkhttpClient一个数构造函数指令\n-     */\n-    private fun createDidiHttpClientInsnList(): InsnList {\n-        return with(InsnList()) {\n-            //插入application 拦截器\n-            add(VarInsnNode(ALOAD, 0))\n-\n-            add(\n-                MethodInsnNode(\n-                    INVOKESTATIC,\n-                    "com/didichuxing/foundation/net/rpc/http/DidiHttpHook",\n-                    "addRpcIntercept",\n-                    "(Ldidihttp/DidiHttpClient;)V",\n-                    false\n-                )\n-            )\n-            this\n-        }\n-\n-    }\n-\n-    /**\n-     * 创建webView函数指令集\n-     * 参考:https://www.jianshu.com/p/7d623f441bed\n-     */\n-    private fun createWebViewInsnList(): InsnList {\n-        return with(InsnList()) {\n-            //复制栈顶的2个指令 指令集变为 比如 aload 2 aload0 aload 2 aload0\n-            add(InsnNode(DUP2))\n-            //抛出最上面的指令 指令集变为 aload 2 aload0 aload 2  其中 aload 2即为我们所需要的对象\n-            add(InsnNode(POP))\n-            add(\n-                MethodInsnNode(\n-                    INVOKESTATIC,\n-                    "com/didichuxing/doraemonkit/aop/WebViewHook",\n-                    "inject",\n-                    "(Ljava/lang/Object;)V",\n-                    false\n-                )\n-            )\n-            this\n-        }\n-    }\n-\n-    /**\n-     * 创建new DoKitAppCompatDelegateImpl指令集\n-     */\n-    private fun createNewDoKitAppCompatDelegateImplInsnList(): InsnList {\n-        return with(InsnList()) {\n-            add(TypeInsnNode(NEW, "androidx/appcompat/app/DoKitAppCompatDelegateImpl"))\n-            add(InsnNode(DUP))\n-            this\n-        }\n-    }\n-\n-\n-    /**\n-     * 重置ComponentActivity的父类\n-     */\n-    private fun createComponentActivitySuperActivityImpl(klass: ClassNode) {\n-        /**\n-         * 修改继承的父类\n-         */\n-        klass.superName = "com/didichuxing/doraemonkit/aop/mc/DoKitProxyActivity"\n-    }\n-\n-\n-    /**\n-     * 重置View的父类\n-     */\n-    private fun createViewImpl(klass: ClassNode) {\n-        /**\n-         * 修改继承的父类\n-         */\n-        klass.superName = "com/didichuxing/doraemonkit/aop/mc/DoKitProxyView"\n-    }\n-\n-\n-    /**\n-     * 重置ViewGroup的父类\n-     */\n-    private fun createViewGroupImpl(klass: ClassNode) {\n-        /**\n-         * 修改继承的父类\n-         */\n-        klass.superName = "com/didichuxing/doraemonkit/aop/mc/DoKitProxyViewGroup"\n-    }\n-\n-}\n\\ No newline at end of file\ndiff --git a/Android/java/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/classtransformer/EnterMethodStackTransformer.kt b/Android/java/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/classtransformer/EnterMethodStackTransformer.kt\ndeleted file mode 100644\nindex f697200d..00000000\n--- a/Android/java/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/classtransformer/EnterMethodStackTransformer.kt\n+++ /dev/null\n@@ -1,250 +0,0 @@\n-package com.didichuxing.doraemonkit.plugin.classtransformer\n-\n-import com.didichuxing.doraemonkit.plugin.*\n-import com.didichuxing.doraemonkit.plugin.extension.SlowMethodExt\n-import com.didichuxing.doraemonkit.plugin.stack_method.MethodStackNode\n-import com.didichuxing.doraemonkit.plugin.stack_method.MethodStackNodeUtil\n-import com.didiglobal.booster.annotations.Priority\n-import com.didiglobal.booster.transform.TransformContext\n-import com.didiglobal.booster.transform.asm.ClassTransformer\n-import com.didiglobal.booster.transform.asm.asIterable\n-import com.didiglobal.booster.transform.asm.className\n-import com.google.auto.service.AutoService\n-import org.objectweb.asm.Opcodes.*\n-import org.objectweb.asm.tree.*\n-\n-/**\n- * ================================================\n- * 作    者：jint（金台）\n- * 版    本：1.0\n- * 创建日期：2020/5/14-18:07\n- * 描    述：入口函数 慢函数调用栈 wiki:https://juejin.im/post/5e8d87c4f265da47ad218e6b\n- * 修订历史：不要指定自动注入 需要手动在DoKitAsmTransformer中通过配置创建\n- * 原理:transform()方法的调用是无序的  原因:哪一个class会先被transformer执行是不确定的  但是每一个class被transformer执行顺序是遵循transformer的Priority规则的\n- * ================================================\n- */\n-//@Priority(3)\n-//@AutoService(ClassTransformer::class)\n-class EnterMethodStackTransformer : AbsClassTransformer() {\n-\n-    private val thresholdTime = DoKitExtUtil.slowMethodExt.stackMethod.thresholdTime\n-    private val level = 0\n-    override fun transform(context: TransformContext, klass: ClassNode): ClassNode {\n-\n-\n-        if (onCommInterceptor(context, klass)) {\n-            return klass\n-        }\n-\n-        if (!DoKitExtUtil.dokitSlowMethodSwitchOpen()) {\n-            return klass\n-        }\n-\n-        if (DoKitExtUtil.SLOW_METHOD_STRATEGY == SlowMethodExt.STRATEGY_NORMAL) {\n-            return klass\n-        }\n-\n-        if (DoKitExtUtil.ignorePackageNames(klass.className)) {\n-            return klass\n-        }\n-\n-        //默认为Application onCreate 和attachBaseContext\n-        val enterMethods = DoKitExtUtil.slowMethodExt.stackMethod.enterMethods\n-\n-        if (enterMethods.isNotEmpty()) {\n-            enterMethods.forEach { enterMethodName ->\n-                klass.methods.forEach { methodNode ->\n-                    val allMethodName = "${klass.className}.${methodNode.name}"\n-                    if (allMethodName == enterMethodName) {\n-                        "${context.projectDir.lastPath()}->level-->$level mathched enterMethod===>$allMethodName".println()\n-                        operateMethodInsn(klass, methodNode)\n-                    }\n-                }\n-            }\n-        }\n-        \n-        return klass\n-    }\n-\n-\n-    private fun operateMethodInsn(klass: ClassNode, methodNode: MethodNode) {\n-        //读取全是函数调用的指令\n-        methodNode.instructions.asIterable().filterIsInstance(MethodInsnNode::class.java)\n-            .filter { methodInsnNode ->\n-                methodInsnNode.name != "<init>"\n-            }.forEach { methodInsnNode ->\n-                val methodStackNode = MethodStackNode(\n-                    level,\n-                    methodInsnNode.ownerClassName,\n-                    methodInsnNode.name,\n-                    methodInsnNode.desc,\n-                    klass.className,\n-                    methodNode.name,\n-                    methodNode.desc\n-                )\n-                MethodStackNodeUtil.addMethodStackNode(level, methodStackNode)\n-            }\n-        //函数出入口插入耗时统计代码\n-        //方法入口插入\n-        methodNode.instructions.insert(\n-            createMethodEnterInsnList(\n-                level,\n-                klass.className,\n-                methodNode.name,\n-                methodNode.desc,\n-                methodNode.access\n-            )\n-        )\n-        //方法出口插入\n-        methodNode.instructions.getMethodExitInsnNodes()?.forEach { methodExitInsnNode ->\n-            methodNode.instructions.insertBefore(\n-                methodExitInsnNode,\n-                createMethodExitInsnList(\n-                    level,\n-                    klass.className,\n-                    methodNode.name,\n-                    methodNode.desc,\n-                    methodNode.access\n-                )\n-            )\n-        }\n-    }\n-\n-\n-    /**\n-     * 创建慢函数入口指令集\n-     */\n-    private fun createMethodEnterInsnList(\n-        level: Int,\n-        className: String,\n-        methodName: String,\n-        desc: String,\n-        access: Int\n-    ): InsnList {\n-        val isStaticMethod = access and ACC_STATIC != 0\n-        return with(InsnList()) {\n-            if (isStaticMethod) {\n-                add(\n-                    FieldInsnNode(\n-                        GETSTATIC,\n-                        "com/didichuxing/doraemonkit/aop/method_stack/MethodStackUtil",\n-                        "INSTANCE",\n-                        "Lcom/didichuxing/doraemonkit/aop/method_stack/MethodStackUtil;"\n-                    )\n-                )\n-                add(IntInsnNode(BIPUSH, DoKitExtUtil.STACK_METHOD_LEVEL))\n-                add(IntInsnNode(BIPUSH, thresholdTime))\n-                add(IntInsnNode(BIPUSH, level))\n-                add(LdcInsnNode(className))\n-                add(LdcInsnNode(methodName))\n-                add(LdcInsnNode(desc))\n-                add(\n-                    MethodInsnNode(\n-                        INVOKEVIRTUAL,\n-                        "com/didichuxing/doraemonkit/aop/method_stack/MethodStackUtil",\n-                        "recodeStaticMethodCostStart",\n-                        "(IIILjava/lang/String;Ljava/lang/String;Ljava/lang/String;)V",\n-                        false\n-                    )\n-                )\n-            } else {\n-                add(\n-                    FieldInsnNode(\n-                        GETSTATIC,\n-                        "com/didichuxing/doraemonkit/aop/method_stack/MethodStackUtil",\n-                        "INSTANCE",\n-                        "Lcom/didichuxing/doraemonkit/aop/method_stack/MethodStackUtil;"\n-                    )\n-                )\n-                add(IntInsnNode(BIPUSH, DoKitExtUtil.STACK_METHOD_LEVEL))\n-                add(IntInsnNode(BIPUSH, thresholdTime))\n-                add(IntInsnNode(BIPUSH, level))\n-                add(LdcInsnNode(className))\n-                add(LdcInsnNode(methodName))\n-                add(LdcInsnNode(desc))\n-                add(VarInsnNode(ALOAD, 0))\n-                add(\n-                    MethodInsnNode(\n-                        INVOKEVIRTUAL,\n-                        "com/didichuxing/doraemonkit/aop/method_stack/MethodStackUtil",\n-                        "recodeObjectMethodCostStart",\n-                        "(IIILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Object;)V",\n-                        false\n-                    )\n-                )\n-            }\n-            this\n-        }\n-\n-\n-    }\n-\n-\n-    /**\n-     * 创建慢函数退出时的指令集\n-     */\n-    private fun createMethodExitInsnList(\n-        level: Int,\n-        className: String,\n-        methodName: String,\n-        desc: String,\n-        access: Int\n-    ): InsnList {\n-        val isStaticMethod = access and ACC_STATIC != 0\n-\n-        return with(InsnList()) {\n-            if (isStaticMethod) {\n-                add(\n-                    FieldInsnNode(\n-                        GETSTATIC,\n-                        "com/didichuxing/doraemonkit/aop/method_stack/MethodStackUtil",\n-                        "INSTANCE",\n-                        "Lcom/didichuxing/doraemonkit/aop/method_stack/MethodStackUtil;"\n-                    )\n-                )\n-                add(IntInsnNode(BIPUSH, thresholdTime))\n-                add(IntInsnNode(BIPUSH, level))\n-                add(LdcInsnNode(className))\n-                add(LdcInsnNode(methodName))\n-                add(LdcInsnNode(desc))\n-                add(\n-                    MethodInsnNode(\n-                        INVOKEVIRTUAL,\n-                        "com/didichuxing/doraemonkit/aop/method_stack/MethodStackUtil",\n-                        "recodeStaticMethodCostEnd",\n-                        "(IILjava/lang/String;Ljava/lang/String;Ljava/lang/String;)V",\n-                        false\n-                    )\n-                )\n-            } else {\n-                add(\n-                    FieldInsnNode(\n-                        GETSTATIC,\n-                        "com/didichuxing/doraemonkit/aop/method_stack/MethodStackUtil",\n-                        "INSTANCE",\n-                        "Lcom/didichuxing/doraemonkit/aop/method_stack/MethodStackUtil;"\n-                    )\n-                )\n-                add(IntInsnNode(BIPUSH, thresholdTime))\n-                add(IntInsnNode(BIPUSH, level))\n-                add(LdcInsnNode(className))\n-                add(LdcInsnNode(methodName))\n-                add(LdcInsnNode(desc))\n-                add(VarInsnNode(ALOAD, 0))\n-                add(\n-                    MethodInsnNode(\n-                        INVOKEVIRTUAL,\n-                        "com/didichuxing/doraemonkit/aop/method_stack/MethodStackUtil",\n-                        "recodeObjectMethodCostEnd",\n-                        "(IILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Object;)V",\n-                        false\n-                    )\n-                )\n-            }\n-            this\n-        }\n-\n-    }\n-\n-}\n-\ndiff --git a/Android/java/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/classtransformer/GlobalSlowMethodTransformer.kt b/Android/java/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/classtransformer/GlobalSlowMethodTransformer.kt\ndeleted file mode 100644\nindex 4760723f..00000000\n--- a/Android/java/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/classtransformer/GlobalSlowMethodTransformer.kt\n+++ /dev/null\n@@ -1,216 +0,0 @@\n-package com.didichuxing.doraemonkit.plugin.classtransformer\n-\n-import com.didichuxing.doraemonkit.plugin.*\n-import com.didichuxing.doraemonkit.plugin.extension.SlowMethodExt\n-import com.didiglobal.booster.annotations.Priority\n-import com.didiglobal.booster.transform.TransformContext\n-import com.didiglobal.booster.transform.asm.ClassTransformer\n-import com.didiglobal.booster.transform.asm.asIterable\n-import com.didiglobal.booster.transform.asm.className\n-import com.google.auto.service.AutoService\n-import org.objectweb.asm.Opcodes.*\n-import org.objectweb.asm.tree.*\n-\n-/**\n- * ================================================\n- * 作    者：jint（金台）\n- * 版    本：1.0\n- * 创建日期：2020/5/14-18:07\n- * 描    述：全局业务代码慢函数  wiki:https://juejin.im/post/5e8d87c4f265da47ad218e6b\n- * 修订历史：\n- * ================================================\n- */\n-//@Priority(2)\n-//@AutoService(ClassTransformer::class)\n-class GlobalSlowMethodTransformer : AbsClassTransformer() {\n-    val thresholdTime = DoKitExtUtil.slowMethodExt.normalMethod.thresholdTime\n-\n-    override fun transform(context: TransformContext, klass: ClassNode): ClassNode {\n-        if (onCommInterceptor(context, klass)) {\n-            return klass\n-        }\n-\n-        if (!DoKitExtUtil.dokitSlowMethodSwitchOpen()) {\n-            return klass\n-        }\n-\n-        if (DoKitExtUtil.SLOW_METHOD_STRATEGY == SlowMethodExt.STRATEGY_STACK) {\n-            return klass\n-        }\n-\n-        if (DoKitExtUtil.ignorePackageNames(klass.className)) {\n-            return klass\n-        }\n-\n-\n-        val className = klass.className\n-        //没有自定义设置插装包名 默认是以packageName为包名 即全局业务代码插桩\n-        DoKitExtUtil.slowMethodExt.normalMethod.packageNames.forEach { packageName ->\n-            //包含在白名单中且不在黑名单中\n-            if (className.contains(packageName) && notMatchedBlackList(className)) {\n-                klass.methods.filter { methodNode ->\n-                    methodNode.name != "<init>" &&\n-                            !methodNode.isEmptyMethod() &&\n-                            !methodNode.isSingleMethod() &&\n-                            !methodNode.isGetSetMethod()\n-                }.forEach { methodNode ->\n-                    methodNode.instructions.asIterable()\n-                        .filterIsInstance(MethodInsnNode::class.java).let { methodInsnNodes ->\n-                            if (methodInsnNodes.isNotEmpty()) {\n-                                //方法入口插入\n-                                methodNode.instructions.insert(\n-                                    createMethodEnterInsnList(\n-                                        className,\n-                                        methodNode.name,\n-                                        methodNode.access\n-                                    )\n-                                )\n-                                //方法出口插入\n-                                methodNode.instructions.getMethodExitInsnNodes()\n-                                    ?.forEach { methodExitInsnNode ->\n-                                        methodNode.instructions.insertBefore(\n-                                            methodExitInsnNode,\n-                                            createMethodExitInsnList(\n-                                                className,\n-                                                methodNode.name,\n-                                                methodNode.access\n-                                            )\n-                                        )\n-                                    }\n-                            }\n-                        }\n-                }\n-            }\n-        }\n-        return klass\n-    }\n-\n-\n-    private fun notMatchedBlackList(className: String): Boolean {\n-        for (strBlack in DoKitExtUtil.slowMethodExt.normalMethod.methodBlacklist) {\n-            if (className.contains(strBlack)) {\n-                return false\n-            }\n-        }\n-\n-        return true\n-    }\n-\n-    /**\n-     * 创建慢函数入口指令集\n-     */\n-    private fun createMethodEnterInsnList(\n-        className: String,\n-        methodName: String,\n-        access: Int\n-    ): InsnList {\n-        val isStaticMethod = access and ACC_STATIC != 0\n-        return with(InsnList()) {\n-            if (isStaticMethod) {\n-                add(\n-                    FieldInsnNode(\n-                        GETSTATIC,\n-                        "com/didichuxing/doraemonkit/aop/MethodCostUtil",\n-                        "INSTANCE",\n-                        "Lcom/didichuxing/doraemonkit/aop/MethodCostUtil;"\n-                    )\n-                )\n-                add(IntInsnNode(SIPUSH, thresholdTime))\n-                add(LdcInsnNode("$className&$methodName"))\n-                add(\n-                    MethodInsnNode(\n-                        INVOKEVIRTUAL,\n-                        "com/didichuxing/doraemonkit/aop/MethodCostUtil",\n-                        "recodeStaticMethodCostStart",\n-                        "(ILjava/lang/String;)V",\n-                        false\n-                    )\n-                )\n-            } else {\n-                add(\n-                    FieldInsnNode(\n-                        GETSTATIC,\n-                        "com/didichuxing/doraemonkit/aop/MethodCostUtil",\n-                        "INSTANCE",\n-                        "Lcom/didichuxing/doraemonkit/aop/MethodCostUtil;"\n-                    )\n-                )\n-                add(IntInsnNode(SIPUSH, thresholdTime))\n-                add(LdcInsnNode("$className&$methodName"))\n-                add(VarInsnNode(ALOAD, 0))\n-                add(\n-                    MethodInsnNode(\n-                        INVOKEVIRTUAL,\n-                        "com/didichuxing/doraemonkit/aop/MethodCostUtil",\n-                        "recodeObjectMethodCostStart",\n-                        "(ILjava/lang/String;Ljava/lang/Object;)V",\n-                        false\n-                    )\n-                )\n-            }\n-\n-            this\n-        }\n-\n-    }\n-\n-\n-    /**\n-     * 创建慢函数退出时的指令集\n-     */\n-    private fun createMethodExitInsnList(\n-        className: String,\n-        methodName: String,\n-        access: Int\n-    ): InsnList {\n-        val isStaticMethod = access and ACC_STATIC != 0\n-        return with(InsnList()) {\n-            if (isStaticMethod) {\n-                add(\n-                    FieldInsnNode(\n-                        GETSTATIC,\n-                        "com/didichuxing/doraemonkit/aop/MethodCostUtil",\n-                        "INSTANCE",\n-                        "Lcom/didichuxing/doraemonkit/aop/MethodCostUtil;"\n-                    )\n-                )\n-                add(IntInsnNode(SIPUSH, thresholdTime))\n-                add(LdcInsnNode("$className&$methodName"))\n-                add(\n-                    MethodInsnNode(\n-                        INVOKEVIRTUAL,\n-                        "com/didichuxing/doraemonkit/aop/MethodCostUtil",\n-                        "recodeStaticMethodCostEnd",\n-                        "(ILjava/lang/String;)V",\n-                        false\n-                    )\n-                )\n-            } else {\n-                add(\n-                    FieldInsnNode(\n-                        GETSTATIC,\n-                        "com/didichuxing/doraemonkit/aop/MethodCostUtil",\n-                        "INSTANCE",\n-                        "Lcom/didichuxing/doraemonkit/aop/MethodCostUtil;"\n-                    )\n-                )\n-                add(IntInsnNode(SIPUSH, thresholdTime))\n-                add(LdcInsnNode("$className&$methodName"))\n-                add(VarInsnNode(ALOAD, 0))\n-                add(\n-                    MethodInsnNode(\n-                        INVOKEVIRTUAL,\n-                        "com/didichuxing/doraemonkit/aop/MethodCostUtil",\n-                        "recodeObjectMethodCostEnd",\n-                        "(ILjava/lang/String;Ljava/lang/Object;)V",\n-                        false\n-                    )\n-                )\n-            }\n-            this\n-        }\n-    }\n-\n-\n-}\n-\ndiff --git a/Android/java/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/classtransformer/MethodStackDepTransformer.kt b/Android/java/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/classtransformer/MethodStackDepTransformer.kt\ndeleted file mode 100644\nindex 42a3dfca..00000000\n--- a/Android/java/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/classtransformer/MethodStackDepTransformer.kt\n+++ /dev/null\n@@ -1,259 +0,0 @@\n-package com.didichuxing.doraemonkit.plugin.classtransformer\n-\n-import com.didichuxing.doraemonkit.plugin.*\n-import com.didichuxing.doraemonkit.plugin.extension.SlowMethodExt\n-import com.didichuxing.doraemonkit.plugin.stack_method.MethodStackNode\n-import com.didichuxing.doraemonkit.plugin.stack_method.MethodStackNodeUtil\n-import com.didiglobal.booster.transform.TransformContext\n-import com.didiglobal.booster.transform.asm.ClassTransformer\n-import com.didiglobal.booster.transform.asm.asIterable\n-import com.didiglobal.booster.transform.asm.className\n-import org.objectweb.asm.Opcodes.*\n-import org.objectweb.asm.tree.*\n-\n-/**\n- * ================================================\n- * 作    者：jint（金台）\n- * 版    本：1.0\n- * 创建日期：2020/5/14-18:07\n- * 描    述：入口函数 慢函数调用栈 wiki:https://juejin.im/post/5e8d87c4f265da47ad218e6b\n- * 修订历史：不要指定自动注入 需要手动在DoKitAsmTransformer中通过配置创建\n- * 原理:transform()方法的调用是无序的  原因:哪一个class会先被transformer执行是不确定的  但是每一个class被transformer执行顺序是遵循transformer的Priority规则的\n- * ================================================\n- */\n-class MethodStackDepTransformer(private val level: Int = 1) : AbsClassTransformer() {\n-\n-    private val thresholdTime = DoKitExtUtil.slowMethodExt.stackMethod.thresholdTime\n-    override fun transform(context: TransformContext, klass: ClassNode): ClassNode {\n-        if (onCommInterceptor(context, klass)) {\n-            return klass\n-        }\n-\n-\n-        if (!DoKitExtUtil.dokitSlowMethodSwitchOpen()) {\n-            return klass\n-        }\n-\n-        if (DoKitExtUtil.SLOW_METHOD_STRATEGY == SlowMethodExt.STRATEGY_NORMAL) {\n-            return klass\n-        }\n-\n-        if (DoKitExtUtil.ignorePackageNames(klass.className)) {\n-            return klass\n-        }\n-\n-        //命中黑名单则不插桩\n-        if (!notMatchedBlackList(klass.className)) {\n-            return klass\n-        }\n-\n-\n-        val methodStackKeys: MutableSet<String> = MethodStackNodeUtil.METHOD_STACK_KEYS[level - 1]\n-\n-        klass.methods.filter { methodNode ->\n-            methodNode.name != "<init>" &&\n-                    !methodNode.isEmptyMethod() &&\n-                    !methodNode.isSingleMethod() &&\n-                    !methodNode.isGetSetMethod()\n-        }.forEach { methodNode ->\n-            val key = "${klass.className}&${methodNode.name}&${methodNode.desc}"\n-            if (methodStackKeys.contains(key)) {\n-                "${context.projectDir.lastPath()}->level-->$level   mathched key===>$key".println()\n-                operateMethodInsn(klass, methodNode)\n-            }\n-\n-        }\n-\n-        return klass\n-    }\n-\n-\n-    private fun operateMethodInsn(klass: ClassNode, methodNode: MethodNode) {\n-        //读取全是函数调用的指令\n-        methodNode.instructions.asIterable().filterIsInstance(MethodInsnNode::class.java)\n-            .filter { methodInsnNode ->\n-                methodInsnNode.name != "<init>"\n-            }.forEach { methodInsnNode ->\n-                val methodStackNode = MethodStackNode(\n-                    level,\n-                    methodInsnNode.ownerClassName,\n-                    methodInsnNode.name,\n-                    methodInsnNode.desc,\n-                    klass.className,\n-                    methodNode.name,\n-                    methodNode.desc\n-                )\n-                MethodStackNodeUtil.addMethodStackNode(level, methodStackNode)\n-            }\n-        //函数出入口插入耗时统计代码\n-        //方法入口插入\n-        methodNode.instructions.insert(\n-            createMethodEnterInsnList(\n-                level,\n-                klass.className,\n-                methodNode.name,\n-                methodNode.desc,\n-                methodNode.access\n-            )\n-        )\n-        //方法出口插入\n-        methodNode.instructions.getMethodExitInsnNodes()?.forEach { methodExitInsnNode ->\n-            methodNode.instructions.insertBefore(\n-                methodExitInsnNode,\n-                createMethodExitInsnList(\n-                    level,\n-                    klass.className,\n-                    methodNode.name,\n-                    methodNode.desc,\n-                    methodNode.access\n-                )\n-            )\n-        }\n-    }\n-\n-\n-    /**\n-     * 创建慢函数入口指令集\n-     */\n-    private fun createMethodEnterInsnList(\n-        level: Int,\n-        className: String,\n-        methodName: String,\n-        desc: String,\n-        access: Int\n-    ): InsnList {\n-        val isStaticMethod = access and ACC_STATIC != 0\n-        return with(InsnList()) {\n-            if (isStaticMethod) {\n-                add(\n-                    FieldInsnNode(\n-                        GETSTATIC,\n-                        "com/didichuxing/doraemonkit/aop/method_stack/MethodStackUtil",\n-                        "INSTANCE",\n-                        "Lcom/didichuxing/doraemonkit/aop/method_stack/MethodStackUtil;"\n-                    )\n-                )\n-                add(IntInsnNode(BIPUSH, DoKitExtUtil.STACK_METHOD_LEVEL))\n-                add(IntInsnNode(BIPUSH, thresholdTime))\n-                add(IntInsnNode(BIPUSH, level))\n-                add(LdcInsnNode(className))\n-                add(LdcInsnNode(methodName))\n-                add(LdcInsnNode(desc))\n-                add(\n-                    MethodInsnNode(\n-                        INVOKEVIRTUAL,\n-                        "com/didichuxing/doraemonkit/aop/method_stack/MethodStackUtil",\n-                        "recodeStaticMethodCostStart",\n-                        "(IIILjava/lang/String;Ljava/lang/String;Ljava/lang/String;)V",\n-                        false\n-                    )\n-                )\n-            } else {\n-                add(\n-                    FieldInsnNode(\n-                        GETSTATIC,\n-                        "com/didichuxing/doraemonkit/aop/method_stack/MethodStackUtil",\n-                        "INSTANCE",\n-                        "Lcom/didichuxing/doraemonkit/aop/method_stack/MethodStackUtil;"\n-                    )\n-                )\n-                add(IntInsnNode(BIPUSH, DoKitExtUtil.STACK_METHOD_LEVEL))\n-                add(IntInsnNode(BIPUSH, thresholdTime))\n-                add(IntInsnNode(BIPUSH, level))\n-                add(LdcInsnNode(className))\n-                add(LdcInsnNode(methodName))\n-                add(LdcInsnNode(desc))\n-                add(VarInsnNode(ALOAD, 0))\n-                add(\n-                    MethodInsnNode(\n-                        INVOKEVIRTUAL,\n-                        "com/didichuxing/doraemonkit/aop/method_stack/MethodStackUtil",\n-                        "recodeObjectMethodCostStart",\n-                        "(IIILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Object;)V",\n-                        false\n-                    )\n-                )\n-            }\n-            this\n-        }\n-\n-    }\n-\n-\n-    /**\n-     * 创建慢函数退出时的指令集\n-     */\n-    private fun createMethodExitInsnList(\n-        level: Int,\n-        className: String,\n-        methodName: String,\n-        desc: String,\n-        access: Int\n-    ): InsnList {\n-        val isStaticMethod = access and ACC_STATIC != 0\n-        return with(InsnList()) {\n-            if (isStaticMethod) {\n-                add(\n-                    FieldInsnNode(\n-                        GETSTATIC,\n-                        "com/didichuxing/doraemonkit/aop/method_stack/MethodStackUtil",\n-                        "INSTANCE",\n-                        "Lcom/didichuxing/doraemonkit/aop/method_stack/MethodStackUtil;"\n-                    )\n-                )\n-                add(IntInsnNode(BIPUSH, thresholdTime))\n-                add(IntInsnNode(BIPUSH, level))\n-                add(LdcInsnNode(className))\n-                add(LdcInsnNode(methodName))\n-                add(LdcInsnNode(desc))\n-                add(\n-                    MethodInsnNode(\n-                        INVOKEVIRTUAL,\n-                        "com/didichuxing/doraemonkit/aop/method_stack/MethodStackUtil",\n-                        "recodeStaticMethodCostEnd",\n-                        "(IILjava/lang/String;Ljava/lang/String;Ljava/lang/String;)V",\n-                        false\n-                    )\n-                )\n-            } else {\n-                add(\n-                    FieldInsnNode(\n-                        GETSTATIC,\n-                        "com/didichuxing/doraemonkit/aop/method_stack/MethodStackUtil",\n-                        "INSTANCE",\n-                        "Lcom/didichuxing/doraemonkit/aop/method_stack/MethodStackUtil;"\n-                    )\n-                )\n-                add(IntInsnNode(BIPUSH, thresholdTime))\n-                add(IntInsnNode(BIPUSH, level))\n-                add(LdcInsnNode(className))\n-                add(LdcInsnNode(methodName))\n-                add(LdcInsnNode(desc))\n-                add(VarInsnNode(ALOAD, 0))\n-                add(\n-                    MethodInsnNode(\n-                        INVOKEVIRTUAL,\n-                        "com/didichuxing/doraemonkit/aop/method_stack/MethodStackUtil",\n-                        "recodeObjectMethodCostEnd",\n-                        "(IILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Object;)V",\n-                        false\n-                    )\n-                )\n-            }\n-            this\n-        }\n-\n-    }\n-\n-    private fun notMatchedBlackList(className: String): Boolean {\n-        for (strBlack in DoKitExtUtil.slowMethodExt.stackMethod.methodBlacklist) {\n-            if (className.contains(strBlack)) {\n-                return false\n-            }\n-        }\n-\n-        return true\n-    }\n-\n-}\n-\ndiff --git a/Android/java/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/classtransformer/UrlConnectionTransformer.kt b/Android/java/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/classtransformer/UrlConnectionTransformer.kt\ndeleted file mode 100644\nindex 641f7950..00000000\n--- a/Android/java/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/classtransformer/UrlConnectionTransformer.kt\n+++ /dev/null\n@@ -1,68 +0,0 @@\n-package com.didichuxing.doraemonkit.plugin.classtransformer\n-\n-import com.didichuxing.doraemonkit.plugin.DoKitExtUtil\n-import com.didichuxing.doraemonkit.plugin.isRelease\n-import com.didichuxing.doraemonkit.plugin.lastPath\n-import com.didichuxing.doraemonkit.plugin.println\n-import com.didiglobal.booster.annotations.Priority\n-import com.didiglobal.booster.kotlinx.asIterable\n-import com.didiglobal.booster.transform.TransformContext\n-import com.didiglobal.booster.transform.asm.ClassTransformer\n-import com.didiglobal.booster.transform.asm.className\n-import com.google.auto.service.AutoService\n-import org.objectweb.asm.Opcodes.INVOKESTATIC\n-import org.objectweb.asm.Opcodes.INVOKEVIRTUAL\n-import org.objectweb.asm.tree.ClassNode\n-import org.objectweb.asm.tree.MethodInsnNode\n-\n-/**\n- * ================================================\n- * 作    者：jint（金台）\n- * 版    本：1.0\n- * 创建日期：2020/5/14-18:07\n- * 描    述：wiki:https://juejin.im/post/5e8d87c4f265da47ad218e6b\n- * 修订历史：\n- * ================================================\n- */\n-//@Priority(1)\n-//@AutoService(ClassTransformer::class)\n-class UrlConnectionTransformer : AbsClassTransformer() {\n-    private val SHADOW_URL =\n-        "com/didichuxing/doraemonkit/aop/urlconnection/HttpUrlConnectionProxyUtil"\n-    private val DESC = "(Ljava/net/URLConnection;)Ljava/net/URLConnection;"\n-\n-    override fun transform(context: TransformContext, klass: ClassNode): ClassNode {\n-        if (onCommInterceptor(context, klass)) {\n-            return klass\n-        }\n-\n-        if (!DoKitExtUtil.commExt.networkSwitch) {\n-            return klass\n-        }\n-\n-        if (DoKitExtUtil.ignorePackageNames(klass.className)) {\n-            return klass\n-        }\n-\n-        klass.methods.forEach { method ->\n-            method.instructions?.iterator()?.asIterable()\n-                ?.filterIsInstance(MethodInsnNode::class.java)?.filter {\n-                    it.opcode == INVOKEVIRTUAL &&\n-                            it.owner == "java/net/URL" &&\n-                            it.name == "openConnection" &&\n-                            it.desc == "()Ljava/net/URLConnection;"\n-                }?.forEach {\n-                    "${context.projectDir.lastPath()}-> hook urlconnection succeed:${klass.name}_${it.name}_${it.desc}".println()\n-                    method.instructions.insert(\n-                        it,\n-                        MethodInsnNode(INVOKESTATIC, SHADOW_URL, "proxy", DESC, false)\n-                    )\n-                }\n-        }\n-\n-        return klass\n-    }\n-\n-\n-}\n-\ndiff --git a/Android/java/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/extension/CommExt.kt b/Android/java/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/extension/CommExt.kt\ndeleted file mode 100644\nindex 4daa0389..00000000\n--- a/Android/java/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/extension/CommExt.kt\n+++ /dev/null\n@@ -1,46 +0,0 @@\n-package com.didichuxing.doraemonkit.plugin.extension\n-\n-/**\n- * ================================================\n- * 作    者：jint（金台）\n- * 版    本：1.0\n- * 创建日期：2020/4/28-14:56\n- * 描    述：\n- * 修订历史：\n- * ================================================\n- */\n-open class CommExt(\n-    var gpsSwitch: Boolean = true,\n-    var networkSwitch: Boolean = true,\n-    var bigImgSwitch: Boolean = true,\n-    var webViewSwitch: Boolean = true,\n-    var didinetSwitch: Boolean = true\n-) {\n-\n-    fun gpsSwitch(gpsSwitch: Boolean) {\n-        this.gpsSwitch = gpsSwitch\n-    }\n-\n-    fun networkSwitch(networkSwitch: Boolean) {\n-        this.networkSwitch = networkSwitch\n-    }\n-\n-    fun didinetSwitch(didinetSwitch: Boolean) {\n-        this.didinetSwitch = didinetSwitch\n-    }\n-\n-\n-    fun bigImgSwitch(bigImgSwitch: Boolean) {\n-        this.bigImgSwitch = bigImgSwitch\n-    }\n-\n-    fun webViewSwitch(webViewSwitch: Boolean) {\n-        this.webViewSwitch = webViewSwitch\n-    }\n-\n-    override fun toString(): String {\n-        return "CommExt(gpsSwitch=$gpsSwitch, networkSwitch=$networkSwitch,didinetSwitch=$didinetSwitch, bigImgSwitch=$bigImgSwitch, webviewSwitch=$webViewSwitch)"\n-    }\n-\n-\n-}\n\\ No newline at end of file\ndiff --git a/Android/java/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/extension/DoKitExt.kt b/Android/java/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/extension/DoKitExt.kt\ndeleted file mode 100644\nindex b88b95f2..00000000\n--- a/Android/java/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/extension/DoKitExt.kt\n+++ /dev/null\n@@ -1,42 +0,0 @@\n-package com.didichuxing.doraemonkit.plugin.extension\n-\n-import org.gradle.api.Action\n-\n-/**\n- * Created by jint on 07/10/2018.\n- */\n-open class DoKitExt(\n-        //var dokitPluginSwitch: Boolean = true,\n-        var comm: CommExt = CommExt(),\n-        var slowMethod: SlowMethodExt = SlowMethodExt()) {\n-\n-\n-    //方法名必须和插件配置一直才能进行反射注入\n-//    fun dokitPluginSwitch(dokitPluginSwitch: Boolean) {\n-//        this.dokitPluginSwitch = dokitPluginSwitch\n-//    }\n-\n-    /**\n-     * 让comm 支持 DSL 语法\n-     *\n-     * @param action\n-     */\n-    fun comm(action: Action<CommExt>) {\n-        action.execute(comm)\n-    }\n-\n-    /**\n-     * 让slowMethod 支持 DSL 语法\n-     *\n-     * @param action\n-     */\n-    fun slowMethod(action: Action<SlowMethodExt>) {\n-        action.execute(slowMethod)\n-    }\n-\n-    override fun toString(): String {\n-        return "DoKitExt(comm=$comm, slowMethod=$slowMethod)"\n-    }\n-\n-\n-}\n\\ No newline at end of file\ndiff --git a/Android/java/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/extension/SlowMethodExt.kt b/Android/java/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/extension/SlowMethodExt.kt\ndeleted file mode 100644\nindex 82844403..00000000\n--- a/Android/java/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/extension/SlowMethodExt.kt\n+++ /dev/null\n@@ -1,128 +0,0 @@\n-package com.didichuxing.doraemonkit.plugin.extension\n-\n-import groovy.lang.Closure\n-import org.gradle.util.ConfigureUtil\n-import java.util.*\n-\n-/**\n- * ================================================\n- * 作    者：jint（金台）\n- * 版    本：1.0\n- * 创建日期：2020/4/28-14:56\n- * 描    述：\n- * 修订历史：\n- * ================================================\n- */\n-\n-open class SlowMethodExt(\n-    //0:打印函数调用栈  1:普通模式 运行时打印某个函数的耗时 全局业务代码函数插入\n-    @Deprecated("已弃用,请在项目根目录的gradle.properties中通过DOKIT_METHOD_STRATEGY=0|1 来控制")\n-    var strategy: Int = STRATEGY_STACK,\n-    //函数功能开关\n-    @Deprecated("已弃用,请在项目根目录的gradle.properties中通过DoKit_METHOD_SWITCH=true|false 来控制")\n-    var methodSwitch: Boolean = false,\n-    //函数调用栈模式\n-    var stackMethod: StackMethodExt = StackMethodExt(),\n-    //普通模式\n-    var normalMethod: NormalMethodExt = NormalMethodExt()\n-) {\n-\n-\n-    /**\n-     * 函数功能开关\n-     */\n-    fun strategy(strategy: Int) {\n-        this.strategy = strategy\n-    }\n-\n-    fun methodSwitch(methodSwitch: Boolean) {\n-        this.methodSwitch = methodSwitch\n-    }\n-\n-    fun stackMethod(closure: Closure<StackMethodExt?>?) {\n-        ConfigureUtil.configure(closure, stackMethod)\n-    }\n-\n-    fun normalMethod(closure: Closure<NormalMethodExt?>?) {\n-        ConfigureUtil.configure(closure, normalMethod)\n-    }\n-\n-    class StackMethodExt(\n-        //默认阈值为5ms\n-        var thresholdTime: Int = 5,\n-        //入口函集合\n-        var enterMethods: MutableSet<String> = mutableSetOf(),\n-        //插桩黑名单\n-        var methodBlacklist: MutableSet<String> = mutableSetOf()\n-    ) {\n-\n-        /**\n-         * 默认值为5ms\n-         */\n-        fun thresholdTime(thresholdTime: Int) {\n-            this.thresholdTime = thresholdTime\n-        }\n-\n-\n-        fun enterMethods(enterMethods: MutableSet<String>) {\n-            this.enterMethods = enterMethods\n-        }\n-\n-        fun methodBlacklist(methodBlacklist: MutableSet<String>) {\n-            this.methodBlacklist = methodBlacklist\n-        }\n-\n-        override fun toString(): String {\n-            return "StackMethodExt(thresholdTime=$thresholdTime, enterMethods=$enterMethods, methodBlacklist=$methodBlacklist)"\n-        }\n-\n-\n-    }\n-\n-    class NormalMethodExt(\n-        //默认阈值为500ms\n-        var thresholdTime: Int = 500,\n-        //普通函数的插装包名集合\n-        var packageNames: MutableSet<String> = mutableSetOf(),\n-        //插桩黑名单\n-        var methodBlacklist: MutableSet<String> = mutableSetOf()\n-    ) {\n-        /**\n-         * 默认值为500ms\n-         */\n-\n-        fun thresholdTime(thresholdTime: Int) {\n-            this.thresholdTime = thresholdTime\n-        }\n-\n-        fun packageNames(packageNames: MutableSet<String>) {\n-            this.packageNames = packageNames\n-        }\n-\n-        fun methodBlacklist(methodBlacklist: MutableSet<String>) {\n-            this.methodBlacklist = methodBlacklist\n-        }\n-\n-        override fun toString(): String {\n-            return "NormalMethodExt{" +\n-                    "thresholdTime=" + thresholdTime +\n-                    ", packageNames=" + packageNames +\n-                    ", methodBlacklist=" + methodBlacklist +\n-                    \'}\'\n-        }\n-    }\n-\n-    override fun toString(): String {\n-        return "SlowMethodExt{" +\n-                "strategy=" + strategy +\n-                ", methodSwitch=" + methodSwitch +\n-                ", stackMethod=" + stackMethod +\n-                ", normalMethod=" + normalMethod +\n-                \'}\'\n-    }\n-\n-    companion object {\n-        const val STRATEGY_STACK = 0\n-        const val STRATEGY_NORMAL = 1\n-    }\n-}\n\\ No newline at end of file\ndiff --git a/Android/java/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/processor/DoKitComponentHandler.kt b/Android/java/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/processor/DoKitComponentHandler.kt\ndeleted file mode 100644\nindex ba6c0d60..00000000\n--- a/Android/java/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/processor/DoKitComponentHandler.kt\n+++ /dev/null\n@@ -1,61 +0,0 @@\n-package com.didichuxing.doraemonkit.plugin.processor\n-\n-import com.didichuxing.doraemonkit.plugin.println\n-import org.xml.sax.Attributes\n-import org.xml.sax.helpers.DefaultHandler\n-\n-/**\n- * ================================================\n- * 作    者：jint（金台）\n- * 版    本：1.0\n- * 创建日期：3/2/21-17:26\n- * 描    述：\n- * 修订历史：\n- * ================================================\n- */\n-const val ATTR_NAME = "android:name"\n-\n-const val MANIFEST_ATTR_NAME = "package"\n-\n-class DoKitComponentHandler : DefaultHandler() {\n-    var appPackageName: String = ""\n-    val applications = mutableSetOf<String>()\n-    val activities = mutableSetOf<String>()\n-    val services = mutableSetOf<String>()\n-    val providers = mutableSetOf<String>()\n-    val receivers = mutableSetOf<String>()\n-\n-    override fun startElement(\n-        uri: String,\n-        localName: String,\n-        qName: String,\n-        attributes: Attributes\n-    ) {\n-        val name: String = attributes.getValue(ATTR_NAME) ?: ""\n-\n-        val packageName: String = attributes.getValue(MANIFEST_ATTR_NAME) ?: ""\n-\n-        when (qName) {\n-            "manifest" -> {\n-                appPackageName = packageName\n-            }\n-            "application" -> {\n-                applications.add(name)\n-            }\n-            "activity" -> {\n-                activities.add(name)\n-            }\n-            "service" -> {\n-                services.add(name)\n-            }\n-            "provider" -> {\n-                providers.add(name)\n-            }\n-            "receiver" -> {\n-                receivers.add(name)\n-            }\n-\n-        }\n-    }\n-\n-}\n\\ No newline at end of file\ndiff --git a/Android/java/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/processor/DoKitPluginConfigProcessor.kt b/Android/java/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/processor/DoKitPluginConfigProcessor.kt\ndeleted file mode 100644\nindex b4c702ac..00000000\n--- a/Android/java/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/processor/DoKitPluginConfigProcessor.kt\n+++ /dev/null\n@@ -1,166 +0,0 @@\n-package com.didichuxing.doraemonkit.plugin.processor\n-\n-import com.android.build.gradle.AppExtension\n-import com.android.build.gradle.api.ApplicationVariant\n-import com.android.build.gradle.api.BaseVariant\n-import com.didichuxing.doraemonkit.plugin.*\n-import com.didichuxing.doraemonkit.plugin.extension.DoKitExt\n-import com.didiglobal.booster.gradle.dependencies\n-import com.didiglobal.booster.gradle.getAndroid\n-import com.didiglobal.booster.gradle.project\n-import com.didiglobal.booster.task.spi.VariantProcessor\n-import com.didiglobal.booster.transform.ArtifactManager\n-import com.didiglobal.booster.transform.artifacts\n-import com.didiglobal.booster.transform.util.ComponentHandler\n-import org.gradle.api.Project\n-import org.gradle.api.artifacts.result.ResolvedArtifactResult\n-import java.lang.NullPointerException\n-import javax.xml.parsers.SAXParserFactory\n-\n-/**\n- * ================================================\n- * 作    者：jint（金台）\n- * 版    本：1.0\n- * 创建日期：2020/5/15-11:28\n- * 描    述：\n- * 修订历史：\n- * ================================================\n- */\n-class DoKitPluginConfigProcessor(val project: Project) : VariantProcessor {\n-    override fun process(variant: BaseVariant) {\n-        if (!DoKitExtUtil.DOKIT_PLUGIN_SWITCH) {\n-            return\n-        }\n-\n-        if (variant.isRelease()) {\n-            return\n-        }\n-\n-        //统计三方库信息\n-        if (DoKitExtUtil.THIRD_LIBINFO_SWITCH) {\n-            //遍历三方库\n-            val dependencies = variant.dependencies\n-            DoKitExtUtil.THIRD_LIB_INFOS.clear()\n-            for (artifactResult: ResolvedArtifactResult in dependencies) {\n-                //println("三方库信息===>${artifactResult.variant.displayName}____${artifactResult.file.toString()}")\n-                ///Users/didi/project/android/dokit_github/DoraemonKit/Android/java/app/libs/BaiduLBS_Android.jar\n-                ///Users/didi/.gradle/caches/modules-2/files-2.1/androidx.activity/activity-ktx/1.2.0/c16aac66e6c4617b01118ab2509f009bb7919b3b/activity-ktx-1.2.0.aar\n-                //println("三方库信息===>${artifactResult.variant.displayName}____${artifactResult.file.toString()}")\n-//                "artifactResult===>${artifactResult.file}|${artifactResult.variant}|${artifactResult.id}|${artifactResult.type}".println()\n-                //"artifactResult===>${artifactResult.variant.owner}|${artifactResult.variant.attributes}|${artifactResult.variant.displayName}|${artifactResult.variant.capabilities}|${artifactResult.variant.externalVariant}".println()\n-                //"artifactResult===>${artifactResult.variant.displayName}".println()\n-                val variants = artifactResult.variant.displayName.split(" ")\n-                var thirdLibInfo: ThirdLibInfo? = null\n-                if (variants.size == 3) {\n-                    thirdLibInfo = ThirdLibInfo(\n-                        variants[0],\n-                        artifactResult.file.length()\n-                    )\n-                    if (thirdLibInfo.variant.contains("dokitx-rpc")) {\n-                        DoKitExtUtil.HAS_DOKIT_RPC_MODULE = true\n-                    }\n-//                    "thirdLibInfo.variant===>${thirdLibInfo.variant}".println()\n-                    DoKitExtUtil.THIRD_LIB_INFOS.add(thirdLibInfo)\n-                } else if (variants.size == 4) {\n-                    thirdLibInfo = ThirdLibInfo(\n-                        "porject ${variants[1]}",\n-                        artifactResult.file.length()\n-                    )\n-                    if (thirdLibInfo.variant.contains("doraemonkit-rpc")) {\n-                        DoKitExtUtil.HAS_DOKIT_RPC_MODULE = true\n-                    }\n-//                    "thirdLibInfo.variant===>${thirdLibInfo.variant}".println()\n-                    DoKitExtUtil.THIRD_LIB_INFOS.add(thirdLibInfo)\n-                }\n-\n-\n-                //                val paths = artifactResult.file.toString().split("/")\n-//                var fileName: String = ""\n-//                var groupId: String = ""\n-//                var artifactId: String = ""\n-//                var version: String = ""\n-//                if (artifactResult.file.toString().contains(".gradle/caches")) {\n-//                    if (paths.size >= 5) {\n-//                        groupId = paths[paths.size - 5]\n-//                        artifactId = paths[paths.size - 4]\n-//                        version = paths[paths.size - 3]\n-//                        fileName =\n-//                            "$groupId:$artifactId:$version"\n-//                    } else {\n-//                        fileName = paths[paths.size - 1]\n-//                    }\n-//                } else {\n-//                    fileName = paths[paths.size - 1]\n-//                }\n-//\n-//                val thirdLibInfo =\n-//                    ThirdLibInfo(\n-//                        groupId,\n-//                        artifactId,\n-//                        version,\n-//                        fileName,\n-//                        artifactResult.file.length(),\n-//                        artifactResult.variant.displayName\n-//                    )\n-//                val key = "$groupId:$artifactId"\n-//                if (DoKitExtUtil.THIRD_LIB_INFOS[key] == null) {\n-//                    DoKitExtUtil.THIRD_LIB_INFOS[key] = thirdLibInfo\n-//                } else {\n-//                    val libInfo = DoKitExtUtil.THIRD_LIB_INFOS[key]\n-//                    if (DoKitPluginUtil.compareVersion(thirdLibInfo.version, libInfo!!.version) > 0) {\n-//                        DoKitExtUtil.THIRD_LIB_INFOS[key] = thirdLibInfo\n-//                    }\n-//                }\n-            }\n-        }\n-\n-\n-        //查找application module下的配置\n-        if (variant is ApplicationVariant) {\n-\n-\n-//            if (DoKitExtUtil.OKHTTP_VERSION == "V3") {\n-//                variant.project.dependencies.add(\n-//                    "implementation",\n-//                    "com.didichuxing.doraemonkit:dokit-okhttp_v3:3.2.0"\n-//                )\n-//            } else if (DoKitExtUtil.OKHTTP_VERSION == "V4") {\n-//                variant.project.dependencies.add(\n-//                    "implementation",\n-//                    "com.didichuxing.doraemonkit:dokit-okhttp_v4:3.2.0"\n-//                )\n-//            }\n-\n-\n-            //查找AndroidManifest.xml 文件路径\n-            variant.artifacts.get(ArtifactManager.MERGED_MANIFESTS).forEach { manifest ->\n-                val parser = SAXParserFactory.newInstance().newSAXParser()\n-                val handler = DoKitComponentHandler()\n-                "App Manifest path====>$manifest".println()\n-                parser.parse(manifest, handler)\n-                "App PackageName is====>${handler.appPackageName}".println()\n-                "App Application path====>${handler.applications}".println()\n-                DoKitExtUtil.setAppPackageName(handler.appPackageName)\n-                DoKitExtUtil.setApplications(handler.applications)\n-            }\n-\n-            //读取插件配置\n-            variant.project.getAndroid<AppExtension>().let { appExt ->\n-                //查找Application路径\n-                val doKitExt = variant.project.extensions.getByType(DoKitExt::class.java)\n-                DoKitExtUtil.init(doKitExt)\n-//                "App ApplicationId is====>${appExt.defaultConfig.applicationId}".println()\n-//                appExt.defaultConfig.applicationId?.let {\n-//                    DoKitExtUtil.init(doKitExt)\n-//                } ?: throw NullPointerException("applicationId is null，applicationId暂不支持动态配置的方式读取")\n-\n-            }\n-\n-        } else {\n-            "${variant.project.name}-不建议在Library Module下引入dokit插件".println()\n-        }\n-\n-    }\n-\n-\n-}\n\\ No newline at end of file\ndiff --git a/Android/java/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/stack_method/MethodStackNode.kt b/Android/java/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/stack_method/MethodStackNode.kt\ndeleted file mode 100644\nindex 1cb88dcf..00000000\n--- a/Android/java/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/stack_method/MethodStackNode.kt\n+++ /dev/null\n@@ -1,18 +0,0 @@\n-package com.didichuxing.doraemonkit.plugin.stack_method\n-\n-/**\n- * ================================================\n- * 作    者：jint（金台）\n- * 版    本：1.0\n- * 创建日期：2020/5/20-16:50\n- * 描    述：\n- * 修订历史：\n- * ================================================\n- */\n-data class MethodStackNode(var level: Int,\n-                           var className: String,\n-                           var methodName: String,\n-                           var desc: String,\n-                           var parentClassName: String,\n-                           var parentMethodName: String,\n-                           var parentDesc: String)\n\\ No newline at end of file\ndiff --git a/Android/java/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/stack_method/MethodStackNodeUtil.kt b/Android/java/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/stack_method/MethodStackNodeUtil.kt\ndeleted file mode 100644\nindex b048260f..00000000\n--- a/Android/java/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/stack_method/MethodStackNodeUtil.kt\n+++ /dev/null\n@@ -1,30 +0,0 @@\n-package com.didichuxing.doraemonkit.plugin.stack_method\n-\n-import org.gradle.internal.impldep.org.apache.commons.lang.mutable.Mutable\n-import java.util.*\n-\n-/**\n- * ================================================\n- * 作    者：jint（金台）\n- * 版    本：1.0\n- * 创建日期：2020/5/20-16:58\n- * 描    述：\n- * 修订历史：\n- * ================================================\n- */\n-object MethodStackNodeUtil {\n-\n-\n-    val METHOD_STACK_KEYS: MutableList<MutableSet<String>> by lazy {\n-        Collections.synchronizedList(mutableListOf<MutableSet<String>>())\n-    }\n-\n-\n-    fun addMethodStackNode(level: Int, methodStackNode: MethodStackNode) {\n-        val key = "${methodStackNode.className}&${methodStackNode.methodName}&${methodStackNode.desc}"\n-        METHOD_STACK_KEYS[level].add(key)\n-\n-    }\n-\n-\n-}\n\\ No newline at end of file\ndiff --git a/Android/java/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/transform/DoKitBaseTransform.kt b/Android/java/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/transform/DoKitBaseTransform.kt\ndeleted file mode 100644\nindex 3fa79ffa..00000000\n--- a/Android/java/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/transform/DoKitBaseTransform.kt\n+++ /dev/null\n@@ -1,92 +0,0 @@\n-package com.didichuxing.doraemonkit.plugin.transform\n-\n-import com.android.build.api.transform.QualifiedContent\n-import com.android.build.api.transform.Transform\n-import com.android.build.api.transform.TransformInvocation\n-import com.android.build.gradle.BaseExtension\n-import com.android.build.gradle.internal.pipeline.TransformManager\n-import com.didichuxing.doraemonkit.plugin.DoKitTransformInvocation\n-import com.didichuxing.doraemonkit.plugin.println\n-import com.didiglobal.booster.annotations.Priority\n-import com.didiglobal.booster.gradle.*\n-import com.didiglobal.booster.transform.AbstractKlassPool\n-import com.didiglobal.booster.transform.Transformer\n-import org.gradle.api.Project\n-\n-/**\n- * Represents the transform base\n- * DoKitCommTransform 作用于 CommTransformer、BigImgTransformer、UrlConnectionTransformer、GlobalSlowMethodTransformer\n- * @author johnsonlee\n- */\n-open class DoKitBaseTransform(val project: Project) : Transform() {\n-\n-    /*transformers\n-     * Preload transformers as List to fix NoSuchElementException caused by ServiceLoader in parallel mode\n-     * booster 的默认出炉逻辑 DoKit已重写自处理\n-     */\n-    internal open val transformers = listOf<Transformer>()\n-\n-    internal val verifyEnabled = project.getProperty(OPT_TRANSFORM_VERIFY, false)\n-\n-    private val android: BaseExtension = project.getAndroid()\n-\n-    private lateinit var androidKlassPool: AbstractKlassPool\n-\n-    init {\n-        project.afterEvaluate {\n-            androidKlassPool = object : AbstractKlassPool(android.bootClasspath) {}\n-        }\n-    }\n-\n-    val bootKlassPool: AbstractKlassPool\n-        get() = androidKlassPool\n-\n-    override fun getName() = this.javaClass.simpleName\n-\n-    override fun isIncremental() = !verifyEnabled\n-\n-    override fun isCacheable() = !verifyEnabled\n-\n-    override fun getInputTypes(): MutableSet<QualifiedContent.ContentType> =\n-        TransformManager.CONTENT_CLASS\n-\n-    override fun getScopes(): MutableSet<in QualifiedContent.Scope> = when {\n-        transformers.isEmpty() -> mutableSetOf()\n-        project.plugins.hasPlugin("com.android.library") -> SCOPE_PROJECT\n-        project.plugins.hasPlugin("com.android.application") -> SCOPE_FULL_PROJECT\n-        project.plugins.hasPlugin("com.android.dynamic-feature") -> SCOPE_FULL_WITH_FEATURES\n-        else -> TODO("Not an Android project")\n-    }\n-\n-    override fun getReferencedScopes(): MutableSet<in QualifiedContent.Scope> = when {\n-        transformers.isEmpty() -> when {\n-            project.plugins.hasPlugin("com.android.library") -> SCOPE_PROJECT\n-            project.plugins.hasPlugin("com.android.application") -> SCOPE_FULL_PROJECT\n-            project.plugins.hasPlugin("com.android.dynamic-feature") -> SCOPE_FULL_WITH_FEATURES\n-            else -> TODO("Not an Android project")\n-        }\n-        else -> super.getReferencedScopes()\n-    }\n-\n-    final override fun transform(invocation: TransformInvocation) {\n-        transformers.forEach {\n-            "transform====>${this::class.simpleName}====>${it}}".println()\n-        }\n-\n-        DoKitTransformInvocation(invocation, this).apply {\n-            if (isIncremental) {\n-                doIncrementalTransform()\n-            } else {\n-                outputProvider?.deleteAll()\n-                doFullTransform()\n-            }\n-        }\n-    }\n-\n-\n-}\n-\n-/**\n- * The option for transform outputs verifying, default is false\n- */\n-private const val OPT_TRANSFORM_VERIFY = "dokit.transform.verify"\n\\ No newline at end of file\ndiff --git a/Android/java/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/transform/DoKitCommTransform.kt b/Android/java/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/transform/DoKitCommTransform.kt\ndeleted file mode 100644\nindex 80a5726b..00000000\n--- a/Android/java/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/transform/DoKitCommTransform.kt\n+++ /dev/null\n@@ -1,29 +0,0 @@\n-package com.didichuxing.doraemonkit.plugin.transform\n-\n-import com.didichuxing.doraemonkit.plugin.asmtransformer.DoKitAsmTransformer\n-import com.didichuxing.doraemonkit.plugin.classtransformer.BigImgTransformer\n-import com.didichuxing.doraemonkit.plugin.classtransformer.CommTransformer\n-import com.didichuxing.doraemonkit.plugin.classtransformer.EnterMethodStackTransformer\n-import com.didichuxing.doraemonkit.plugin.classtransformer.GlobalSlowMethodTransformer\n-import com.didiglobal.booster.transform.Transformer\n-import org.gradle.api.Project\n-\n-/**\n- * Represents the transform base\n- * DoKitCommTransform 作用于 CommTransformer、BigImgTransformer、UrlConnectionTransformer、GlobalSlowMethodTransformer、EnterMethodStackTransformer\n- * @author johnsonlee\n- */\n-class DoKitCommTransform(androidProject: Project) : DoKitBaseTransform(androidProject) {\n-\n-    override val transformers = listOf<Transformer>(\n-        DoKitAsmTransformer(\n-            listOf(\n-                CommTransformer(),\n-                BigImgTransformer(),\n-                GlobalSlowMethodTransformer(),\n-                EnterMethodStackTransformer()\n-            )\n-        )\n-    )\n-\n-}\ndiff --git a/Android/java/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/transform/DoKitCommTransformV34.kt b/Android/java/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/transform/DoKitCommTransformV34.kt\ndeleted file mode 100644\nindex ecdf1714..00000000\n--- a/Android/java/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/transform/DoKitCommTransformV34.kt\n+++ /dev/null\n@@ -1,40 +0,0 @@\n-package com.didichuxing.doraemonkit.plugin.transform\n-\n-import com.android.build.api.variant.VariantInfo\n-import com.didichuxing.doraemonkit.plugin.asmtransformer.DoKitAsmTransformer\n-import com.didichuxing.doraemonkit.plugin.classtransformer.BigImgTransformer\n-import com.didichuxing.doraemonkit.plugin.classtransformer.CommTransformer\n-import com.didichuxing.doraemonkit.plugin.classtransformer.EnterMethodStackTransformer\n-import com.didichuxing.doraemonkit.plugin.classtransformer.GlobalSlowMethodTransformer\n-import com.didiglobal.booster.transform.Transformer\n-import org.gradle.api.Project\n-\n-internal class DoKitCommTransformV34(project: Project) : DoKitBaseTransform(project) {\n-\n-\n-    override val transformers = listOf<Transformer>(\n-        DoKitAsmTransformer(\n-            listOf(\n-                CommTransformer(),\n-                BigImgTransformer(),\n-                GlobalSlowMethodTransformer(),\n-                EnterMethodStackTransformer()\n-            )\n-        )\n-    )\n-\n-    @Suppress("UnstableApiUsage")\n-    override fun applyToVariant(variant: VariantInfo): Boolean {\n-        return variant.buildTypeEnabled || (variant.flavorNames.isNotEmpty() && variant.fullVariantEnabled)\n-    }\n-\n-    @Suppress("UnstableApiUsage")\n-    private val VariantInfo.fullVariantEnabled: Boolean\n-        get() = project.findProperty("booster.transform.${fullVariantName}.enabled")?.toString()?.toBoolean() ?: true\n-\n-    @Suppress("UnstableApiUsage")\n-    private val VariantInfo.buildTypeEnabled: Boolean\n-        get() = project.findProperty("booster.transform.${buildTypeName}.enabled")?.toString()?.toBoolean() ?: true\n-\n-}\n-\ndiff --git a/Android/java/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/transform/DoKitDependTransform.kt b/Android/java/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/transform/DoKitDependTransform.kt\ndeleted file mode 100644\nindex c05557b4..00000000\n--- a/Android/java/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/transform/DoKitDependTransform.kt\n+++ /dev/null\n@@ -1,21 +0,0 @@\n-package com.didichuxing.doraemonkit.plugin.transform\n-\n-import com.didichuxing.doraemonkit.plugin.asmtransformer.DoKitAsmTransformer\n-import com.didichuxing.doraemonkit.plugin.classtransformer.MethodStackDepTransformer\n-import com.didiglobal.booster.transform.Transformer\n-import org.gradle.api.Project\n-\n-/**\n- * Represents the transform base\n- * DoKitCommTransform 作用于 CommTransformer、BigImgTransformer、UrlConnectionTransformer、GlobalSlowMethodTransformer\n- * @author johnsonlee\n- */\n-open class DoKitDependTransform(androidProject: Project, private val level: Int) :\n-    DoKitBaseTransform(androidProject) {\n-\n-    override val transformers = listOf<Transformer>(DoKitAsmTransformer(listOf(MethodStackDepTransformer(level))))\n-\n-    override fun getName(): String {\n-        return "${this.javaClass.simpleName}_$level"\n-    }\n-}\ndiff --git a/Android/java/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/transform/DoKitDependTransformV34.kt b/Android/java/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/transform/DoKitDependTransformV34.kt\ndeleted file mode 100644\nindex 19871a19..00000000\n--- a/Android/java/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/transform/DoKitDependTransformV34.kt\n+++ /dev/null\n@@ -1,39 +0,0 @@\n-package com.didichuxing.doraemonkit.plugin.transform\n-\n-import com.android.build.api.variant.VariantInfo\n-import com.didichuxing.doraemonkit.plugin.asmtransformer.DoKitAsmTransformer\n-import com.didichuxing.doraemonkit.plugin.classtransformer.MethodStackDepTransformer\n-import com.didiglobal.booster.transform.Transformer\n-import org.gradle.api.Project\n-\n-/**\n- * Represents the transform base\n- * DoKitCommTransform 作用于 CommTransformer、BigImgTransformer、UrlConnectionTransformer、GlobalSlowMethodTransformer\n- * @author johnsonlee\n- */\n-open class DoKitDependTransformV34(androidProject: Project, private val level: Int) :\n-    DoKitBaseTransform(androidProject) {\n-\n-    override val transformers = listOf<Transformer>(DoKitAsmTransformer(listOf(MethodStackDepTransformer(level))))\n-\n-    override fun getName(): String {\n-        return "${this.javaClass.simpleName}_$level"\n-    }\n-\n-    @Suppress("UnstableApiUsage")\n-    override fun applyToVariant(variant: VariantInfo): Boolean {\n-        return variant.buildTypeEnabled || (variant.flavorNames.isNotEmpty() && variant.fullVariantEnabled)\n-    }\n-\n-    @Suppress("UnstableApiUsage")\n-    private val VariantInfo.fullVariantEnabled: Boolean\n-        get() = project.findProperty("booster.transform.${fullVariantName}.enabled")?.toString()\n-            ?.toBoolean() ?: true\n-\n-    @Suppress("UnstableApiUsage")\n-    private val VariantInfo.buildTypeEnabled: Boolean\n-        get() = project.findProperty("booster.transform.${buildTypeName}.enabled")?.toString()\n-            ?.toBoolean() ?: true\n-\n-\n-}\ndiff --git a/Android/java/settings.gradle b/Android/java/settings.gradle\nindex 448171aa..3b33cb58 100644\n--- a/Android/java/settings.gradle\n+++ b/Android/java/settings.gradle\n@@ -3,12 +3,12 @@ include \':doraemonkit-util\'\n include \':doraemonkit-ft\'\n include \':doraemonkit\'\n include \':doraemonkit-mc\'\n-include \':doraemonkit-plugin\'\n include \':doraemonkit-okhttp-v3\'\n include \':doraemonkit-okhttp-v4\'\n include \':doraemonkit-okhttp-api\'\n include \':doraemonkit-weex\'\n include \':doraemonkit-no-op\'\n-include \':doraemonkit-rpc\'\n-include \':doraemonkit-rpc-mc\'\n+//include \':doraemonkit-rpc\'\n+//include \':doraemonkit-rpc-mc\'\n+includeBuild("./Plugin")\n //include \':doraemonkit-leakcanary\'\n', 'commit_subject': '[feat]  调整compose building  方便后续插件调试 推远端', 'repo_name': 'didi/DoraemonKit', 'committer': {'name': 'liabao', 'email': '55d8f4a156c56468f97201972f7f472acd788418@bilibili.com', 'time_sec': '1626276543', 'tz_offset': '480', 'date': {'seconds': '1626276543'}}, 'commit_tree': 'c6fe3e14394675b6396dc48e89ee02c6750ba3a1', 'commit_message': '[feat]  调整compose building  方便后续插件调试 推远端\n', 'language_name': 'Ruby', 'license': 'apache-2.0', 'hunks': "@@ -0,0 +1,1 @@\n+include ':doraemonkit-plugin'\n", 'addition_count': 1, 'deletion_count': 0, 'src_file': '/dev/null', 'tgt_file': 'b/Android/java/Plugin/settings.gradle', 'file_extension': '.gradle', 'before_file': 'ADDFILE', 'message': '[feat]  调整compose building  方便后续插件调试 推远端\n', 'author_name': 'liabao', 'lang': 'gradle'}