CN112306501B - 业务数据采集方法、装置、存储介质和计算设备 - Google Patents
业务数据采集方法、装置、存储介质和计算设备 Download PDFInfo
- Publication number
- CN112306501B CN112306501B CN202011375915.2A CN202011375915A CN112306501B CN 112306501 B CN112306501 B CN 112306501B CN 202011375915 A CN202011375915 A CN 202011375915A CN 112306501 B CN112306501 B CN 112306501B
- Authority
- CN
- China
- Prior art keywords
- function
- lambda
- target event
- event response
- node
- 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.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/44—Encoding
- G06F8/443—Optimisation
Landscapes
- Engineering & Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Stored Programmes (AREA)
Abstract
本申请的实施方式提供了一种业务数据采集方法、装置、存储介质和计算设备。业务数据采集方法包括:在代码编译期扫描类文件内的多个函数节点;对所述多个函数节点中的目标事件响应函数的节点进行插桩处理;基于所述插桩处理的结果,采集所述目标事件响应函数中的捕获变量。利用本申请实施例能够实现业务数据的自动采集。
Description
技术领域
本申请的实施方式涉及数据采集技术领域,更具体地,本申请的实施方式涉及业务数据采集方法、装置、存储介质和计算设备。
背景技术
本部分旨在为权利要求书中陈述的本申请的实施方式提供背景或上下文。此处的描述不因为包括在本部分中就承认是现有技术。
埋点技术是一种常用的数据采集方法,传统的埋点通常是通过写代码的方式实现在某个事件(例如点击click事件)发生时调用软件开发工具包(Software DevelopmentKit,SDK)的相应接口发送埋点数据,实现对click事件的数据采集。但传统埋点过程需工程师手动埋点,工程量极大,耗时费力且容易出错。“全埋点”是自动采集全部事件并上报埋点数据,在后端数据计算时再过滤出有用数据,虽然全埋点方案无需手动埋点,但是,已有的全埋点解决方案能搜集的数据类型有局限,只能做到对控件固有属性数据的搜集,无法搜集其他更有价值的数据,例如业务数据。
对于业务数据的搜集,目前可利用数据路径datapath语法来实现,具体需下发想要搜集的目标数据的引用路径,利用datapath指引逐层解析该引用路径,获取指向的变量,可以搜集到目标数据。但是,datapath语义复杂,技术门槛高,配置文件的设置经常需要开发人员全程参与,并且随着产品版本迭代,业务代码也在变更,这时需重新定义datapath,实际中维护版本与datapath还需投入人力;此外,沿datapath逐级反射直至取得目标数据的过程还会产生一定的性能损耗,影响产品整体表现。
发明内容
本申请期望提供一种业务数据采集方法、装置、存储介质和计算设备,以至少解决上述技术问题。
第一方面,本申请实施例提供一种业务数据采集方法,包括:
在代码编译期扫描类文件(class文件)内的多个函数节点;
对所述多个函数节点中的目标事件响应函数的节点进行插桩处理;
基于所述插桩处理的结果,采集所述目标事件响应函数中的捕获变量。
根据本申请实施例的业务数据采集方法,所述采集所述目标事件响应函数中的捕获变量,包括:采集所述类文件内的匿名内部类的成员变量;其中,所述目标事件响应函数对应的第一代码完成编译后,所述目标事件响应函数中的捕获变量和指向外部类的引用转换为所述第一代码对应的匿名实现类的成员变量。
根据本申请实施例的业务数据采集方法,所述多个函数节点包括所述类文件内的全部函数节点。
根据本申请实施例的业务数据采集方法,所述插桩处理包括在所述目标事件响应函数的头部插桩;
所述基于所述插桩处理的结果,采集所述目标事件响应函数中的捕获变量包括:创建局部变量obj,并将所述局部变量obj保存在局部变量表中;遍历所述类文件内的类成员变量,并将所述类文件内的类成员变量添加到所述局部变量obj中;搜集所述局部变量obj中的类成员变量的数据。
根据本申请实施例的业务数据采集方法,所述搜集所述局部变量obj中的类成员变量的数据,包括:搜集所述局部变量obj中的非静态的且为引用类型的类成员变量的数据。
根据本申请实施例的业务数据采集方法,还包括:如果所述多个函数节点中的第一函数节点不属于目标事件响应函数的节点,且所述第一函数节点为Lambda执行方法,则对所述Lambda执行方法进行插桩处理,并基于插桩处理的结果搜集所述Lambda执行方法的方法参数。
根据本申请实施例的业务数据采集方法,还包括:如果所述多个函数节点中的第一函数节点不属于目标事件响应函数的节点,且所述第一函数节点不是Lambda执行方法,则搜索Lambda执行方法。
根据本申请实施例的业务数据采集方法,所述搜索Lambda执行方法,包括:扫描所述多个函数节点中的第二函数节点的函数指令,在扫描到invokedynamic指令后,解析所述invokedynamic指令以确定所述第二函数节点是否对应于所述目标事件响应函数,如果所述第二函数节点对应于所述目标事件响应函数,则解析所述invokedynamic指令指向的Lambda执行方法,并作为所述第二函数节点对应的Lambda执行方法。
根据本申请实施例的业务数据采集方法,还包括:确定所述第二函数节点对应的Lambda执行方法中的方法参数和所述方法参数的类型;
根据所述方法参数的顺序以及所述方法参数的类型,确定各个方法参数在局部变量表中的起始索引。
根据本申请实施例的业务数据采集方法,还包括:确定所述多个函数节点中的部分或全部函数节点对应的Lambda执行方法以及Lambda执行方法的方法参数和方法参数的类型,生成方法参数列表;遍历所述方法参数列表,并采集所述局部变量表中的一个或多个方法参数对应的变量值,作为对应函数节点中的捕获变量,其中所述一个或多个方法参数位于所述方法参数列表中。
根据本申请实施例的业务数据采集方法,所述采集所述局部变量表中一个或多个方法参数对应的变量值,包括:采集所述局部变量表中的非静态的且为引用类型的一个或多个方法参数对应的变量值。
第二方面,本申请实施例还提供一种业务数据采集装置,包括:
扫描处理模块,用于在代码编译期扫描类文件内的多个函数节点;
插桩处理模块,用于对所述多个函数节点中的目标事件响应函数的节点进行插桩处理;
采集处理模块,用于基于所述插桩处理的结果,采集所述目标事件响应函数中的捕获变量。
第三方面,本申请实施例还提供一种计算设备,包括:
一个或多个处理器;
存储装置,用于存储一个或多个程序;
当所述一个或多个程序被所述一个或多个处理器执行时,使得所述一个或多个处理器实现如上所述的业务数据采集方法的步骤。
第四方面,本申请实施例还提供一种非易失性计算机可读存储介质,其存储有计算机程序,该程序被处理器执行时实现如上所述的业务数据采集方法的步骤。
本申请实施例通过将业务数据的采集时机放在代码编译期,也就是在代码编译期扫描class文件内的函数节点,定位目标事件响应函数节点后插桩,采集目标事件响应函数中的捕获变量,基于此可获得相关业务数据。利用本申请实施例可以通过对方法函数中捕获变量的搜集,实现对对应业务数据的搜集,运行中无需技术人员过多干预,产品版本升级或业务数据发生变更后仍可以采集到捕获变量,实现了业务数据采集过程的优化。
附图说明
通过参考附图阅读下文的详细描述,本申请示例性实施方式的上述以及其他目的、特征和优点将变得易于理解。在附图中,以示例性而非限制性的方式示出了本申请的若干实施方式,其中:
图1示意性地示出本申请实施例的业务数据采集方法的实现流程图;
图2示意性地示出本申请实施例中采集业务数据的时机的示意图;
图3示意性地示出本申请实施例的歌单点击事件中点击界面控件时onClick函数引用对应歌单的示意图;
图4示意性地示出本申请实施例的自定义Transform工具采集业务数据的流程框图;
图5示意性地示出本申请实施例创建并保存局部变量obj前后的操作数栈的对比示意图;
图6示意性地示出本申请实施例的适用于Lambda执行方法的业务数据采集方法的实现流程图;
图7示意性地示出本申请实施例搜索Lambda执行方法的实现流程图;
图8示意性地示出本申请实施例中解析invokedynamic指令的实现流程图;
图9示意性地示出本申请实施例的存储介质结构示意图;
图10示意性地示出本申请实施例的业务数据采集装置结构示意图;
图11示意性地示出根据本申请实施例的计算设备结构示意图。
在附图中,相同或对应的标号表示相同或对应的部分。
具体实施方式
下面将参考若干示例性实施方式来描述本申请的原理和精神。应当理解,给出这些实施方式仅仅是为了使本领域技术人员能够更好地理解进而实现本申请,而并非以任何方式限制本申请的范围。相反,提供这些实施方式是为了使本公开更加透彻和完整,并且能够将本公开的范围完整地传达给本领域的技术人员。
本领域技术人员知道,本申请的实施方式可以实现为一种系统、装置、设备、方法或计算机程序产品。因此,本公开可以具体实现为以下形式,即:完全的硬件、完全的软件(包括固件、驻留软件、微代码等),或者硬件和软件结合的形式。
根据本申请的实施方式,提出了一种业务数据采集方法、存储介质、装置和计算设备。
在本文中,附图中的任何元素数量均用于示例而非限制,以及任何命名都仅用于区分,而不具有任何限制含义。
下面参考本申请若干代表性实施方式详细阐释本申请的原理和精神。
发明概述
一般地,全埋点的实现方式之一是编译插桩,大致过程为采用相关插件(如Android Gradle插件)提供的“Transform API”工具,在APK编译环节中、class文件转换成dex文件之前,对class文件插入中间环节,调用“ASM API”工具扫描class文件的字节码,当扫描到目标事件响应函数时,在目标事件响应函数头部或尾部插入SDK数据搜集代码,如此可以搜集被操作的控件实例对象的数据。但是,目前全埋点方案搜集的数据还局限于控件的一些固有属性数据,而无法搜集到更有价值的业务数据。
鉴于上述情况,为了获得更有价值的业务数据,本申请提出,将业务数据的采集时机放在代码编译期,在编译期对目标事件响应函数进行插桩并采集捕获变量,这样,不仅可以采集到控件固有属性数据,还可以采集到控件关联的业务数据。而且,采集的业务数据来自变量捕获,那么产品(如应用程序App)版本升级、业务数据发生变更等不会影响采集过程,业务数据仍可以被采集到,无需过多干预,可减少人力消耗。
在详细描述本申请的具体实施方式之前,首先对本文中可能涉及到的术语或概念简要说明如下。
业务数据采集是与具体业务相关的数据的采集(或称搜集、收集)。
目标事件响应函数是操作系统捕获到用户操作行为后提供的响应函数,开发人员在这个函数内进行编码以定义对应的响应行为,例如一个按钮被点击,会触发“onClick”函数。
Lambda表达式(lambda expression)是指匿名函数,也就是没有函数名的函数,通常在需要定义一个函数但又不去具体命名该函数时使用。
变量捕获(captured variable)是匿名方法、lambda表达式内部使用的外部变量。
函数式接口(Functional Interface)有且仅有一个抽象方法,但可以有多个非抽象方法的接口,函数式接口可以被隐式转换为Lambda表达式。
字节码(Byte-code)是一种包含执行程序、由一序列op代码/数据对组成的二进制文件,字节码是一种中间码。
以上介绍了本申请的基本思想和相关术语,下面具体介绍本申请的各种非限制性实施方式。
示例性方法
图1示意性地示出了根据本申请一实施方式的业务数据采集方法的实现流程图,该方法包括以下步骤:
S101:在代码编译期扫描类文件(class文件)内的多个函数节点;
S102:对所述多个函数节点中的目标事件响应函数的节点进行插桩处理;
S103:基于所述插桩处理的结果,采集所述目标事件响应函数中的捕获变量。
本申请的实施例将业务数据的采集时机放在代码编译期,也就是在代码编译期扫描class文件内的函数节点,定位目标事件响应函数节点后插桩,采集目标事件响应函数中的捕获变量,基于此可获得相关业务数据。
关于数据采集的时机,图2示出了本申请实施例采集业务数据的时机的示意图,如图2所示为在编译环节内、class文件转换成dex文件之前,对class文件插入中间环节,图2实施例中是插入自定义“Transform”工具采集业务数据。此外,“javac”为java语言编程编译器,javac工具用于读取以java语言编写的类和接口定义,并将它们编译成字节代码的class文件;“ProGuard”是用于压缩、优化和混淆Java字节码文件的工具,ProGuard工具可删除无用的类、字段、方法和属性等,最大限度优化字节码文件,当使用Android Gradle插件的某些版本时,可使用R8工具代替ProGuard执行优化。
关于采集捕获变量,通常,控件关联的数据(记作A)会在目标事件响应函数(记作B)中被引用到,换句话说,当B为匿名内部类写法时,B中会引用A,可称为B捕获了A,可将A称为“捕获变量”,那么当B被触发时,搜集A也就是搜集B内的捕获变量。结合本申请的实施例,举例来说,图3示意性地示出一App用户界面,方框包围的部分为一个“一周日语新歌推荐”控件,该控件关联有对应的推荐歌单,如果用户点击该控件,即发生了歌单点击click事件,则onClick函数(目标事件响应函数B)会引用到对应的歌单(歌单点击业务数据A),利用本申请实施例,可以通过对onClick函数中的捕获变量的搜集,可实现对歌单业务数据的搜集,该方案在实际运行中无需技术人员过多干预,产品版本升级或业务数据发生变更后仍可以采集到捕获变量,采集过程不会对运行产生影响,本申请实施例可使业务数据的采集过程得到优化。
可选地,所述采集所述目标事件响应函数中的捕获变量,可以通过如下方式实现:采集所述类文件内的匿名内部类成员变量;其中,目标事件响应函数对应的第一代码完成编译后,目标事件响应函数中的捕获变量和指向外部类的引用转换为所述第一代码对应的匿名实现类的成员变量。
举例说明,以点击事件为例,点击监听.java代码被编译成字节码后,onClick函数中的捕获变量以及指向外部类的引用可构成OnClickListener匿名实现类的成员变量。通过本申请实施例可以将搜集onClick函数中的捕获变量转化为搜集对应的匿名内部类的成员变量。
可选地,所述多个函数节点包括所述类文件内的全部函数节点。
基于上述内容,图4示出了本申请一个实施例的自定义Transform采集业务数据的流程框图,可判断class文件内是否存在未扫描的函数节点,确保全部函数节点都被扫描过,其中如果存在未扫描的函数节点,则需要扫描这些函数节点,判断该节点上是否是目标事件响应函数,如果是目标事件响应函数,则针对该节点搜集类成员变量。
可选地,所述插桩处理包括在所述目标事件响应函数的头部插桩,即在方法头部嵌入探针(如自定义代码段)。在其他实施例中也可在目标事件响应函数的尾部插桩。
可选地,上述的基于所述插桩处理的结果采集所述目标事件响应函数中的捕获变量,可以通过以下处理实现:
1)创建局部变量obj,并将所述局部变量obj保存在局部变量表中;
2)遍历所述类文件内的类成员变量,并将所述类文件内的类成员变量添加到所述局部变量obj中;
3)搜集所述局部变量obj中的类成员变量的数据。
仍以点击为例,当调用onClick方法时,例如Java虚拟机会创建一个新的栈帧,传递给onClick方法的参数值会成为新栈帧中对应局部变量的初始值,即类实例的引用“this”和传递给onClick方法的参数“view”,作为onClick方法栈帧的第0个和第1个局部变量。其中初始状态的操作数栈为空,如图5左侧所示。根据本申请的实施例,在onClick方法的头部插入代码,并创建一个obj变量,保存在索引为2的局部变量表中,如图5右侧所示。例如,可创建ArrayList局部变量obj,遍历类成员变量并添加到列表obj,最后搜集局部变量obj。
可选地,考虑到实际的业务数据都是非静态的引用类型,因此应采集非静态的引用类型的类成员变量,也就是,搜集局部变量obj中的非静态的且为引用类型的类成员变量的数据。
需要说明,插桩后,局部变量表索引为0和1的变量未发生变化,操作数栈恢复成空栈。其中虽然多了一个索引为2的局部变量,但并不会影响到后续代码复用索引为2的局部变量。
利用本申请的实施例可将常规匿名实现类捕获变量的搜集转化为对类成员变量的搜集,适用于全埋点的业务数据采集,可有效提升全埋点的实用性。
另一方面,随着Java 8语言的普及,目前开发人员在尝试新的语言元素进行日常开发,变化之一是原有匿名内部类的写法变为以Java Lambda表达式来表示。以点击Lambda表达式为例,编译器并没有为每个Java Lambda表达式生成一个OnClickListener匿名实现类,而是关联了一个“lambda$方法名$index”形式的方法,也就是编译器为每一个JavaLambda表达式生成了一个新的方法,可称之为“Lambda执行方法”。
其中,由于Java Lambda表达式在编译成Java 8字节码后,没有生成对应的OnClickListener实现类,那么采用Java Lambda表达式写法的目标事件例如点击事件也无法被扫描拦截到,导致前文描述的处理流程无法适用。
在此情况下,本申请实施例进一步提出优化的处理流程,目的是针对Java Lambda表达式进行兼容,以下提供具体的处理步骤。
可选地,如果所述多个函数节点中的第一函数节点不属于目标事件响应函数的节点,且所述第一函数节点为Lambda执行方法,则对所述Lambda执行方法进行插桩处理,并基于插桩处理的结果搜集所述Lambda执行方法的方法参数。
可选地,如果所述第一函数节点不属于目标事件响应函数节点,且所述第一函数节点不是Lambda执行方法,则搜索Lambda执行方法;反之,如果所述第一函数节点不是Lambda执行方法,则搜索(或称寻找)Lambda执行方法。
参考图6,在确定扫描到的函数节点不是目标事件响应函数节点之后,需要判断该节点是否为Lambda执行方法,如果是Lambda执行方法,则插桩并搜集该Lambda执行方法的方法参数;反之,如果不是Lambda执行方法,则寻找Lambda执行方法。
可选地,参考图7,可通过如下方式搜索Lambda执行方法:
S201:扫描所述多个函数节点中的第二函数节点的函数指令,在扫描到invokedynamic指令后,解析所述invokedynamic指令以确定所述第二函数节点是否对应于所述目标事件响应函数,
S202:如果所述第二函数节点对应于所述目标事件响应函数,则解析所述invokedynamic指令指向的Lambda执行方法,将其作为所述第二函数节点对应的Lambda执行方法。
采取上述处理方式的原因是,实际中,Lambda执行方法的信息是由“invokedynamic”指令表征的,深入到函数体内部逐个扫描函数指令,可扫描到invokedynamic指令,解析扫描到的invokedynamic指令,可确定当前节点是目标事件响应函数节点,进而可解析invokedynamic指令指向的Lambda执行方法,作为该目标事件响应函数节点的Lambda执行方法。
结合图8,以点击为例,可按如下操作定位一个Lambda表达式对应的执行方法:
首先,确认Java Lambda表达式实现的是否是OnClickListener函数式接口。
具体地,解析invokedynamic指令指向的CONSTANT_InvokeDynamic_info常量内的CONSTANT_NameAndType_info结构,其中,如果Java Lambda表达式实现的是OnClickListener函数式接口,则方法描述符(参数列表和返回值)的返回值应为Landroid/view/View$OnClickListener,方法名应为onClick。
然后,定位编译器为该Java Lambda表达式生成的执行方法。
具体地,根据invokedynamic指令指向的CONSTANT_InvokeDynamic_info常量内的bootstrap_method_attr_index,找到BootstrapMethods属性下的对应项Methodarguments提供的索引为1的参数,即为要寻找的Lambda执行方法。
可选地,在确定所述第二函数节点对应的Lambda执行方法之后,还可确定所述第二函数节点对应的Lambda执行方法中的方法参数和所述方法参数的类型;并且根据所述方法参数的顺序以及所述方法参数的类型,可确定各个方法参数在局部变量表中的起始索引。
例如,通过解析invokedynamic指令能够知晓Lambda执行方法有哪些方法参数以及每个参数的类型,根据方法参数顺序以及参数类型可以准确计算出每个方法参数在局部变量表中的起始索引。
可选地,按照对所述第二函数节点的处理方式,可确定所述多个函数节点中的部分或全部函数节点对应的Lambda执行方法以及Lambda执行方法的方法参数和方法参数的类型,据此可生成方法参数列表;然后,遍历所述方法参数列表,并采集局部变量表中的一个或多个方法参数对应的变量值,作为对应函数节点中的捕获变量(所述一个或多个方法参数位于所述方法参数列表中),可将采集到的局部变量表内的对应变量值压入操作数栈,弹出操作数栈所有值。可选地,采集时,采集所述局部变量表中的非静态的且为引用类型的一个或多个方法参数对应的变量值。
由以上内容可知,本申请的实施例实际上是将Java Lambda表达式的插桩问题转化为了对编译器为该Lambda表达式生成的Lambda执行方法的插桩,将对Java Lambda执行方法的捕获变量的搜集转化为了对方法参数列表的搜集,然后从局部变量表中采集那些位于方法参数列表中的方法参数的变量值,从而获得了该节点上的业务数据。
以上描述了本申请实施例的多种实现方式,以下以一个类直接实现OnClickListener接口的情况为例,提供利用本申请实施例插桩前和插桩后代码的示意性实施例。
插桩前java源码如下:
插桩后字节码如下:
插桩后,引用类型的非静态变量可都被搜集到,其中“var1”代表控件固有属性数据,“var2”代表业务数据。本申请实施例的业务数据采集过程无需开发人员过多干预,采集的数据来自变量捕获,App产品等版本升级或业务数据发生变更后仍可以被采集到,维护成本低,且由于数据采集过程发生在编译期,除消耗一些编译速度外,对应用的运行性能基本不会产生影响。
示例性介质
在介绍了本申请示例性实施方式的方法之后,接下来,参考图9对本申请示例性实施方式的介质进行说明。
在一些可能的实施方式中,本申请的各个方面还可以实现为一种计算机可读介质,其上存储有程序,当所述程序被处理器执行时用于实现本说明书上述“示例性方法”部分中描述的根据本申请各种示例性实施方式的业务数据采集方法中的步骤。
需要说明的是:上述的介质可以是可读信号介质或者可读存储介质。可读存储介质例如可以是但不限于:电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。可读存储介质的更具体的例子(非穷举的列表)包括:具有一个或多个导线的电连接、便携式盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、光纤、便携式紧凑盘只读存储器(CD-ROM)、光存储器件、磁存储器件、或者上述的任意合适的组合。
如图9所示,描述了根据本申请的实施方式的介质60,其可以采用便携式紧凑盘只读存储器(CD-ROM)并包括程序,并可以在设备上运行。然而,本申请不限于此,在本文件中,可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。
可读信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了可读程序代码。这种传播的数据信号可以采用多种形式,包括但不限于:电磁信号、光信号或上述的任意合适的组合。可读信号介质还可以是可读存储介质以外的任何可读介质,该可读介质可以发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序。
可以以一种或多种程序设计语言的任意组合来编写用于执行本申请操作的程序代码,上述程序设计语言包括面向对象的程序设计语言—诸如Java、C++等,还包括常规的过程式程序设计语言—诸如“C”语言或类似的程序设计语言。程序代码可以完全地在用户计算设备上执行、部分在用户计算设备上部分在远程计算设备上执行、或者完全在远程计算设备或服务器上执行。在涉及远程计算设备的情形中,远程计算设备可以通过任意种类的网络—包括局域网(LAN)或广域网(WAN)—连接到用户计算设备。
示例性装置
在介绍了本申请示例性实施方式的存储介质之后,接下来,参考图10对本申请示例性实施方式的装置进行说明。
如图10所示,本申请实施业务数据采集装置100可以包括:
扫描处理模块110,用于在代码编译期扫描类文件内的多个函数节点;
插桩处理模块120,用于对所述多个函数节点中的目标事件响应函数的节点进行插桩处理;
采集处理模块130,用于基于所述插桩处理的结果,采集所述目标事件响应函数中的捕获变量。
根据本申请实施例的业务数据采集装置,所述采集处理模块130还用于采集所述类文件内的匿名内部类的成员变量;其中,所述目标事件响应函数对应的第一代码完成编译后,所述目标事件响应函数中的捕获变量和指向外部类的引用转换为所述第一代码对应的匿名实现类的成员变量。
根据本申请实施例的业务数据采集装置,所述多个函数节点包括所述类文件内的全部函数节点。
根据本申请实施例的业务数据采集装置,所述插桩处理模块120用于在所述目标事件响应函数的头部插桩;所述采集处理模块130包括:
创建处理子模块131,用于创建局部变量obj,并将所述局部变量obj保存在局部变量表中;
添加处理子模块132,用于遍历所述类文件内的类成员变量,并将所述类文件内的类成员变量添加到所述局部变量obj中;
搜集处理子模块133,用于搜集所述局部变量obj中的类成员变量的数据。
根据本申请实施例的业务数据采集装置,所述搜集处理子模块133用于搜集所述局部变量obj中的非静态的且为引用类型的类成员变量的数据。
根据本申请实施例的业务数据采集装置,所述插桩处理模块120还用于在所述多个函数节点中的第一函数节点不属于目标事件响应函数的节点,且所述第一函数节点为Lambda执行方法的情况下,对所述Lambda执行方法进行插桩处理,所述采集处理模块130还用于基于插桩处理的结果搜集所述Lambda执行方法的方法参数。
根据本申请实施例的业务数据采集装置,还包括:搜索处理模块140,用于在所述多个函数节点中的第一函数节点不属于目标事件响应函数的节点,且所述第一函数节点不是Lambda执行方法的情况下,搜索Lambda执行方法。
根据本申请实施例的业务数据采集装置,所述搜索处理模块140包括:
第一解析处理子模块141,用于扫描所述多个函数节点中的第二函数节点的函数指令,在扫描到invokedynamic指令后,解析所述invokedynamic指令以确定所述第二函数节点是否对应于所述目标事件响应函数,
第二解析处理子模块142,用于在所述第二函数节点对应于所述目标事件响应函数的情况下,解析所述invokedynamic指令指向的Lambda执行方法,并作为所述第二函数节点对应的Lambda执行方法。
根据本申请实施例的业务数据采集装置,还包括:
第一确定处理模块150,用于确定所述第二函数节点对应的Lambda执行方法中的方法参数和所述方法参数的类型;
第二确定处理模块160,用于根据所述方法参数的顺序以及所述方法参数的类型,确定各个方法参数在局部变量表中的起始索引。
根据本申请实施例的业务数据采集装置,还包括:第三确定处理模块170,用于确定所述多个函数节点中的部分或全部函数节点对应的Lambda执行方法以及Lambda执行方法的方法参数和方法参数的类型,生成方法参数列表;所述采集处理模块130还用于遍历所述方法参数列表,并采集所述局部变量表中的一个或多个方法参数对应的变量值,作为对应函数节点中的捕获变量,其中所述一个或多个方法参数位于所述方法参数列表中。
根据本申请实施例的业务数据采集装置,所述采集处理模块130采集所述局部变量表中的非静态的且为引用类型的一个或多个方法参数对应的变量值。
示例性计算设备
在介绍了本申请示例性实施方式的方法、存储介质和装置之后,接下来,参考图11对本申请示例性实施方式的计算设备进行说明。
所属技术领域的技术人员能够理解,本申请的各个方面可以实现为系统、方法或程序产品。因此,本申请的各个方面可以具体实现为以下形式,即:完全的硬件实施方式、完全的软件实施方式(包括固件、微代码等),或硬件和软件方面结合的实施方式,这里可以统称为“电路”、“模块”或“系统”。
在一些可能的实施方式中,根据本申请实施方式的计算设备可以至少包括至少一个处理单元以及至少一个存储单元。其中,所述存储单元存储有程序代码,当所述程序代码被所述处理单元执行时,使得所述处理单元执行本说明书上述“示例性方法”部分中描述的根据本申请的各种示例性实施方式的业务数据采集方法中的步骤。
下面参照图11来描述根据本申请的这种实施方式的计算设备80。图11显示的计算设备80仅仅是一个示例,不应对本申请实施例的功能和使用范围带来任何限制。
如图11所示,计算设备80以通用计算设备的形式表现。计算设备80的组件可以包括但不限于:上述至少一个处理单元801、上述至少一个存储单元802,连接不同系统组件(包括处理单元801和存储单元802)的总线803。
总线803包括数据总线、控制总线和地址总线。
存储单元802可以包括易失性存储器形式的可读介质,例如随机存取存储器(RAM)8021和/或高速缓存存储器8022,可以进一步包括非易失性存储器形式的可读介质,例如只读存储器(ROM)8023。
存储单元802还可以包括具有一组(至少一个)程序模块8024的程序/实用工具8025,这样的程序模块8024包括但不限于:操作系统、一个或者多个应用程序、其它程序模块以及程序数据,这些示例中的每一个或某种组合中可能包括网络环境的实现。
计算设备80也可以与一个或多个外部设备804(例如键盘、指向设备等)通信。这种通信可以通过输入/输出(I/O)接口805进行。并且,计算设备80还可以通过网络适配器806与一个或者多个网络(例如局域网(LAN),广域网(WAN)和/或公共网络,例如因特网)通信。如图11所示,网络适配器806通过总线803与计算设备80的其它模块通信。应当理解,尽管图中未示出,可以结合计算设备80使用其它硬件和/或软件模块,包括但不限于:微代码、设备驱动器、冗余处理单元、外部磁盘驱动阵列、RAID系统、磁带驱动器以及数据备份存储系统等。
应当注意,尽管在上文详细描述中提及了业务数据采集装置的若干单元/模块或子单元/模块,但是这种划分仅仅是示例性的并非强制性的。实际上,根据本申请的实施方式,上文描述的两个或更多单元/模块的特征和功能可以在一个单元/模块中具体化。反之,上文描述的一个单元/模块的特征和功能可以进一步划分为由多个单元/模块来具体化。
此外,尽管在附图中以特定顺序描述了本申请方法的操作,但这并非要求或者暗示必须按照该特定顺序来执行这些操作,或是必须执行全部所示的操作才能实现期望的结果。附加地或备选地,可以省略某些步骤,将多个步骤合并为一个步骤执行,和/或将一个步骤分解为多个步骤执行。
虽然已经参考若干具体实施方式描述了本申请的精神和原理,但是应该理解,本申请并不限于所公开的具体实施方式,对各方面的划分也不意味着这些方面中的特征不能组合以进行受益,这种划分仅是为了表述的方便。本申请旨在涵盖所附权利要求的精神和范围内所包括的各种修改和等同布置。
Claims (22)
1.一种业务数据采集方法,其特征在于,包括:
在代码编译期扫描类文件内的多个函数节点;
对所述多个函数节点中的目标事件响应函数的节点进行插桩处理;
基于所述插桩处理的结果,采集所述目标事件响应函数中的捕获变量;
所述插桩处理包括在所述目标事件响应函数的头部插桩;
所述基于所述插桩处理的结果,采集所述目标事件响应函数中的捕获变量,包括:
创建局部变量obj,并将所述局部变量obj保存在局部变量表中;
遍历所述类文件内的类成员变量,并将所述类文件内的类成员变量添加到所述局部变量obj中;
搜集所述局部变量obj中的类成员变量的数据。
2.根据权利要求1所述的方法,其特征在于,
所述采集所述目标事件响应函数中的捕获变量,包括:采集所述类文件内的匿名内部类的成员变量;
其中,所述目标事件响应函数对应的第一代码完成编译后,所述目标事件响应函数中的捕获变量和指向外部类的引用转换为所述第一代码对应的匿名实现类的成员变量。
3.根据权利要求1或2所述的方法,其特征在于,
所述多个函数节点包括所述类文件内的全部函数节点。
4.根据权利要求1所述的方法,其特征在于,
所述搜集所述局部变量obj中的类成员变量的数据,包括:搜集所述局部变量obj中的非静态的且为引用类型的类成员变量的数据。
5.根据权利要求1所述的方法,其特征在于,还包括:
如果所述多个函数节点中的第一函数节点不属于目标事件响应函数的节点,且所述第一函数节点为Lambda执行方法,则对所述Lambda执行方法进行插桩处理,并基于插桩处理的结果搜集所述Lambda执行方法的方法参数。
6.根据权利要求5所述的方法,其特征在于,还包括:
如果所述多个函数节点中的第一函数节点不属于目标事件响应函数的节点,且所述第一函数节点不是Lambda执行方法,则搜索Lambda执行方法。
7.根据权利要求6所述的方法,其特征在于,
所述搜索Lambda执行方法,包括:
扫描所述多个函数节点中的第二函数节点的函数指令,在扫描到invokedynamic指令后,解析所述invokedynamic指令以确定所述第二函数节点是否对应于所述目标事件响应函数,
如果所述第二函数节点对应于所述目标事件响应函数,则解析所述invokedynamic指令指向的Lambda执行方法,并作为所述第二函数节点对应的Lambda执行方法。
8.根据权利要求7所述的方法,其特征在于,还包括:
确定所述第二函数节点对应的Lambda执行方法中的方法参数和所述方法参数的类型;
根据所述方法参数的顺序以及所述方法参数的类型,确定各个方法参数在局部变量表中的起始索引。
9.根据权利要求8所述的方法,其特征在于,还包括:
确定所述多个函数节点中的部分或全部函数节点对应的Lambda执行方法以及Lambda执行方法的方法参数和方法参数的类型,生成方法参数列表;
遍历所述方法参数列表,并采集所述局部变量表中的一个或多个方法参数对应的变量值,作为对应函数节点中的捕获变量,其中所述一个或多个方法参数位于所述方法参数列表中。
10.根据权利要求9所述的方法,其特征在于,
所述采集所述局部变量表中一个或多个方法参数对应的变量值,包括:采集所述局部变量表中的非静态的且为引用类型的一个或多个方法参数对应的变量值。
11.一种业务数据采集装置,其特征在于,包括:
扫描处理模块,用于在代码编译期扫描类文件内的多个函数节点;
插桩处理模块,用于对所述多个函数节点中的目标事件响应函数的节点进行插桩处理;
采集处理模块,用于基于所述插桩处理的结果,采集所述目标事件响应函数中的捕获变量;
其中,所述插桩处理模块用于在所述目标事件响应函数的头部插桩;
所述采集处理模块包括:
创建处理子模块,用于创建局部变量obj,并将所述局部变量obj保存在局部变量表中;
添加处理子模块,用于遍历所述类文件内的类成员变量,并将所述类文件内的类成员变量添加到所述局部变量obj中;
搜集处理子模块,用于搜集所述局部变量obj中的类成员变量的数据。
12.根据权利要求11所述的装置,其特征在于,
所述采集处理模块还用于采集所述类文件内的匿名内部类的成员变量;
其中,所述目标事件响应函数对应的第一代码完成编译后,所述目标事件响应函数中的捕获变量和指向外部类的引用转换为所述第一代码对应的匿名实现类的成员变量。
13.根据权利要求11或12所述的装置,其特征在于,
所述多个函数节点包括所述类文件内的全部函数节点。
14.根据权利要求13所述的装置,其特征在于,
所述搜集处理子模块用于搜集所述局部变量obj中的非静态的且为引用类型的类成员变量的数据。
15.根据权利要求11所述的装置,其特征在于,
插桩处理模块还用于在所述多个函数节点中的第一函数节点不属于目标事件响应函数的节点,且所述第一函数节点为Lambda执行方法的情况下,对所述Lambda执行方法进行插桩处理,所述采集处理模块还用于基于插桩处理的结果搜集所述Lambda执行方法的方法参数。
16.根据权利要求15所述的装置,其特征在于,还包括:
搜索处理模块,用于在所述多个函数节点中的第一函数节点不属于目标事件响应函数的节点,且所述第一函数节点不是Lambda执行方法的情况下,搜索Lambda执行方法。
17.根据权利要求16所述的装置,其特征在于,
所述搜索处理模块包括:
第一解析处理子模块,用于扫描所述多个函数节点中的第二函数节点的函数指令,在扫描到invokedynamic指令后,解析所述invokedynamic指令以确定所述第二函数节点是否对应于所述目标事件响应函数,
第二解析处理子模块,用于在所述第二函数节点对应于所述目标事件响应函数的情况下,解析所述invokedynamic指令指向的Lambda执行方法,并作为所述第二函数节点对应的Lambda执行方法。
18.根据权利要求17所述的装置,其特征在于,还包括:
第一确定处理模块,用于确定所述第二函数节点对应的Lambda执行方法中的方法参数和所述方法参数的类型;
第二确定处理模块,用于根据所述方法参数的顺序以及所述方法参数的类型,确定各个方法参数在局部变量表中的起始索引。
19.根据权利要求18所述的装置,其特征在于,还包括:
第三确定处理模块,用于确定所述多个函数节点中的部分或全部函数节点对应的Lambda执行方法以及Lambda执行方法的方法参数和方法参数的类型,生成方法参数列表;
所述采集处理模块还用于遍历所述方法参数列表,并采集所述局部变量表中的一个或多个方法参数对应的变量值,作为对应函数节点中的捕获变量,其中所述一个或多个方法参数位于所述方法参数列表中。
20.根据权利要求19所述的装置,其特征在于,
所述采集处理模块采集所述局部变量表中的非静态的且为引用类型的一个或多个方法参数对应的变量值。
21.一种计算设备,其特征在于,包括:
一个或多个处理器;
存储器,用于存储一个或多个程序;
当所述一个或多个程序被所述一个或多个处理器执行时,使得所述一个或多个处理器实现如权利要求1-10中任一项所述的业务数据采集方法。
22.一种非易失性计算机可读存储介质,其存储有计算机程序,其特征在于,该程序被处理器执行时实现如权利要求1-10中任一项所述的业务数据采集方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202011375915.2A CN112306501B (zh) | 2020-11-30 | 2020-11-30 | 业务数据采集方法、装置、存储介质和计算设备 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202011375915.2A CN112306501B (zh) | 2020-11-30 | 2020-11-30 | 业务数据采集方法、装置、存储介质和计算设备 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN112306501A CN112306501A (zh) | 2021-02-02 |
CN112306501B true CN112306501B (zh) | 2023-03-28 |
Family
ID=74487522
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202011375915.2A Active CN112306501B (zh) | 2020-11-30 | 2020-11-30 | 业务数据采集方法、装置、存储介质和计算设备 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN112306501B (zh) |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113238801A (zh) * | 2021-05-17 | 2021-08-10 | 上海中通吉网络技术有限公司 | 快递扫描信息采集方法、装置和系统 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108549537A (zh) * | 2018-04-08 | 2018-09-18 | 北京极数科技有限公司 | 基于Android终端的用户数据采集的方法及系统 |
CN109669866A (zh) * | 2018-12-10 | 2019-04-23 | 北京航空航天大学 | 一种软件运行时故障传播路径的获取方法 |
CN110209386A (zh) * | 2019-05-17 | 2019-09-06 | 北京奇艺世纪科技有限公司 | 数据埋点的设置方法、埋点数据的获取方法及装置 |
CN111190573A (zh) * | 2018-11-14 | 2020-05-22 | 北京字节跳动网络技术有限公司 | 应用程序埋点方法、装置和电子设备 |
CN111309550A (zh) * | 2020-02-05 | 2020-06-19 | 江苏满运软件科技有限公司 | 应用程序的数据采集方法、系统、设备和存储介质 |
Family Cites Families (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7275239B2 (en) * | 2003-02-10 | 2007-09-25 | International Business Machines Corporation | Run-time wait tracing using byte code insertion |
US20130305222A1 (en) * | 2012-05-11 | 2013-11-14 | Microsoft Corporation | Development System |
US10803087B2 (en) * | 2018-10-19 | 2020-10-13 | Oracle International Corporation | Language interoperable runtime adaptable data collections |
-
2020
- 2020-11-30 CN CN202011375915.2A patent/CN112306501B/zh active Active
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108549537A (zh) * | 2018-04-08 | 2018-09-18 | 北京极数科技有限公司 | 基于Android终端的用户数据采集的方法及系统 |
CN111190573A (zh) * | 2018-11-14 | 2020-05-22 | 北京字节跳动网络技术有限公司 | 应用程序埋点方法、装置和电子设备 |
CN109669866A (zh) * | 2018-12-10 | 2019-04-23 | 北京航空航天大学 | 一种软件运行时故障传播路径的获取方法 |
CN110209386A (zh) * | 2019-05-17 | 2019-09-06 | 北京奇艺世纪科技有限公司 | 数据埋点的设置方法、埋点数据的获取方法及装置 |
CN111309550A (zh) * | 2020-02-05 | 2020-06-19 | 江苏满运软件科技有限公司 | 应用程序的数据采集方法、系统、设备和存储介质 |
Non-Patent Citations (2)
Title |
---|
ASM实现Hook Lambda和方法引用;神策技术社区;《https://juejin.cn/post/6850418114228813832》;20200714;第1-9页 * |
java回调函数与匿名内部类;muximuxi525;《https://blog.csdn.net/muxidreamtohit/article/details/46427689》;20150609;第1-2页 * |
Also Published As
Publication number | Publication date |
---|---|
CN112306501A (zh) | 2021-02-02 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Zhou et al. | API deprecation: a retrospective analysis and detection method for code examples on the web | |
Paleczny et al. | The java {HotSpot™} server compiler | |
CN107423048B (zh) | 数据收集的方法、装置、介质和计算设备 | |
EP1004961B1 (en) | Method and system for correlating profile data dynamically generated from an optimized executable program with source code statements | |
US7890941B1 (en) | Binary profile instrumentation framework | |
US8375377B2 (en) | Controlling java virtual machine component behavior on a per-classloader basis | |
EP3491527B1 (en) | Debugging tool for a jit compiler | |
US7698692B1 (en) | Preparing a binary file for future instrumentation | |
US20120266137A1 (en) | Method and apparatus to semantically connect independent build and test processes | |
US20110126179A1 (en) | Method and System for Dynamic Patching Software Using Source Code | |
US20140157247A1 (en) | Enabling Symbol Resolution of Private Symbols in Legacy Programs and Optimizing Access to the Private Symbols | |
US10809985B2 (en) | Instrumenting program code | |
CN112306501B (zh) | 业务数据采集方法、装置、存储介质和计算设备 | |
US10782945B1 (en) | Escape analysis supporting on-stack replacement | |
CN114356964A (zh) | 数据血缘构建方法、装置、存储介质及电子设备 | |
Strumpen | Compiler technology for portable checkpoints | |
JP2018156133A (ja) | コンパイラプログラム、情報処理装置およびコンパイル方法 | |
US10642714B2 (en) | Mapping dynamic analysis data to source code | |
CN111913741B (zh) | 对象拦截方法、装置、介质及电子设备 | |
US11474832B2 (en) | Intelligently determining a virtual machine configuration during runtime based on garbage collection characteristics | |
CN111475150B (zh) | 一种跨语言绑定方法、装置、设备及存储介质 | |
Sansom | Execution profiling for non-strict functional languages | |
CN116107524B (zh) | 低代码应用日志处理方法、介质、装置和计算设备 | |
CN115705250A (zh) | 监测堆栈使用量以优化程序 | |
CN114816364A (zh) | 基于Swagger动态生成范本文件的方法、装置及应用 |
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 | ||
GR01 | Patent grant | ||
GR01 | Patent grant |