io.imqa.asm.LifecycleVisitor Maven / Gradle / Ivy
package io.imqa.asm;
import org.objectweb.asm.Label;
import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Opcodes;
import org.objectweb.asm.commons.AdviceAdapter;
import java.util.ArrayList;
import io.imqa.injector.MappingDecoder;
import io.imqa.injector.util.Logger;
public class LifecycleVisitor extends AdviceAdapter {
protected String fieldName;
protected String fieldDesc;
protected String renderName;
protected LifecycleVisitor(int access, String name, String desc, MethodVisitor mv) {
super(Opcodes.ASM5, mv, access, name, desc);
this.fieldName = name;
this.fieldDesc = desc;
this.renderName = checkCycle(name);
}
@Override
protected void onMethodEnter() {
super.visitMethodInsn(
Opcodes.INVOKESTATIC,
"io/imqa/mpm/IMQAMpmAgent",
"getInstance",
"()Lio/imqa/mpm/IMQAMpmAgent;",
false);
super.visitVarInsn(Opcodes.ALOAD, 0);
super.visitFieldInsn(
Opcodes.GETSTATIC,
"io/imqa/core/dump/ActivityRenderData",
renderName,
MappingDecoder.getInstance().decodeField("Ljava/lang/String;"));
super.visitMethodInsn(
Opcodes.INVOKEVIRTUAL,
"io/imqa/mpm/IMQAMpmAgent",
"startRender",
MappingDecoder.getInstance().decodeDesc("(Landroid/app/Activity;Ljava/lang/String;)V"),
false);
}
@Override
protected void onMethodExit(int opcode) {
super.visitMethodInsn(
Opcodes.INVOKESTATIC,
"io/imqa/mpm/IMQAMpmAgent",
"getInstance",
"()Lio/imqa/mpm/IMQAMpmAgent;",
false);
super.visitVarInsn(Opcodes.ALOAD, 0);
super.visitFieldInsn(
Opcodes.GETSTATIC,
"io/imqa/core/dump/ActivityRenderData",
renderName,
MappingDecoder.getInstance().decodeField("Ljava/lang/String;"));
super.visitMethodInsn(
Opcodes.INVOKEVIRTUAL,
"io/imqa/mpm/IMQAMpmAgent",
"endRender",
MappingDecoder.getInstance().decodeDesc("(Landroid/app/Activity;Ljava/lang/String;)V"),
false);
}
protected String checkCycle(String cycleName) {
switch (cycleName) {
case "onCreate":
cycleName = "CREATED";
break;
case "onStart":
cycleName = "STARTED";
break;
case "onResume":
cycleName = "RESUMED";
break;
}
return cycleName;
}
}