From 5a309b3b15ff7aea8571fccaedcf193b1399f35f Mon Sep 17 00:00:00 2001 From: yummylau Date: Tue, 22 Oct 2019 14:07:55 +0800 Subject: [PATCH] =?UTF-8?q?reset=20init=20inject=20code=20=EF=BC=8Cremove?= =?UTF-8?q?=20autoInject=20annotation?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/plugin/component/MainActivity.java | 2 - .../com/plugin/component/anno/AutoInject.kt | 10 --- .../com/plugin/component/anno/AutoInject.java | 15 ---- .../transform/InjectCodeAdapter.groovy | 79 +++++++++---------- .../com/component/debug/DebugActivity.java | 2 - 5 files changed, 39 insertions(+), 69 deletions(-) delete mode 100644 component-core/src/main/java/com/plugin/component/anno/AutoInject.kt delete mode 100644 component-plugin/src/main/groovy/com/plugin/component/anno/AutoInject.java diff --git a/app/src/main/java/com/plugin/component/MainActivity.java b/app/src/main/java/com/plugin/component/MainActivity.java index 8a82233..17c7465 100644 --- a/app/src/main/java/com/plugin/component/MainActivity.java +++ b/app/src/main/java/com/plugin/component/MainActivity.java @@ -4,7 +4,6 @@ import android.os.Bundle; import com.google.android.material.floatingactionbutton.FloatingActionButton; import com.google.android.material.snackbar.Snackbar; -import com.plugin.component.anno.AutoInject; import com.plugin.library.IProvideFromLibrary; import com.plugin.library.ISdk; import com.plugin.library.ISdk2; @@ -48,7 +47,6 @@ public class MainActivity extends AppCompatActivity { ((TextView) findViewById(R.id.text)).setText(stringBuilder); } - @AutoInject public void initComponent(){ ComponentManager.init(getApplication()); } diff --git a/component-core/src/main/java/com/plugin/component/anno/AutoInject.kt b/component-core/src/main/java/com/plugin/component/anno/AutoInject.kt deleted file mode 100644 index cb6e152..0000000 --- a/component-core/src/main/java/com/plugin/component/anno/AutoInject.kt +++ /dev/null @@ -1,10 +0,0 @@ -package com.plugin.component.anno - -import kotlin.reflect.KClass - -/** - * 自动注入组件实现 - */ -@Target(AnnotationTarget.FUNCTION) -@kotlin.annotation.Retention(AnnotationRetention.BINARY) -annotation class AutoInject() diff --git a/component-plugin/src/main/groovy/com/plugin/component/anno/AutoInject.java b/component-plugin/src/main/groovy/com/plugin/component/anno/AutoInject.java deleted file mode 100644 index c2f18bd..0000000 --- a/component-plugin/src/main/groovy/com/plugin/component/anno/AutoInject.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.plugin.component.anno; - - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * 自动注入sdk实现 - */ -@Target(ElementType.METHOD) -@Retention(RetentionPolicy.CLASS) -public @interface AutoInject { -} \ No newline at end of file diff --git a/component-plugin/src/main/groovy/com/plugin/component/transform/InjectCodeAdapter.groovy b/component-plugin/src/main/groovy/com/plugin/component/transform/InjectCodeAdapter.groovy index 4888b3f..49ca7fe 100644 --- a/component-plugin/src/main/groovy/com/plugin/component/transform/InjectCodeAdapter.groovy +++ b/component-plugin/src/main/groovy/com/plugin/component/transform/InjectCodeAdapter.groovy @@ -1,6 +1,5 @@ package com.plugin.component.transform -import com.plugin.component.anno.AutoInject import com.plugin.component.transform.info.ComponentSdkInfo import com.plugin.component.transform.info.ScanRuntime import org.objectweb.asm.AnnotationVisitor @@ -33,53 +32,22 @@ class InjectCodeAdapter extends ClassVisitor { super.visit(version, access, name, signature, superName, interfaces) } - @Override - MethodVisitor visitMethod(int access, String name, String methodDescriptor, String signature, String[] exceptions) { - MethodVisitor mv = super.visitMethod(access, name, methodDescriptor, signature, exceptions) - mv = new AdviceAdapter(Opcodes.ASM7, mv, access, name, methodDescriptor) { - - private boolean hasAutoInjectMethod = false - - @Override - AnnotationVisitor visitAnnotation(String descriptor, boolean visible) { - hasAutoInjectMethod = Type.getDescriptor(AutoInject.class) == descriptor - return super.visitAnnotation(descriptor, visible) - } - - @Override - protected void onMethodExit(int opcode) { - if (hasAutoInjectMethod) { - for (ComponentSdkInfo item : ScanRuntime.getComponentSdkInfoList()) { - if (item.isValid()) { - mv.visitLdcInsn(Type.getType(item.componentClassName)) - mv.visitLdcInsn(Type.getType(item.sdk)) - mv.visitLdcInsn(Type.getType(item.impl)) - mv.visitMethodInsn(Opcodes.INVOKESTATIC, "com/plugin/component/SdkManager", "register", "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/Object;)V", false) - } - } - } - } - } - return mv - } - - // @Override -// MethodVisitor visitMethod(int access, String name, String descriptor, String signature, String[] exceptions) { -// MethodVisitor mv = super.visitMethod(access, name, descriptor, signature, exceptions) -// mv = new AdviceAdapter(Opcodes.ASM7, mv, access, name, descriptor) { +// MethodVisitor visitMethod(int access, String name, String methodDescriptor, String signature, String[] exceptions) { +// MethodVisitor mv = super.visitMethod(access, name, methodDescriptor, signature, exceptions) +// mv = new AdviceAdapter(Opcodes.ASM7, mv, access, name, methodDescriptor) { // -// private boolean injectComponentAutoInitCode = false +// private boolean hasAutoInjectMethod = false // // @Override -// protected void onMethodEnter() { -// injectComponentAutoInitCode = -// className == sComponentManagerPath && name == "init" && descriptor == "(Landroid/app/Application;)V" +// AnnotationVisitor visitAnnotation(String descriptor, boolean visible) { +// hasAutoInjectMethod = Type.getDescriptor(AutoInject.class) == descriptor +// return super.visitAnnotation(descriptor, visible) // } // // @Override // protected void onMethodExit(int opcode) { -// if (injectComponentAutoInitCode) { +// if (hasAutoInjectMethod) { // for (ComponentSdkInfo item : ScanRuntime.getComponentSdkInfoList()) { // if (item.isValid()) { // mv.visitLdcInsn(Type.getType(item.componentClassName)) @@ -93,4 +61,35 @@ class InjectCodeAdapter extends ClassVisitor { // } // return mv // } + + + @Override + MethodVisitor visitMethod(int access, String name, String descriptor, String signature, String[] exceptions) { + MethodVisitor mv = super.visitMethod(access, name, descriptor, signature, exceptions) + mv = new AdviceAdapter(Opcodes.ASM7, mv, access, name, descriptor) { + + private boolean injectComponentAutoInitCode = false + + @Override + protected void onMethodEnter() { + injectComponentAutoInitCode = + className == sComponentManagerPath && name == "init" && descriptor == "(Landroid/app/Application;)V" + } + + @Override + protected void onMethodExit(int opcode) { + if (injectComponentAutoInitCode) { + for (ComponentSdkInfo item : ScanRuntime.getComponentSdkInfoList()) { + if (item.isValid()) { + mv.visitLdcInsn(Type.getType(item.componentClassName)) + mv.visitLdcInsn(Type.getType(item.sdk)) + mv.visitLdcInsn(Type.getType(item.impl)) + mv.visitMethodInsn(Opcodes.INVOKESTATIC, "com/plugin/component/SdkManager", "register", "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/Object;)V", false) + } + } + } + } + } + return mv + } } diff --git a/debugModule/src/main/java/com/component/debug/DebugActivity.java b/debugModule/src/main/java/com/component/debug/DebugActivity.java index cf8a023..911a141 100644 --- a/debugModule/src/main/java/com/component/debug/DebugActivity.java +++ b/debugModule/src/main/java/com/component/debug/DebugActivity.java @@ -9,7 +9,6 @@ import androidx.appcompat.app.AppCompatActivity; import com.component.debug.R; import com.plugin.component.ComponentManager; -import com.plugin.component.anno.AutoInject; public class DebugActivity extends AppCompatActivity { @@ -21,7 +20,6 @@ public class DebugActivity extends AppCompatActivity { initComponent(getApplication()); } - @AutoInject public void initComponent(Application application){ ComponentManager.init(application); }