Android 利用asm 监控方法耗时

时间: 2023-12-05 16:58:06 浏览: 30
Android利用ASM(字节码操作框架)监控方法耗时的步骤如下: 1. 添加ASM依赖库 在build.gradle文件中添加ASM依赖库: ```gradle dependencies { implementation 'org.ow2.asm:asm:9.1' } ``` 2. 编写ASM代码 使用ASM编写一个ClassVisitor,用于修改字节码,在方法的开头和结尾插入计时代码: ```java public class TimeClassVisitor extends ClassVisitor { public TimeClassVisitor(int api, ClassVisitor cv) { super(api, cv); } @Override public MethodVisitor visitMethod(int access, String name, String descriptor, String signature, String[] exceptions) { MethodVisitor mv = super.visitMethod(access, name, descriptor, signature, exceptions); if (!name.equals("<init>") && !name.equals("<clinit>")) { mv = new TimeMethodVisitor(api, mv, access, name, descriptor); } return mv; } static class TimeMethodVisitor extends MethodVisitor { private final String mName; private final String mDesc; private final Label mStartLabel = new Label(); private final Label mEndLabel = new Label(); public TimeMethodVisitor(int api, MethodVisitor mv, int access, String name, String desc) { super(api, mv); mName = name; mDesc = desc; } @Override public void visitCode() { super.visitCode(); mv.visitLabel(mStartLabel); mv.visitMethodInsn(INVOKESTATIC, "java/lang/System", "nanoTime", "()J", false); mv.visitFieldInsn(PUTSTATIC, "com/example/MyClass", "sStartTime", "J"); } @Override public void visitInsn(int opcode) { if ((opcode >= IRETURN && opcode <= RETURN) || opcode == ATHROW) { mv.visitLabel(mEndLabel); mv.visitMethodInsn(INVOKESTATIC, "java/lang/System", "nanoTime", "()J", false); mv.visitFieldInsn(GETSTATIC, "com/example/MyClass", "sStartTime", "J"); mv.visitInsn(LSUB); mv.visitFieldInsn(PUTSTATIC, "com/example/MyClass", "sStartTime", "J"); } super.visitInsn(opcode); } @Override public void visitMaxs(int maxStack, int maxLocals) { mv.visitMaxs(maxStack + 4, maxLocals); } } } ``` 3. 在应用中使用ASM代码 在应用中调用ASM代码,在Activity的onCreate方法中插入以下代码: ```java try { ClassReader cr = new ClassReader(getClass().getName()); ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS); TimeClassVisitor tcv = new TimeClassVisitor(Opcodes.ASM7, cw); cr.accept(tcv, ClassReader.EXPAND_FRAMES); byte[] code = cw.toByteArray(); Class<?> clazz = defineClass(getClass().getName(), code, 0, code.length); clazz.newInstance(); } catch (Exception e) { e.printStackTrace(); } ``` 以上代码将读取当前Activity的字节码,使用TimeClassVisitor修改字节码,然后重新定义类并实例化,以便在方法中添加计时代码。 4. 打印方法耗时 在Activity的onDestroy方法中打印方法耗时: ```java Log.i("Time", "onCreate: " + (sStartTime / 1000000f) + "ms"); ``` 以上代码将打印onCreate方法的耗时,单位为毫秒。 通过以上步骤,就可以使用ASM监控方法耗时了。需要注意的是,ASM会修改字节码,可能会导致应用崩溃或出现其他问题,所以需要谨慎使用。

相关推荐

最新推荐

recommend-type

ASM1153E Datasheet

ASM1153E 的Datasheet,用于USB3.0到SATA的桥接,制作移动硬盘盒的资料
recommend-type

使用NFS作为ASM磁盘组搭建RAC.docx

使用NFS搭建Oracle RAC集群,基于Linux 7, 并启用了Direct NFS
recommend-type

RHEL 7环境下19c RAC安装之udev规则配置ASM共享存储.docx

RHEL 7环境下19c RAC安装之udev规则配置ASM共享存储 RHEL 7环境下19c RAC安装之udev规则配置ASM共享存储 RHEL 7环境下19c RAC安装之udev规则配置ASM共享存储
recommend-type

RAC_Oracle11g_asm_grid_openfile 搭建集群环境

本文主要利用openfile实现共享磁盘,利用asm进行磁盘管理,利用grid进行集群管理,利用oracle实现数据库管理
recommend-type

Oracle-11g-R2-RAC-with-ASM存储迁移-手记.docx

本文详细介绍如何讲oracle rac的数据库数据进行迁移备份,配有图文,适合做做实验在再去实践
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

list根据id查询pid 然后依次获取到所有的子节点数据

可以使用递归的方式来实现根据id查询pid并获取所有子节点数据。具体实现可以参考以下代码: ``` def get_children_nodes(nodes, parent_id): children = [] for node in nodes: if node['pid'] == parent_id: node['children'] = get_children_nodes(nodes, node['id']) children.append(node) return children # 测试数
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。