All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.imqa.asm.LifecycleVisitor Maven / Gradle / Ivy

There is a newer version: 2.25.11
Show newest version
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;
	}

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy