CN110597515A - 一种字节码插桩方法 - Google Patents

一种字节码插桩方法 Download PDF

Info

Publication number
CN110597515A
CN110597515A CN201910794489.7A CN201910794489A CN110597515A CN 110597515 A CN110597515 A CN 110597515A CN 201910794489 A CN201910794489 A CN 201910794489A CN 110597515 A CN110597515 A CN 110597515A
Authority
CN
China
Prior art keywords
class
file
interface
bytecode
java
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
CN201910794489.7A
Other languages
English (en)
Inventor
张福军
陆昕
鲍碧波
蒋如超
李祥兵
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Green Man Technology Co Ltd
Original Assignee
Green Man Technology Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Green Man Technology Co Ltd filed Critical Green Man Technology Co Ltd
Priority to CN201910794489.7A priority Critical patent/CN110597515A/zh
Publication of CN110597515A publication Critical patent/CN110597515A/zh
Pending legal-status Critical Current

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/30Monitoring
    • G06F11/3051Monitoring arrangements for monitoring the configuration of the computing system or of the computing system component, e.g. monitoring the presence of processing resources, peripherals, I/O links, software programs
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Computing Systems (AREA)
  • Quality & Reliability (AREA)
  • Software Systems (AREA)
  • Stored Programmes (AREA)
  • Devices For Executing Special Programs (AREA)
  • Debugging And Monitoring (AREA)

Abstract

本发明涉及字节码插桩技术领域,尤其是一种字节码插桩方法,其步骤为:(1)通过ASM生成ClassVisitor接口;(2)在字节码内生成toByteArray()函数;(3)返回生成的字节码的字节流;(4)将字节流写回文件生成调整后的class文件,本发明针对特定规则进行字节码修改从而达到监控每个方法耗时的目的。

Description

一种字节码插桩方法
技术领域
本发明涉及字节码插桩技术领域,具体领域为一种字节码插桩方法。
背景技术
软件开发人员熟悉的ButterKnife,Dagger这些常用的框架,也是在编译期间生成了代码,简化了程序员的操作。但是在完成大量重复性代码开发时,需要浪费大量工作时间和劳动成本。
发明内容
本发明的目的在于提供一种字节码插桩方法,以解决现有技术中监控的方法达到百千甚至万级别时,无法通过简单编码进行有效处理的问题。
为实现上述目的,本发明提供如下技术方案:一种字节码插桩方法,其步骤为:
(1)通过ASM生成ClassVisitor接口;
(2)在字节码内生成toByteArray()函数;
(3)返回生成的字节码的字节流;
(4)将字节流写回文件生成调整后的class文件。
class文件为Java类框架文件。
Java类文件是8位字节的二进制流,数据项按顺序存储在class文件中,相邻的项之间没有间隔。
4.根据权利要求3所述的一种字节码插桩方法,其特征在于:Java类文件的项包括有Magic、Version、Constant Pool、Access_flag、This Class、Super Class、Interfaces、Fields、Methods、Class attributes。
Magic用于存放一个Java类文件的魔数和版本信息,
Version用于存放Java类文件的版本信息。
Constant Pool用于存放类中各种文字字符串、类名、方法名和接口名称、final变量以及对外部类的引用信息,
Access_flag用于指明文件中定义的是类后者接口,同时指名类或接口的访问标志。
This Class用于指向表示该类全限定名称的字符串常量的指针,
Super Class用于指向表示父类全限定名称的字符串常量的指针,
Interfaces为一个指针数组,存放了该类或父类实现的所有接口名称的字符串常量的指针。
Fields用于对类或接口中声明的字段进行细致的描述,
Methods同于对类或接口中声明的方法进行细致的描述,
Class attributes用于存放在该文件中类或接口所定义的属性的基本信息。
与现有技术相比,本发明的有益效果是:通过ASM能够改造既有类,直接生成需要的代码。增强的代码是硬编码在新生成的类文件内部的,没有反射带来性能上的付出,通过插桩,扫描每一个class文件,并针对特定规则进行字节码修改从而达到监控每个方法耗时的目的。
附图说明
图1为本发明的class文件改写流程;
图2为本发明的Java类文件的内部结构图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
请参阅图1,本发明提供一种技术方案:一种字节码插桩方法,其特征在于:其步骤为:
(1)通过ASM生成ClassVisitor接口;
(2)在字节码内生成toByteArray()函数;
(3)返回生成的字节码的字节流;
(4)将字节流写回文件生成调整后的class文件。
class文件为Java类框架文件。
Java类文件是8位字节的二进制流,数据项按顺序存储在class文件中,相邻的项之间没有间隔。
如图2所示,Java类文件的项包括有Magic、Version、Constant Pool、Access_flag、This Class、Super Class、Interfaces、Fields、Methods、Class attributes。
Magic用于存放一个Java类文件的魔数和版本信息,
Version用于存放Java类文件的版本信息。
Constant Pool用于存放类中各种文字字符串、类名、方法名和接口名称、final变量以及对外部类的引用信息,
Access_flag用于指明文件中定义的是类后者接口,同时指名类或接口的访问标志。
This Class用于指向表示该类全限定名称的字符串常量的指针,
Super Class用于指向表示父类全限定名称的字符串常量的指针,
Interfaces为一个指针数组,存放了该类或父类实现的所有接口名称的字符串常量的指针。
Fields用于对类或接口中声明的字段进行细致的描述,
Methods同于对类或接口中声明的方法进行细致的描述,
Class attributes用于存放在该文件中类或接口所定义的属性的基本信息。
通过本技术方案,ASM能够通过改造既有类,直接生成需要的代码。增强的代码是硬编码在新生成的类文件内部的,没有反射带来性能上的付出。同时,ASM与Proxy编程不同,不需要为增强代码而新定义一个接口,生成的代码可以覆盖原来的类,或者是原始类的子类。它是一个普通的Java类而不是proxy类,甚至可以在应用程序的类框架中拥有自己的位置,派生自己的子类。
相比于其他流行的Java字节码操纵工具,ASM更小更快。ASM具有类似于BCEL或者SERP的功能,而只有33k大小,而后者分别有350k和150k。同时,同样类转换的负载,如果ASM是60%的话,BCEL需要700%,而SERP需要1100%或者更多。
Java类文件是8位字节的二进制流。数据项按顺序存储在class文件中,相邻的项之间没有间隔,这使得class文件变得紧凑,减少存储空间。在Java类文件中包含了许多大小不同的项,由于每一项的结构都有严格规定,这使得class文件能够从头到尾被顺利地解析。
如图2所示,一个Java类文件大致可以归为10个项:
Magic:该项存放了一个Java类文件的魔数(magic number)和版本信息。一个Java类文件的前4个字节被称为它的魔数。每个正确的Java类文件都是以0xCAFEBABE开头的,这样保证了Java虚拟机能很轻松的分辨出Java文件和非Java文件。
Version:该项存放了Java类文件的版本信息,它对于一个Java文件具有重要的意义。因为Java技术一直在发展,所以类文件的格式也处在不断变化之中。类文件的版本信息让虚拟机知道如何去读取并处理该类文件。
Constant Pool:该项存放了类中各种文字字符串、类名、方法名和接口名称、final变量以及对外部类的引用信息等常量。虚拟机必须为每一个被装载的类维护一个常量池,常量池中存储了相应类型所用到的所有类型、字段和方法的符号引用,因此它在Java的动态链接中起到了核心的作用。常量池的大小平均占到了整个类大小的60%左右。
Access_flag:该项指明了该文件中定义的是类还是接口(一个class文件中只能有一个类或接口),同时还指名了类或接口的访问标志,如public,private,abstract等信息。
This Class:指向表示该类全限定名称的字符串常量的指针。
Super Class:指向表示父类全限定名称的字符串常量的指针。
Interfaces:一个指针数组,存放了该类或父类实现的所有接口名称的字符串常量的指针。以上三项所指向的常量,特别是前两项,在我们用ASM从已有类派生新类时一般需要修改:将类名称改为子类名称;将父类改为派生前的类名称;如果有必要,增加新的实现接口。
Fields:该项对类或接口中声明的字段进行了细致的描述。需要注意的是,fields列表中仅列出了本类或接口中的字段,并不包括从超类和父接口继承而来的字段。
Methods:该项对类或接口中声明的方法进行了细致的描述。例如方法的名称、参数和返回值类型等。需要注意的是,methods列表里仅存放了本类或本接口中的方法,并不包括从超类和父接口继承而来的方法。使用ASM进行AOP编程,通常是通过调整Method中的指令来实现的。
Class attributes:该项存放了在该文件中类或接口所定义的属性的基本信息。
ASM的最终的目的是生成可以被正常装载的class文件,因此其框架结构为客户提供了一个生成字节码的工具类——ClassWriter。它实现了ClassVisitor接口,而且含有一个toByteArray()函数,返回生成的字节码的字节流,将字节流写回文件即可生产调整后的class文件。一般它都作为职责链的终点,把所有visit事件的先后调用(时间上的先后),最终转换成字节码的位置的调整(空间上的前后)。
尽管已经示出和描述了本发明的实施例,对于本领域的普通技术人员而言,可以理解在不脱离本发明的原理和精神的情况下可以对这些实施例进行多种变化、修改、替换和变型,本发明的范围由所附权利要求及其等同物限定。

Claims (8)

1.一种字节码插桩方法,其特征在于:其步骤为:
(1)通过ASM生成ClassVisitor接口;
(2)在字节码内生成toByteArray()函数;
(3)返回生成的字节码的字节流;
(4)将字节流写回文件生成调整后的class文件。
2.根据权利要求1所述的一种字节码插桩方法,其特征在于:class文件为Java类框架文件。
3.根据权利要求2所述的一种字节码插桩方法,其特征在于:Java类文件是8位字节的二进制流,数据项按顺序存储在class文件中,相邻的项之间没有间隔。
4.根据权利要求3所述的一种字节码插桩方法,其特征在于:Java类文件的项包括有Magic、Version、Constant Pool、Access_flag、This Class、Super Class、Interfaces、Fields、Methods、Class attributes。
5.根据权利要求4所述的一种字节码插桩方法,其特征在于:Magic用于存放一个Java类文件的魔数和版本信息,
Version用于存放Java类文件的版本信息。
6.根据权利要求4所述的一种字节码插桩方法,其特征在于:Constant Pool用于存放类中各种文字字符串、类名、方法名和接口名称、final变量以及对外部类的引用信息,
Access_flag用于指明文件中定义的是类后者接口,同时指名类或接口的访问标志。
7.根据权利要求4所述的一种字节码插桩方法,其特征在于:This Class用于指向表示该类全限定名称的字符串常量的指针,
Super Class用于指向表示父类全限定名称的字符串常量的指针,
Interfaces为一个指针数组,存放了该类或父类实现的所有接口名称的字符串常量的指针。
8.根据权利要求6所述的一种字节码插桩方法,其特征在于:Fields用于对类或接口中声明的字段进行细致的描述,
Methods同于对类或接口中声明的方法进行细致的描述,
Class attributes用于存放在该文件中类或接口所定义的属性的基本信息。
CN201910794489.7A 2019-08-27 2019-08-27 一种字节码插桩方法 Pending CN110597515A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201910794489.7A CN110597515A (zh) 2019-08-27 2019-08-27 一种字节码插桩方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201910794489.7A CN110597515A (zh) 2019-08-27 2019-08-27 一种字节码插桩方法

Publications (1)

Publication Number Publication Date
CN110597515A true CN110597515A (zh) 2019-12-20

Family

ID=68855799

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201910794489.7A Pending CN110597515A (zh) 2019-08-27 2019-08-27 一种字节码插桩方法

Country Status (1)

Country Link
CN (1) CN110597515A (zh)

