| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 移动开发 -> asm实现注解打印log -> 正文阅读 |
|
[移动开发]asm实现注解打印log |
前言在Android开发中有时候调试问题要给方法加很多的log,很麻烦,所以结合asm用注解的方式来自动在方法中插入log,这样方便开发时候调试。当然通过asm插入的log应该需要包含方法的参数,方法的返回值,有时候也需要获取对象里面的变量值等。 hanno
通过字节码插件实现注解打印log,注解可以加在类上面,也可以加在方法上面,当加在类上面时会打印全部方法的log,当加在方法上面时打印当前方法的log 使用方法1、类中全部方法打印log
只要在类上面加上@HannoLog注解就可以在编译的时候给这个类中所有的方法插入log,运行时输出log。 2、给类中的某些方法加log
通过在方法上面添加注解可以在当前方法中插入log。
其中method是当前方法名,params是方法的参数名和值,time方法的执行时间,fields是当前对象的fields值,thread当前方法执行的线程。 HannoLog参数解释可以通过level来设置log的级别,level的设置可以调用Log里面的INFO,DEBUG,ERROR等。enableTime用来设置是否打印方法执行的时间,默认是false,如果要打印设置enableTime=true. 1、level控制log打印的等级,默认是log.d,可以通过@HannoLog(level = Log.INFO)来设置等级,支持Log.DEBUG,Log.ERROR等。 2、enableTime控制是否输出方法的执行时间,默认是false,如果要打印可以通过@HannoLog(enableTime=true)来设置。 3、tagName设置tag的名称,默认是当前类名,也可以通过 @HannoLog(tagName = “test”)来设置。 4、watchField用于观察对象中的field值,通过@HannoLog(watchField = true)设置,由于静态方法中不能调用非静态的field所以这个参数在静态方法上统一不生效。 重要的类1、HannoLog
2、HannoExtension
HannoExtension提供gradle.build文件是否开启plugin 和打印执行plugin的log
实现原理hanno是通过asm字节码插桩方式来实现的。Android项目的编译过程如下图: 第一步,将.class文件拆分成多个部分; 第二步,对某一个部分的信息进行修改; 第三步,将多个部分重新组织成一个新的.class文件。 ClassFile.class文件中,存储的是ByteCode数据。但是,这些ByteCode数据并不是杂乱无章的,而是遵循一定的数据结构。
字节码的类库和ClassFile之间关系 asm的组成从组成结构上来说,ASM分成两部分,一部分为Core API,另一部分为Tree API。
asm中重要的类
ClassVisitor类ClassVisitor是一个抽象类,实现类有ClassWriter类(Core API)和ClassNode类(Tree API)。
classVisitor的方法 visit()、visitField()、visitMethod()和visitEnd()。 visitXxx()方法与ClassFile
2、visitField()方法
3、visitMethod()方法 ClassWriter类ClassWriter的父类是ClassVisitor,因此ClassWriter类继承了visit()、visitField()、visitMethod()和visitEnd()等方法。
Hanno源码分析上面已经先回顾一下asm相关的基础知识,下面对hanno源码进行分析。主要针对三个方面: 1、如何在方法中插入Log语句。 2、如何获取对象中的field值。 3、如何获取到方法的参数名和参数值,在使用classvisitor的时候visitLocalVariable之后是无法插入代码的,如何解决这个问题?来使得获取的方法的变量名能够插入到Log中。 源码地址https://github.com/hankinghu/hanno 后续优化1、可以针对某个模块进行配置,对模块配置后会自动给模块中所有的类的全部方法插入log。 |
|
移动开发 最新文章 |
Vue3装载axios和element-ui |
android adb cmd |
【xcode】Xcode常用快捷键与技巧 |
Android开发中的线程池使用 |
Java 和 Android 的 Base64 |
Android 测试文字编码格式 |
微信小程序支付 |
安卓权限记录 |
知乎之自动养号 |
【Android Jetpack】DataStore |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 6:25:02- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |