
ASM进阶之旅
文章平均质量分 92
ASM进阶之旅
字节卷动
字节卷动 | CSDN博客专家
博客知识包括:Android、Flutter、Java、Kotlin、ASM、OpenGL、C++、Python、Shell、Jenkins、Gitlab、Git、SVN等相关进阶知识。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
【我的ASM学习进阶之旅】ASM 实现 Hook Lambda 和方法引用
ASM 实现 Hook Lambda 和方法引用 | 数据采集PS: 本文转载于:ASM 实现 Hook Lambda 和方法引用 | 数据采集1. 前言本文是前作「Lambda 设计参考」的实战部分,具体将介绍如何使用 ASM 对 Java 8 Lambda 表达式和方法引用进行 Hook 操作。在此之前会介绍一些基础概念和字节码相关的知识方便大家对这块内容的理解,最后会给出一个完整的代码供大家参考。2. 脱糖2.1. 概念介绍Java 脱糖(Desugar):简单地说,就是在编译阶段将语转载 2021-04-06 14:54:11 · 1268 阅读 · 0 评论 -
【我的ASM学习进阶之旅】基于ByteX开发的ASM插件的时候,如何让每一个ASM插件的transform都独立执行?
文章目录一、问题描述1.1 问题描述1.2 如何定位?1.3 ByteX的特点二、如何让每一个ASM插件的transform都独立执行?三、总结一、问题描述1.1 问题描述前面几篇文章,我基于ByteX练手写了几个ASM插件,如下所示:【我的ASM学习进阶之旅】 写一个基于ByteX开发的练手的ASM插件MethodInvokeAopPlugin,并使用该插件来插桩:给指定的类的指定的方法的前后插入AOP处理的指定类的指定方法【我的ASM学习进阶之旅】 写一个基于ByteX开发的练手的ASM插件原创 2021-03-17 15:40:22 · 909 阅读 · 0 评论 -
【我的ASM学习进阶之旅】 写一个基于ByteX开发的练手的ASM插件MethodInvokeAopPlugin,并使用该插件来插桩:给指定的类的指定的方法的前后插入AOP处理的指定类的指定方法
文章目录一、MethodInvokeAopPlugin插件介绍1.1 功能1.2 用法1.3 运行效果1.3.1 运行效果讲解1.3.2 实际运行效果分析1.3.2.1 源代码1.3.2.2 原始字节码1.3.2.3 使用MethodInvokeAopPlugin插件处理后的字节码二、MethodInvokeAopPlugin插件原理介绍2.1 基于ByteX来编写MethodInvokeAopPlugin插件2.2.1 插件配置2.2.1.1 属性文件:`src\main\resources\META-I原创 2021-03-10 20:24:40 · 1210 阅读 · 3 评论 -
【我的ASM学习进阶之旅】字节码插件平台 ByteX 源码解析|技术点评
转载自: Ant_way写的 【字节码插件平台 ByteX 源码解析|技术点评】文章目录1. ByteX 介绍2. 项目结构2.1 Plugins 应用层2.2 Common 层2.3 底层依赖3. Common 模块核心逻辑3.1 核心流程3.2 AbsPlugin.apply 方法3.3 Transform 机制的实现步骤 6:创建 ITransformPipeline 对象步骤 7:回调 Plugin.startExecute步骤 8: Plugin.registerTransformFlow步.转载 2021-03-08 19:46:15 · 1100 阅读 · 0 评论 -
【我的ASM学习进阶之旅】基于ByteX编写插件的时候,有时候插件不生效,如何排查?
一、问题描述在编写 【我的ASM学习进阶之旅】 写一个基于ByteX开发的练手的ASM插件AddTryCatchPlugin,并使用该插件来给指定的类的指定的方法,添加上tryCatch捕获异常然后丢给指定的处理类来处理这个插件的时候,编写完插件,发布之后,运行APP,发现该插件并未生效。然后也没有任何日志输出,完全无法定位到底哪里出了问题。然后查看ByteX的日志,发现没有这个插件的记录,如下所示:打开页面build\ByteX\ByteXForDebug\ByteX_report_ByteX.h原创 2021-03-04 20:12:01 · 931 阅读 · 1 评论 -
【我的ASM学习进阶之旅】 写一个基于ByteX开发的练手的ASM插件AddTryCatchPlugin,并使用该插件来给指定的类的指定的方法,添加上tryCatch捕获异常然后丢给指定的处理类来处理
文章【我的ASM学习进阶之旅】 如何基于ByteX快速上手,开发你自己的ASM插件?中介绍了如何基于ByteX快速上手,现在写一个基于ByteX开发的练手的ASM插件AddTryCatchPlugin,并使用该插件来给指定的类的指定的方法,添加上tryCatch捕获异常然后丢给指定的处理类来处理。一、AddTryCatchPlugin插件介绍1.1 功能给指定的类的指定的方法,添加上tryCatch捕获异常,并丢给指定的处理类来处理1.2 用法在项目的根目录下的 build.gradle 文件中原创 2021-03-04 16:10:14 · 1113 阅读 · 3 评论 -
【我的ASM学习进阶之旅】基于ByteX编写插件的时候,报错Class EncryptStringExtension is final.
一、问题描述今天将年前学的其他人写的插件:【我的ASM学习进阶之旅】 介绍基于ByteX开发的练手的ASM插件EncryptString并使用该插件对应用程序中的字符串值进行加密想移植到自己项目,自己重新写一遍,然后写完插件,发布到Maven之后。引入到APP项目的时候,报了如下所示的错误:Build file 'D:\Code\ByteXForXtcAsm\app\build.gradle' line: 8A problem occurred evaluating project ':app'.原创 2021-02-25 16:00:39 · 417 阅读 · 0 评论 -
【我的ASM学习进阶之旅】 介绍一个基于ByteX开发的练手的ASM插件ClickDebouncePlugin,并使用该插件来检测android应用中是否对view在指定时间内重复点击
文章【我的ASM学习进阶之旅】 如何基于ByteX快速上手,开发你自己的ASM插件?中介绍了如何基于ByteX快速上手,现在介绍一个基于ByteX开发的ASM插件ClickDebouncePlugin插件。一、ClickDebouncePlugin插件介绍1.1 功能ClickDebouncePlugin插件的功能是:处理Android的View在指定时间内重复点击的情况。1.2 用法在项目的根目录下的 build.gradle 文件中添加该插件的对应配置 classpath "net.mi原创 2021-02-04 16:17:22 · 1019 阅读 · 0 评论 -
【我的ASM学习进阶之旅】 介绍基于ByteX开发的练手的ASM插件EncryptString并使用该插件对应用程序中的字符串值进行加密
文章【我的ASM学习进阶之旅】 如何基于ByteX快速上手,开发你自己的ASM插件?中介绍了如何基于ByteX快速上手,现在介绍一个基于ByteX开发的ASM插件EncryptString插件。一、EncryptString插件介绍1.1 功能EncryptString插件的功能是:对应用程序中的字符串值进行加密。1.2 用法在项目的根目录下的 build.gradle 文件中添加该插件的对应配置classpath "net.mikaelzero.bytetea:encrypt-string原创 2021-02-04 11:10:41 · 710 阅读 · 0 评论 -
【我的ASM学习进阶之旅】 如何基于ByteX快速上手,开发你自己的ASM插件?
原文地址:https://github.com/bytedance/ByteX/blob/master/wiki/ByteX-Developer-API-zh.mdEnglish | 简体中文Quick Start 快速上手环境搭建首先把工程代码clone到本地,https://github.com/bytedance/ByteX,checkout一个feature分支做开发.ByteX的代码组织是一个module对应一个plugin,每个plugin的代码相互独立,相互隔离.因此,要开发一个新转载 2021-02-04 09:07:19 · 2548 阅读 · 0 评论 -
【我的ASM学习进阶之旅】 介绍一个基于gradle transform api和ASM的字节码插件平台ByteX
English | 简体中文ByteX(Infinite Possibilities)本工具由字节跳动抖音 Android 团队提供。ByteX是一个基于gradle transform api和ASM的字节码插件平台(或许,你可以把它当成一个有无限个插头的插座?)。目前集成了若干个字节码插件,每个插件完全独立,既可以脱离ByteX这个宿主而独立存在,又可以自动集成到宿主和其它插件一起整合为一个单独的Transform。插件和插件之间,宿主和插件之间的代码是完全解耦的(有点像组件化),这使得B转载 2021-02-04 09:00:45 · 1033 阅读 · 0 评论 -
【我的ASM学习进阶之旅】 10 ASM的Core API 的Method的字节码指令的示例讲解
上篇博客 【我的ASM学习进阶之旅】 09 介绍ASM的Core API 的Method的字节码指令https://ouyangpeng.blog.csdn.net/article/details/112574716我们将了字节码指令的基本概念,下面这篇博客我们来实际操作讲解一下字节码指令。一、示例讲解让我们看一些基本示例,以更具体地了解字节码指令的工作方式。1.1 Java示例类源码以下bean类:package pkg;public class Bean { private in原创 2021-01-13 20:58:16 · 402 阅读 · 0 评论 -
【我的ASM学习进阶之旅】 09 介绍ASM的Core API 的Method的字节码指令
一、字节码指令(Bytecode instructions)字节码指令由标识该指令的操作码和固定数量的参数组成:操作码(opcode)是一个无符号的字节值,因此是字节码名称,并由助记符标识。例如,操作码值0由助记符NOP设计,并且对应于不执行任何操作的指令。参数(arguments)是定义精确指令行为的静态值。它们在操作码之后给出。例如,操作码值为167的GOTO标签指令将自变量标签指定为要执行的下一条指令。指令参数不能与指令操作数混淆:参数值是静态已知的,并存储在编译的代码中,而操作数值来自操作原创 2021-01-13 17:42:37 · 477 阅读 · 0 评论 -
【我的ASM学习进阶之旅】 08 介绍ASM的Core API 的Methods的结构体
从本篇博客开始介绍如何使用核心ASM API生成和转换编译方法。首先介绍了已编译的方法,然后提供了许多说明性示例,介绍了相应的ASM接口,组件以及生成和转换它们的工具。一、结构体(Structure)在已编译的类中,方法的代码存储为一系列字节码指令。 为了生成和转换类,了解这些指令并理解其工作原理至关重要。 本节概述了这些说明,这些说明应足以开始对简单类生成器和转换器进行编码。 要获得完整的定义,您应该阅读Java虚拟机规范。1.1 执行模式 (Execution model)在呈现字节码指令之前原创 2021-01-13 16:43:28 · 655 阅读 · 0 评论 -
【我的ASM学习进阶之旅】 07 介绍ASM的Core API 的一些工具类
一、介绍如您在前几篇博客中所见,ASM API公开了Java类型,因为它们存储在已编译的类中,即作为内部名称或类型描述符。可以将它们公开显示在源代码中,以使代码更具可读性。但这需要在ClassReader和ClassWriter中的两种表示形式之间进行系统的转换,这会降低性能。这就是ASM不会将内部名称和类型描述符透明转换为等效的源代码形式的原因。但是,它提供了Type类,以便在必要时手动执行此操作。二、Type2.1 Type 对象Type对象表示Java类型,可以从类型描述符或从Class原创 2021-01-13 16:22:06 · 428 阅读 · 0 评论 -
【我的ASM学习进阶之旅】 06 使用ASM的Core API 的ClassReader、ClassWriter 、ClassVisitor 来转换class
一、 转换Class(Transforming classes )1.1 转换Class的小demo学习了前面几篇博客之后,到目前为止,单独使用了ClassReader和ClassWriter组件。这些事件是“手动”产生的,并由ClassWriter直接消耗,或者,对称地,它们是由ClassReader产生并“手动”消耗的,即通过自定义ClassVisitor实现。当这些组件一起使用时,事情开始变得非常有趣。第一步是将ClassReader产生的事件定向到ClassWriter。结果是由类编原创 2021-01-13 11:13:30 · 619 阅读 · 0 评论 -
【我的ASM学习进阶之旅】 05 使用ASM的Core API 的ClassVisitor 来生成class
一、使用ClassWriter生成Class生成Class的唯一必需组件是ClassWriter组件。 让我们以一个例子来说明这一点。 我们以下面的接口为例子:1.1 定义源代码定义一个接口Mesurablepublic interface Mesurable {}然后定义第二个接口Comparable继承自Mesurablepublic interface Comparable extends Mesurable { int LESS = -1; int EQUAL =原创 2021-01-12 18:04:44 · 409 阅读 · 0 评论 -
【我的ASM学习进阶之旅】 04 使用ASM的Core API 的ClassVisitor 来解析class
Parsing classes解析现有类的唯一必需组件是ClassReader组件。 让我们以一个例子来说明这一点。 假设我们要以类似于javap工具的方式打印类的内容。 第一步是编写ClassVisitor类的子类,以打印有关其访问的类的信息。 这是一个可能的,过于简化的实现:import org.objectweb.asm.*;import static org.objectweb.asm.Opcodes.ASM4;public class ClassPrinter extends Cl原创 2021-01-12 16:05:38 · 603 阅读 · 0 评论 -
【我的ASM学习进阶之旅】 03 ASM的Core API 的Classes的接口和组件介绍
一、介绍1.1 ClassVisitor抽象类用于生成和转换已编译类的ASM API基于ClassVisitor抽象类,如下所示:public abstract class ClassVisitor { public ClassVisitor(int api); public ClassVisitor(int api, ClassVisitor cv); public void visit(int version, int access, String name,原创 2021-01-12 11:23:08 · 531 阅读 · 0 评论 -
【我的ASM学习进阶之旅】 02 ASM的Core API 的Classes结构体介绍
本篇博客说明如何使用核心ASM API生成和转换已编译的Java类。 它首先介绍了已编译的类,然后提供了许多说明性示例,介绍了相应的ASM接口,组件和工具以生成和转换它们。0x01 结构体1.1 概述编译类的整体结构非常简单。 实际上,与本机编译的应用程序不同,编译的类保留结构信息和源代码中几乎所有的符号。 实际上是编译类包含:描述修饰符(例如公共或私有),名称,超类,接口和类的注释的部分。此类中每个字段声明的部分。 每个部分都描述字段的修饰符,名称,类型和注释。此类中声明的每个方法和构造函数原创 2021-01-07 20:36:14 · 485 阅读 · 0 评论 -
【我的Android进阶之旅】Android Studio 使用 ASM Bytecode Outline 插件来研究Java字节码
一、需求描述最近在研究滴滴公司开源的booster框架的源码,地址:https://github.com/didi/booster但是会有些以为,里面的代码是怎么写出来的? 有些代码确实有点看不懂,比如下面的https://github.com/didi/booster/blob/master/booster-transform-toast/src/main/kotlin/com/didi...原创 2019-09-05 21:07:05 · 6605 阅读 · 0 评论 -
【我的ASM学习进阶之旅】 01开篇介绍ASM
0x00、简介ASM名称不代表任何含义:它只是对C语言中__asm__关键字的引用,它允许使用汇编语言实现某些功能ASM是一个通用的Java字节码操作和分析框架。它可以直接以二进制形式用于修改现有类或动态生成类。ASM提供了一些常见的字节码转换和分析算法,可以从中构建定制的复杂转换和代码分析工具。ASM提供与其他Java字节码框架类似的功能,但侧重于性能。因为它的设计和实现是尽可能的小和尽可能快,所以它非常适合在动态系统中使用(但当然也可以以静态方式使用,例如在编译器中使用)。在许多项目中都原创 2021-01-07 19:56:34 · 812 阅读 · 0 评论