Cited By (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN111352849A (zh) * 2020-03-13 2020-06-30 杭州趣维科技有限公司 一种移动端***埋点解决方法
CN111782526A (zh) * 2020-06-30 2020-10-16 北京同邦卓益科技有限公司 一种接口测试方法、装置、电子设备及存储介质
CN113051122A (zh) * 2019-12-26 2021-06-29 百度在线网络技术(北京)有限公司 性能数据获取方法、装置、电子设备和介质
CN114398102A (zh) * 2022-01-18 2022-04-26 杭州米络星科技(集团)有限公司 一种应用程序包生成方法、装置、编译服务器及计算机可读存储介质

Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN108536589A (zh) * 2018-03-26 2018-09-14 广州小鹏汽车科技有限公司 一种应用程序埋点方法及***
CN109684027A (zh) * 2017-10-18 2019-04-26 北京京东尚科信息技术有限公司 动态跟踪Java虚拟机运行的方法和装置

Patent Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN109684027A (zh) * 2017-10-18 2019-04-26 北京京东尚科信息技术有限公司 动态跟踪Java虚拟机运行的方法和装置
CN108536589A (zh) * 2018-03-26 2018-09-14 广州小鹏汽车科技有限公司 一种应用程序埋点方法及***

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
布偶O: "ASM字节码增强技术", 《HTTPS://WWW.CNBLOGS.COM/BUOU/P/11272187.HTML》 *

Cited By (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN113051122A (zh) * 2019-12-26 2021-06-29 百度在线网络技术(北京)有限公司 性能数据获取方法、装置、电子设备和介质
CN113051122B (zh) * 2019-12-26 2023-09-15 百度在线网络技术(北京)有限公司 性能数据获取方法、装置、电子设备和介质
CN111352849A (zh) * 2020-03-13 2020-06-30 杭州趣维科技有限公司 一种移动端***埋点解决方法
CN111352849B (zh) * 2020-03-13 2023-05-16 杭州趣维科技有限公司 一种移动端***埋点解决方法
CN111782526A (zh) * 2020-06-30 2020-10-16 北京同邦卓益科技有限公司 一种接口测试方法、装置、电子设备及存储介质
CN114398102A (zh) * 2022-01-18 2022-04-26 杭州米络星科技(集团)有限公司 一种应用程序包生成方法、装置、编译服务器及计算机可读存储介质
CN114398102B (zh) * 2022-01-18 2023-08-08 杭州米络星科技(集团)有限公司 一种应用程序包生成方法、装置、编译服务器及计算机可读存储介质

Similar Documents

Publication Publication Date Title
CN110597515A (zh) 一种字节码插桩方法
US7047524B1 (en) Object oriented ADN and method of converting a non-object oriented computer language to an object oriented computer language
US11733985B2 (en) Accessing a migrated member in an updated type
US10853096B2 (en) Container-based language runtime loading an isolated method
US10922081B2 (en) Conditional branch frame barrier
US10466975B2 (en) Execution of parameterized classes on legacy virtual machines to generate instantiation metadata
US20050071809A1 (en) System and method for serializing objects in a compiled programming language
US8407678B2 (en) Method of array interception using data-flow analysis
Tilevich et al. NRMI: Natural and efficient middleware
US6996813B1 (en) Frameworks for loading and execution of object-based programs
US11507503B1 (en) Write barrier for remembered set maintenance in generational Z garbage collector
CN112114810A (zh) 编译处理方法及装置
US8793671B2 (en) Interface optimization in a closed system
US11030097B2 (en) Verifying the validity of a transition from a current tail template to a new tail template for a fused object
US6978456B1 (en) Methods and apparatus for numeric constant value inlining in virtual machines
US7024664B2 (en) Symbolic assembly language
US7565646B2 (en) Method for compression of object code interpreted by tree-structured expression factorization
CN117149155A (zh) 服务接口的代码校验方法、装置、设备及存储介质
Van Vliet C++ for Financial Applications: Syntax and Algorithms
CN115309405A (zh) 一种代码链接优化方法
CN112667245A (zh) 一种代码处理方法、装置、电子设备及存储介质
CN117369861A (zh) 应用程序的线程管理策略配置方法及相关装置
Plasmeijer et al. Term graph rewriting and mobile expressions in functional languages
JP2006011712A (ja) 永続化アダプタ生成装置

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
RJ01 Rejection of invention patent application after publication
RJ01 Rejection of invention patent application after publication

Application publication date: 20191220