From 911a8c3e3b3a01e5ec39312fcda767ab24afb6cb Mon Sep 17 00:00:00 2001 From: styluo Date: Mon, 19 Aug 2024 16:20:49 +0800 Subject: [PATCH] fix: agp is unable to handle the classes under the default package correctly --- app/src/main/java/CustomDialog.kt | 10 ++++++++++ .../plugin/visitor/DesugarClassVisitor.kt | 7 +++++-- .../android/plugin/giokit/GioKitCodeVisitor.kt | 11 +++++++---- .../plugin/giokit/GioKitInjectVisitor.kt | 17 ++++++++++++++++- .../plugin/visitor/AutoTrackerFactory.kt | 2 ++ 5 files changed, 40 insertions(+), 7 deletions(-) create mode 100644 app/src/main/java/CustomDialog.kt diff --git a/app/src/main/java/CustomDialog.kt b/app/src/main/java/CustomDialog.kt new file mode 100644 index 0000000..6be2a3f --- /dev/null +++ b/app/src/main/java/CustomDialog.kt @@ -0,0 +1,10 @@ +import android.view.View + +class CustomDialog { + private var view: View? = null + + public fun setListener() { + view?.setOnClickListener { + } + } +} \ No newline at end of file diff --git a/autotracker-gradle-plugin/agp-wrapper-impl/src/main/kotlin/com/growingio/android/plugin/visitor/DesugarClassVisitor.kt b/autotracker-gradle-plugin/agp-wrapper-impl/src/main/kotlin/com/growingio/android/plugin/visitor/DesugarClassVisitor.kt index 69d61b0..49586aa 100644 --- a/autotracker-gradle-plugin/agp-wrapper-impl/src/main/kotlin/com/growingio/android/plugin/visitor/DesugarClassVisitor.kt +++ b/autotracker-gradle-plugin/agp-wrapper-impl/src/main/kotlin/com/growingio/android/plugin/visitor/DesugarClassVisitor.kt @@ -21,6 +21,7 @@ import com.growingio.android.plugin.hook.TargetMethod import com.growingio.android.plugin.util.ClassContextCompat import com.growingio.android.plugin.util.info import com.growingio.android.plugin.util.unNormalize +import com.growingio.android.plugin.util.normalize import org.objectweb.asm.ClassVisitor import org.objectweb.asm.Handle import org.objectweb.asm.MethodVisitor @@ -42,6 +43,7 @@ class DesugarClassVisitor( private val generateMethodBlocks = hashMapOf() private val needInjectTargetMethods = hashSetOf() private var generateMethodIndex = 0 + private lateinit var realClassName: String override fun visit( version: Int, @@ -52,6 +54,7 @@ class DesugarClassVisitor( interfaces: Array? ) { super.visit(version, access, name, signature, superName, interfaces) + realClassName = if (name != null) normalize(name) else className } override fun visitMethod( @@ -208,7 +211,7 @@ class DesugarClassVisitor( } } - if (handle.owner == className.unNormalize()) { + if (handle.owner == realClassName.unNormalize()) { // 实现方法在当前类中 // 示例参考1: 在类中生成相应的方法如 LambdaSample#print0 ==> 生成 lambda$print0$0,将其加入 injectMethods 中 @@ -255,7 +258,7 @@ class DesugarClassVisitor( } newArgs[1] = Handle( H_INVOKESTATIC, - className.unNormalize(), + realClassName.unNormalize(), methodBlock.methodName, methodBlock.methodDesc, false diff --git a/autotracker-gradle-plugin/src/main/kotlin/com/growingio/android/plugin/giokit/GioKitCodeVisitor.kt b/autotracker-gradle-plugin/src/main/kotlin/com/growingio/android/plugin/giokit/GioKitCodeVisitor.kt index 623ee52..31ef56f 100644 --- a/autotracker-gradle-plugin/src/main/kotlin/com/growingio/android/plugin/giokit/GioKitCodeVisitor.kt +++ b/autotracker-gradle-plugin/src/main/kotlin/com/growingio/android/plugin/giokit/GioKitCodeVisitor.kt @@ -34,6 +34,8 @@ internal class GioKitCodeVisitor( private val generatedMethods = hashSetOf() + private lateinit var realClassName: String + init { val configMethods = hashSetOf() trackerCalledMethods.forEach { @@ -59,6 +61,7 @@ internal class GioKitCodeVisitor( interfaces: Array? ) { super.visit(version, access, name, signature, superName, interfaces) + realClassName = if (name != null) normalize(name) else context.className } override fun visitMethod( @@ -124,7 +127,7 @@ internal class GioKitCodeVisitor( } } codeSet.removeIf { - it.startsWith(context.className + "::") + it.startsWith("$realClassName::") } generatedMethods.forEach { codeSet.add(it) @@ -165,9 +168,9 @@ internal class GioKitCodeVisitor( else it } calledMethods.filter { owner2 == it.first.unNormalize() && name2 == it.second }.forEach { _ -> - g("find ${context.className} :: ${name}") - generatedMethods.add("${context.className}::${gName}") - g("[generate index]:$index:${context.className} :: ${name}") + g("find $realClassName :: $name") + generatedMethods.add("$realClassName::$gName") + g("[generate index]:$index:$realClassName :: $name") index += 1 } diff --git a/autotracker-gradle-plugin/src/main/kotlin/com/growingio/android/plugin/giokit/GioKitInjectVisitor.kt b/autotracker-gradle-plugin/src/main/kotlin/com/growingio/android/plugin/giokit/GioKitInjectVisitor.kt index c8bfe21..7d3148c 100644 --- a/autotracker-gradle-plugin/src/main/kotlin/com/growingio/android/plugin/giokit/GioKitInjectVisitor.kt +++ b/autotracker-gradle-plugin/src/main/kotlin/com/growingio/android/plugin/giokit/GioKitInjectVisitor.kt @@ -1,6 +1,7 @@ package com.growingio.android.plugin.giokit import com.growingio.android.plugin.util.ClassContextCompat +import com.growingio.android.plugin.util.normalize import org.objectweb.asm.ClassVisitor import org.objectweb.asm.MethodVisitor @@ -16,6 +17,20 @@ internal class GioKitInjectVisitor( private val giokitParams: GioKitParams ) : ClassVisitor(api, ncv), ClassContextCompat by classContext { + private lateinit var realClassName: String + + override fun visit( + version: Int, + access: Int, + name: String?, + signature: String?, + superName: String?, + interfaces: Array? + ) { + super.visit(version, access, name, signature, superName, interfaces) + realClassName = if (name != null) normalize(name) else classContext.className + } + override fun visitMethod( access: Int, methodName: String, @@ -24,7 +39,7 @@ internal class GioKitInjectVisitor( exceptions: Array? ): MethodVisitor { val mv = super.visitMethod(access, methodName, descriptor, signature, exceptions) - val data = GioKitInjectData.matchGioKitData(classContext.className, methodName, descriptor) ?: return mv + val data = GioKitInjectData.matchGioKitData(realClassName, methodName, descriptor) ?: return mv return when (data) { GioKitInjectData.GioKitInjectInit -> { val config = hashMapOf() diff --git a/autotracker-gradle-plugin/src/main/kotlin/com/growingio/android/plugin/visitor/AutoTrackerFactory.kt b/autotracker-gradle-plugin/src/main/kotlin/com/growingio/android/plugin/visitor/AutoTrackerFactory.kt index 83388ad..ac58f7f 100644 --- a/autotracker-gradle-plugin/src/main/kotlin/com/growingio/android/plugin/visitor/AutoTrackerFactory.kt +++ b/autotracker-gradle-plugin/src/main/kotlin/com/growingio/android/plugin/visitor/AutoTrackerFactory.kt @@ -46,6 +46,8 @@ internal abstract class AutoTrackerFactory : override fun createClassVisitor(classContext: ClassContext, nextClassVisitor: ClassVisitor): ClassVisitor { val classContextCompat = object : ClassContextCompat { + // AsmInstrumentationManager#instrumentClassesFromDirectoryToDirectory 移除文件名方法无包名(相对路径为当前路径)时不生效 + // 非日志输出时,尽可能使用visit方法参数中返回的name override val className = classContext.currentClassData.className override fun isAssignable(subClazz: String, superClazz: String): Boolean {