字节码插桩
文章平均质量分 87
本专栏主要讲解ASM框架,字节码解析等相关的字节码操作
一叶飘舟
目标赋予我们生命的意义和目的。有了目标,我们才会把注意力集中在追求喜悦,而不是在避免痛苦上。(急需找我,加微信:jdsjlzx)
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
AGP8.0 ASM 更简单灵活了
在之前《Gradle Transform + ASM 探索》一文中讨论了使用 AGP 提供的 Transform 接口自定义 Gradle 插件,通过 ASM 进行代码插桩。实现一些类似方法耗时统计,批量添加点击事件做埋点的功能。但是随着 AGP8.0 的到来,Transform 接口已经被废弃了,至于废弃的原因官方解释也是很官方了。说白了,就是不好用,传统的 Transform API 增加编译耗时。同时提供了更好用的 API 来规避一些编译时的问题。转载 2024-08-06 01:16:52 · 474 阅读 · 0 评论 -
Android Gradle8.0 Transform 废弃如何适配,手撸Arouter插件教你使用
最近公司也在适配项目至Android 14 否则市场不让上架,因此 gradle也必须适配升级了,就先来试试水。目前最新的AGP已经到8.3了,适配AGP8.0也要提上日程了,尤其是一些插件项目,因为8.0删除了transform API,所以需要提前做好适配工作。对于之前未了解过gradle自定义插件的同学可以看下我以前的7.0之前的gradle自定义插件的用法 教你如何一步步实现路由插件。Android 自定义Gradle插件,使用Transform。转载 2024-08-06 01:10:53 · 2424 阅读 · 0 评论 -
Gradle插件开发指南
编写一个插件Plugin其实挺简单的,只需要实现Plugin接口,并实现唯一apply方法即可。我们就直接写在@Overrideprintln("这是插件:${this.class.name}")这实际上是一个内联类。写完别忘了apply依赖上。第9行的apply方法是调用的PluginAware接口的apply()方法,参数是一个map,用来映射Plugin Id。sync输出:这是插件:YechaoaPlugin...在上一文。转载 2024-07-02 20:14:14 · 776 阅读 · 0 评论 -
通过反射和class文件asm字节码分析方法是get或者set方法
asm在解析文件的时候是按照特定顺序进行分析的,首先是visit方法,做类相关的解析,然后是注解,然后是属性,最后才是方法,属性是在所有方法分析前面进行,也就是只有当class文件中的所有属性都遍历完毕之后,才会去遍历方法:测试代码如下。1、反射获取类中的属性和方法,并判定方法是否是set或者get方法。原创 2024-06-28 09:28:16 · 393 阅读 · 0 评论 -
利用ASM和Javassist动态生成Class 类(set和get)
利用jvm的指令集直接构造class,简单的bean class 还是有应用场景的。在此利用ASM和Javassist各造例子以备忘!抽象类:SimpleJbean。原创 2024-06-28 00:08:37 · 462 阅读 · 0 评论 -
Asm动态生成类和get and set方法
asm在解析文件的时候是按照特定顺序进行分析的,首先是visit方法,做类相关的解析,然后是注解,然后是属性,最后才是方法,属性是在所有方法分析前面进行,也就是只有当class文件中的所有属性都遍历完毕之后,才会去遍历方法原创 2024-06-27 20:26:36 · 496 阅读 · 0 评论 -
ASM 在方法进入时候添加语句和方法退出的时候添加代码
在从 ClassReader 到 ClassVisitor 到ClassWriter的过程中, 由 ClassReader来触发各种visitXXX事件,在此过程中如果没有加入任何的ClassVisitor亦或是ClassVisitor只是trace等操作并没有在这个过程中做任何的拦截,那么最终调用的ClassWriter的visitXXX方法,此时将会把原来的class信息原封不动的写入。3 添加 常用Type类用来简化描述符以及internal name的书写。4 修改原始Student类并重命名。转载 2024-06-27 11:48:29 · 257 阅读 · 0 评论 -
ASM插桩——动态添加字段并生成get set 方法
【代码】ASM插桩 动态添加字段并生成get set 方法。原创 2024-06-27 11:23:24 · 416 阅读 · 0 评论 -
一起来学字节码插桩:ASM Tree API
ASM是一个通用的Java字节码操作和分析框架。它可用于修改现有类或直接以二进制形式动态生成类。ASM提供了一些常见的字节码转换和分析算法,可以根据这些算法构建定制的复杂转换和代码分析工具。ASM提供了与其他Java字节码框架类似的功能,但更关注性能。因为它的设计和实现尽可能的小和快,它非常适合在动态系统中使用(但当然也可以以静态的方式使用,例如在编译器中)。关于ASM更多介绍,可以参见ASM官网。ASM从组成结构上可以分成两部分,一部分为Core API,另一部分为Tree API。Core API包括。转载 2024-06-20 22:27:44 · 340 阅读 · 0 评论 -
使用ASM动态创建接口实现类
注意,使用ASM访问属性和方法的时候,会返回一个Visitor对象,如属性为FieldVisitor,方法为MethodVisitor。原创 2024-06-19 00:09:46 · 468 阅读 · 0 评论 -
使用ASM为一个类增加属性工具类
使用ASM可以方便的访问和修改一个类,或者在JVM载入前动态更新一个类也是可以的,如下,使用反编译工具查看生成的CLASS文件,即可看到动态添加的属性了。原创 2024-06-19 00:25:12 · 400 阅读 · 0 评论 -
使用ASM动态生成类的拦截代理类
【代码】使用ASM动态生成类的拦截代理类。原创 2024-06-19 00:15:28 · 447 阅读 · 0 评论 -
ASM之FieldVisitor创建变量
第一个参数是修饰类型,第二个参数是变量名,第三个是变量类型,第四个签名,第五个是变量的值(设置值好像没什么用,所以我在下面代码的初始化中重新初始化了str的值)原创 2024-06-18 23:49:31 · 749 阅读 · 0 评论 -
Android 编译插桩- APT 实战分析
可以看到经过 AspectJ 的字节码处理,它并不会直接把 Trace 函数直接插入到代码中,而是经过一系列自己的封装。如果想针对所有的函数都做插桩,AspectJ 会带来不少的性能影响。不过大部分情况,我们可能只会插桩某一小部分函数,这样 AspectJ 带来的性能影响就可以忽略不计了。从使用上来看,作为字节码处理元老,AspectJ 的框架也的确有自己的一些优势。成熟稳定。从字节码的格式和各种指令规则来看,字节码处理不是那么简单,如果处理出错,就会导致程序编译或者运行过程出问题。而 Aspect转载 2024-06-18 20:46:39 · 237 阅读 · 0 评论 -
Android 编译插桩深入了解
JavaPoet 是 square 推出的开源 java代码生成框架,提供 Java Api 生成 .java 源文件。这个框架功能非常有用,我们可以很方便的使用它根据注解、数据库模式、协议格式等来对应生成代码。通过这种自动化生成代码的方式,可以让我们用更加简洁优雅的方式要替代繁琐冗杂的重复工作。JavaPoet 原来还可以这样JavaPoet 编写过程为什么那么流畅,原来 Java 文件也可以用编程的方式生成JavaPoet 可不可以改进我的编码流程,提升效率。转载 2024-06-18 20:34:59 · 188 阅读 · 0 评论 -
Android 编译插桩入门
随着 Android 开发的发展,越来越多场景需要用到编译插桩了。日常开发中我们肯定也都接触过编译插桩,只是没有去深入挖掘它的实现原理,比如 ButterKnife、无痕埋点等,所以学习编译插桩不仅可以提升我们的竞争力,还可以让我们在开发中开拓视野、更好地解决问题。现在让我们一起学习一些编译插桩的基础来入门。不管是在 Java 后端开发还是 Android 开发,Java 注解都有很广泛的运用。转载 2024-06-18 20:16:52 · 275 阅读 · 0 评论 -
利用ASM完成第三方SDK安全整改
这篇文章用了Composing build的方式编写了gradle的插件,并使用gradle7.x的AsmClassVisitorFactory来对项目及SDK的代码进行整改,学习了!转载 2024-06-17 15:57:01 · 361 阅读 · 0 评论 -
ASM字节码插桩之Transform的替代方案
最近在学习asm字节码插桩相关的知识,发现在高版本的gradle上以前的Transform已经废弃,于是研究了一下新版本字节码插桩的实现,本文将简单地介绍下新版本gradle上字节码插桩的实现。转载 2024-06-17 15:37:05 · 733 阅读 · 0 评论 -
APM框架Matrix源码用到的字节码插桩
traceMethodFromSrc和traceMethodFromJar分别对src和jar插桩,以traceMethodFromSrc为例,会在子线程中执行。: 将方法信息封装成TraceMethod,把需要插桩和不需要插桩(过滤黑名单、空方法、get/set等简单方法)的方法存入两个map。CollectSrcTask和CollectJarTask逻辑相同,一个处理class,一个处理jar,使用了ASM。解析得到类、方法在混淆前和混淆后的映射关系,保存在MappingCollector中。转载 2024-06-17 14:51:40 · 324 阅读 · 0 评论 -
组件化框架 ARouter 完全解析(三)AGP/Transform/ASM—动态代码注入
本篇内容较多,前半部分都是在介绍铺垫知识,只有完全理解了才能掌握ARouter框架的核心。其中Gradle、AGP是Android开发中必定使用到的技术点,希望通过对ARouter的学习能更加深刻的理解Android编译构建的过程,以及使用Gradle插件能完成哪些事情。Transform是官方Gradle 插件中提供的API,它能获取和处理被打进dex文件之前的class文件。不过Transform在最新的Gradle插件版本中被废弃了,不过这不影响我们我们对它的学习。转载 2024-06-15 13:14:03 · 374 阅读 · 0 评论 -
Android实现无痕埋点具体实现-采用代码插桩的方式
a.gradle插件话埋点无需要手动埋点,采用字节码埋点,大大减少手动埋点的工作量;b.gradle插件话埋点不需要哦后期查补埋点;c.一些业务数据需要手动埋点;d.旧的页面项目升级时页面结构发生变化可能导致View的唯一路径发生变化,后台需要重新为此View命名;转载 2024-06-15 01:10:07 · 505 阅读 · 0 评论 -
Android 编译插桩操纵字节码
Transform 可以被看作是 Gradle 在编译项目时的一个 task,在 .class 文件转换成 .dex 的流程中会执行这些 task,对所有的 .class 文件(可包括第三方库的 .class)进行转换,转换的逻辑定义在 Transform 的 transform 方法中。从图中可以看出,Gradle 编译时多了一个我们自定义的 LifeCycleTransform 类型的任务,并且将所有 .class 文件名打印出来,其中包含了我们需要的目标文件 MainActivity.class。原创 2024-06-15 00:55:06 · 1275 阅读 · 0 评论 -
ASM 框架:字节码操作的常见用法(生成类,修改类,方法插桩,方法注入)
ASM是一款读写Java字节码的工具,可以达到跳过源码编写,编译,直接以字节码的形式创建类,修改已经存在类(或者jar中的class)的属性,方法等。通常用来开发一些Java开发的辅助框架,其做法是在你编写的Java代码中注入一些特定代码(俗称字节码插装)达到特定目的,以Android开发为例最常用的方法通过字节码插装实现热修复,事件监听,埋点,开源框架等非常规操作,当然在Android开发中通常辅以Gradle插件一起使用,这个改天在写。原创 2024-06-15 00:44:28 · 1864 阅读 · 0 评论 -
ASM字节码操纵框架实现AOP
在该类中基本涵盖了各种JVM虚拟机的字节码指令以及操作码常量,后面的所有方法的执行,均需要调用该类中的字节码指令属性。在ASMified中可以清晰的发现,众多JVM虚拟机的指令集,如果还不清楚什么意思,建议复习一下哦。是目前我了解到的面试题或者笔试题中会经常出现的,不晓得咖啡BABE你是不是已经了如指掌了呢?我们对原始的Test01.java做下修改,引入MyTimeLogger中的方法。补充:其实在这里就可以看到,程序在编译期时,JDK已经做了相应的JVM优化。UP主你这也太拉了吧,真TM无情啊。原创 2024-06-15 00:31:21 · 817 阅读 · 0 评论 -
ASM字节码插桩解决国内隐私问题
对于大家自己项目内部的代码来说,可以自己手动改掉,但是对于一些用到的第三方库就束手无策了,也许这些库有隐私版本的更新,但是对大家来说,可能版本差距太大,项目改动会比较多,当公司老项目比较多时,这种修改方案就耗费时间太久了。方法获取 mac 地址,将每个地方这样的调用都替换成调用我们自己的方法,然后再在我们自定义方法里编写逻辑,比如隐私同意前给一个空值,隐私同意后再调用。在上面第3-4步的过程中,如果我们对.class 文件使用 ASM 进行处理就可以做到对任意 .class文件的修改,如下图。转载 2024-06-15 00:04:15 · 266 阅读 · 0 评论 -
Android 进阶——代码插桩必知必会&ASM7字节码操作
ASM 是一个Java 字节码(.class)操控框架,它可以用来动态生成类的字节码或者改变现有类的字节码。借由ASM可以直接创建或修改字节码文件,也就能在类被加载到JVM执行之前动态改变原有的类行为。其目的是生成、转换和分析以字节数组来表示的已编译 Java 类。因为无论是在磁盘的存储形式还是JVM的加载皆采用这种字节数组形式,Java 字节码文件按照Java 虚拟机规范中的格式进行组织并存储。原创 2024-06-14 23:56:53 · 586 阅读 · 0 评论 -
ASM 修复案例之 FCM OOM
使用ASM修复一些临时问题还是比较香的,体现了AOP的思想。比如慢函数检测,无侵入式埋点等等都可以使用ASM处理,后续有空可以补充这些内容。总的来说团队修复问题速度还是蛮快的!转载 2024-06-14 15:37:46 · 134 阅读 · 0 评论 -
AGP8.0 ASM 更简单灵活了
在之前《Gradle Transform + ASM 探索》一文中讨论了使用 AGP 提供的 Transform 接口自定义 Gradle 插件,通过 ASM 进行代码插桩。实现一些类似方法耗时统计,批量添加点击事件做埋点的功能。但是随着 AGP8.0 的到来,Transform 接口已经被废弃了,至于废弃的原因官方解释也是很官方了。说白了,就是不好用,传统的 Transform API 增加编译耗时。同时提供了更好用的 API 来规避一些编译时的问题。转载 2024-06-14 14:46:27 · 589 阅读 · 0 评论 -
使用ASM创建ClassVisitor时遇到IllegalArgumentException的一种可能解决办法
raft-java本身使用了5.2版本的asm,而我们的插装代码则使用了9.1版本的asm并在创建RaftDownClassVisitor和RaftDownMethodVisitor时将asm版本指定成了9.(上面的visitMethod方法意思为当程序执行到ServerMain类的函数时,其返回的函数会是我们的RaftDownMethodVisitor提供的修改过的函数。使用ASM时一个非常大的问题在于我们往往需要将自己的少量逻辑插入到复杂的目标系统中进行测试,而我们对目标系统却没有很深的理解。转载 2024-06-13 23:54:11 · 203 阅读 · 0 评论 -
ASM字节码插桩实现点击防抖
在点击事件onclick的时候,将view的onclick在给定的时间给拦截掉。以前我们可能都是用一个util来拦截,这样在每个点击事件都得去判断,那么这里就用字节码插桩的形式来实现一下。原创 2024-06-13 19:20:58 · 1095 阅读 · 0 评论 -
Gradle插件 扫描class文件,使用Asm完成字节码插桩功能
1.其实主要看 transform 方法 ,在该方法中我们可以扫描所有javac编译后生成的class文件。2.主要分为两个循环,一个是当前模块下的内容,一个是它所依赖的所有模块文件,或jar包等 3.根据匹配规则,找寻我们需要被插桩使用的class文件。转载 2024-06-13 19:18:10 · 339 阅读 · 0 评论 -
字节码插桩实战(Gradle + ASM)—— 自动埋点
具体的顺序是。转载 2024-06-13 19:11:09 · 507 阅读 · 0 评论 -
字节码插桩实战——优雅的打印方法执行时间
做项目优化时,我们通常会先打印出方法的执行时间,再根据方法的耗时情况对其进行优化。//...System.out.println("程序运行时间: " + (endTime - startTime) + "ms");如果是一两个方法我们手动插入代码没有问题,但是整个项目的方法何其多,都要我们手动去插入的话,估计能把C、V两键扣废掉。那么有没有一种优雅的方式实现耗时打印呢?当然有的,这就是今天要介绍的主角ASM(字节码插桩)。有同学到这里可能就会问,我不会写ASM代码该怎么办呢?转载 2024-06-13 17:46:17 · 401 阅读 · 0 评论 -
Android 字节码插桩技术实现卡顿监控
字节码插桩早已不是什么新鲜的技术了,但时至今日仍然在广泛应用。它能鬼使神差一般改变我们的代码,实现一些功能让我们看不见摸不着。像Arouter、Hilt、Tinker、Matrix这些框架都在使用这项技术。字节码插桩是字节码编程的一个应用,这里主要是使用字节码编程技术。字节码编程能解决很多问题,比如自动生成class,自动修改字节码,自动添加日志代码,自动插入代码实现卡顿监控。笔者通过字节码插桩技术实现自动统计方法耗时,实现UI卡顿监控,通过这个案例了解字节码插桩的全过程。转载 2024-06-13 17:36:02 · 228 阅读 · 0 评论 -
Android编译期插桩,让程序自己写代码
Element是一种在编译期描述.java文件静态结构的一种类型,它可能表示一个package、一个class、一个method或者一个field。Element的比较应该使用equals,因为编译期间同一个Element可能会用两个对象表示。JDK提供了以下5种Element。十分简单,直接上代码通过上述分析,我们可以清楚的感知到AspectJ提供了非常强大的功能。转载 2024-06-13 17:28:28 · 353 阅读 · 0 评论 -
Android 使用APT+字节码插桩优化代码设计
在 BusinessLayer、BusinessCn、BusinessExp 中的各个 build.gradle 中都依赖 annotation 和 compile 两个 module@Register最后我们运行下代码,就能自动生成 CardManager 相关的代码,它在 build/generated/source/apt 目录下。我们来看下 BusinessLayer 的目录:其他 module 中也会生成类似的此文件,这里就不一一展示了。转载 2024-06-13 16:13:59 · 155 阅读 · 0 评论 -
TransformAPI + ASM实现自动插桩
它里边有一个accept这样一个api,通过里边的ClassVisitor,可以用来访问类,访问方法,访问注解,或者操作他们。其中,transform是固定的;整体结构就是,通过注解标记哪些方法需要插桩,完成插桩代码编写之后,通过Transform遍历class插桩代码插入到class文件中。这也是需要的,因为我们改完之后的代码需要被加载进入dex文件才能正常运行,实现编译时修改代码的能力。我们在进行插桩的时候,需要对照表,System是一个对象,因此需要在最前边加上L, ()J表示一个方法的签名标识。转载 2024-06-13 11:33:49 · 221 阅读 · 0 评论 -
反射埋点方案: 全局点击埋点代理OnClickListener SDK 编写
ASM是一个通用的 Java 字节码操作和分析框架。它可用于直接以二进制形式修改现有类或动态生成类。ASM 提供了一些常见的字节码转换和分析算法,可以从中构建自定义的复杂转换和代码分析工具。ASM 提供与其他 Java 字节码框架类似的功能,但重点关注性能。因为它的设计和实现尽可能小且尽可能快,所以它非常适合在动态系统中使用(但当然也可以以静态方式使用,例如在编译器中)。// 创建一个ClassWriter,用于生成字节码// 定义类的头部信息// 生成默认构造函数。原创 2024-06-13 11:24:18 · 851 阅读 · 0 评论 -
写个代码扫描插件,再也不怕 log4j 等问题
Java ASM(Java Bytecode Assembler)是一个用于生成和修改Java字节码的库。ASM提供了一种灵活而强大的方式来分析、转换和生成Java类文件。使用ASM,我们可以在不改变源代码的情况下,通过操纵字节码来实现对代码的定制化需求。这种能力在许多领域中都有应用,包括编译器代码优化字节码工具AOP(面向切面编程)框架等。本篇到这里就结束了,严格而言,本篇其实算不上什么ASM高深技巧,只能算的上是基础操作。更多是希望,通过本篇,能使得新手同学对于ASM基础使用有一个了解,特别是在。原创 2024-06-13 10:52:43 · 1107 阅读 · 0 评论 -
字节码学习之常见java语句的底层原理
本章我们学以致用,聊一下我们常见的一些java语句的特性底层是如何实现。原创 2024-06-12 23:48:19 · 839 阅读 · 0 评论
分享