ASM:Stacks have different current sizes [1] and [0]

179 阅读1分钟

今天想使用ASM往每个方法入口插入日志,实现是这样的

@Override
public org.objectweb.asm.MethodVisitor visitMethod(int access, String name, String descriptor, String signature, String[] exceptions) {
    org.objectweb.asm.MethodVisitor mv = super.visitMethod(access, name, descriptor, signature, exceptions);
    return new AdviceAdapter(Constants.ASM_API, mv, access, name, descriptor) {
        @Override
        protected void onMethodEnter() {
            super.onMethodEnter();
            mv.visitLdcInsn("owenli");
            mv.visitLdcInsn("test");
            mv.visitMethodInsn(INVOKESTATIC, "android/util/Log", "e", "(Ljava/lang/String;Ljava/lang/String;)I", false);
        }
    };
}

期望达到的效果是往每个方法的入口加入这行代码

Log.e("owenli","test");

但是在使用插件的时候会报异常 image.png 定位发现,原来Log.e方法会返回一个int值,所以解决方法是加上visitInsn(POP)

@Override
            protected void onMethodEnter() {
                super.onMethodEnter();
                mv.visitLdcInsn("owenli");
                mv.visitLdcInsn("test");
                mv.visitMethodInsn(INVOKESTATIC, "android/util/Log", "e", "(Ljava/lang/String;Ljava/lang/String;)I", false);
                mv.visitInsn(POP);
            }