Android Studio通过ASM Bytecode Outline插件生成ASM插桩代码

(1)在Android Studio中安装ASM Bytecode Outline插件

(2)安装后,在Android Studio中,选中代码行,点击右键,选择Show Bytecode outLine

(3)在ASM标签中选择ASMified,即可在右侧看到当前类对应的ASM代码(可以忽略Label相关的代码)

原始代码:

Log.i("yezhou", this.getClass().getName() + ": onCreate");

相关代码:

Label l2 = new Label();
mv.visitLabel(l2);
mv.visitLineNumber(15, l2);
mv.visitLdcInsn("yezhou");
mv.visitTypeInsn(NEW, "java/lang/StringBuilder");
mv.visitInsn(DUP);
mv.visitMethodInsn(INVOKESPECIAL, "java/lang/StringBuilder", "<init>", "()V", false);
mv.visitVarInsn(ALOAD, 0);
mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Object", "getClass", "()Ljava/lang/Class;", false);
mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Class", "getName", "()Ljava/lang/String;", false);
mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;", false);
mv.visitLdcInsn(": onCreate");
mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;", false);
mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "toString", "()Ljava/lang/String;", false);
mv.visitMethodInsn(INVOKESTATIC, "android/util/Log", "i", "(Ljava/lang/String;Ljava/lang/String;)I", false);
mv.visitInsn(POP);

有效代码:

mv.visitLdcInsn("yezhou");
mv.visitTypeInsn(NEW, "java/lang/StringBuilder");
mv.visitInsn(DUP);
mv.visitMethodInsn(INVOKESPECIAL, "java/lang/StringBuilder", "<init>", "()V", false);
mv.visitVarInsn(ALOAD, 0);
mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Object", "getClass", "()Ljava/lang/Class;", false);
mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Class", "getName", "()Ljava/lang/String;", false);
mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;", false);
mv.visitLdcInsn(": onCreate");
mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;", false);
mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "toString", "()Ljava/lang/String;", false);
mv.visitMethodInsn(INVOKESTATIC, "android/util/Log", "i", "(Ljava/lang/String;Ljava/lang/String;)I", false);
mv.visitInsn(POP);
上一篇 Android Gradle Plugin打包Apk过程中的Transform API
下一篇 Android字节码插桩实现(Gradle + ASM)
目录
文章列表
1 MySQL JOIN连接的使用
MySQL JOIN连接的使用
2
Flutter事件交互和State管理
Flutter事件交互和State管理
3
为什么 SQL 语句不要过多的 join?
为什么 SQL 语句不要过多的 join?
4
微信JS-SDK使用步骤
微信JS-SDK使用步骤
5
Spring Boot中application.yml及application.properties常用配置
Spring Boot中application.yml及application.properties常用配置
最新评论
一位WordPress评论者
一位WordPress评论者
2月12日
您好,这是一条评论。若需要审核、编辑或删除评论,请访问仪表盘的评论界面。评论者头像来自 Gravatar。