CN110134400A - 数据获取方法、装置、电子设备及计算机可读存储介质 - Google Patents
数据获取方法、装置、电子设备及计算机可读存储介质 Download PDFInfo
- Publication number
- CN110134400A CN110134400A CN201910263004.1A CN201910263004A CN110134400A CN 110134400 A CN110134400 A CN 110134400A CN 201910263004 A CN201910263004 A CN 201910263004A CN 110134400 A CN110134400 A CN 110134400A
- Authority
- CN
- China
- Prior art keywords
- code
- pitching pile
- goal approach
- target
- application program
- 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
Links
- 238000000034 method Methods 0.000 title claims abstract description 230
- 238000013481 data capture Methods 0.000 title claims abstract description 19
- 238000003860 storage Methods 0.000 title claims abstract description 14
- 238000013459 approach Methods 0.000 claims abstract description 247
- 238000006243 chemical reaction Methods 0.000 claims abstract description 11
- 238000012216 screening Methods 0.000 claims description 67
- 230000008569 process Effects 0.000 claims description 27
- 238000009434 installation Methods 0.000 claims description 20
- 238000012545 processing Methods 0.000 claims description 18
- 230000002123 temporal effect Effects 0.000 claims description 18
- 238000003780 insertion Methods 0.000 claims description 16
- 230000037431 insertion Effects 0.000 claims description 16
- 230000001960 triggered effect Effects 0.000 claims description 11
- 238000001914 filtration Methods 0.000 claims description 5
- 238000012856 packing Methods 0.000 claims description 5
- 238000012423 maintenance Methods 0.000 abstract description 6
- 230000008878 coupling Effects 0.000 abstract description 5
- 238000010168 coupling process Methods 0.000 abstract description 5
- 238000005859 coupling reaction Methods 0.000 abstract description 5
- 238000010586 diagram Methods 0.000 description 10
- 238000002347 injection Methods 0.000 description 9
- 239000007924 injection Substances 0.000 description 9
- 238000011161 development Methods 0.000 description 8
- 238000012544 monitoring process Methods 0.000 description 8
- 238000004590 computer program Methods 0.000 description 6
- 238000005516 engineering process Methods 0.000 description 5
- 238000012986 modification Methods 0.000 description 5
- 230000004048 modification Effects 0.000 description 5
- 230000006870 function Effects 0.000 description 4
- 238000005457 optimization Methods 0.000 description 4
- 230000009471 action Effects 0.000 description 3
- 238000004364 calculation method Methods 0.000 description 2
- 230000008859 change Effects 0.000 description 2
- 238000013519 translation Methods 0.000 description 2
- 238000010276 construction Methods 0.000 description 1
- 230000000694 effects Effects 0.000 description 1
- 238000005304 joining Methods 0.000 description 1
- 238000004519 manufacturing process Methods 0.000 description 1
- 230000003287 optical effect Effects 0.000 description 1
- 230000000750 progressive effect Effects 0.000 description 1
- 238000007619 statistical method Methods 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/30—Monitoring
- G06F11/34—Recording or statistical evaluation of computer activity, e.g. of down time, of input/output operation ; Recording or statistical evaluation of user activity, e.g. usability assessment
- G06F11/3409—Recording or statistical evaluation of computer activity, e.g. of down time, of input/output operation ; Recording or statistical evaluation of user activity, e.g. usability assessment for performance assessment
- G06F11/3428—Benchmarking
-
- 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
Landscapes
- Engineering & Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Software Systems (AREA)
- Debugging And Monitoring (AREA)
Abstract
本发明提供了一种数据获取方法、装置、电子设备、计算机可读存储介质,该方法包括:根据应用程序的预设配置文件,识别所述应用程序中待监测的目标字节码、以及所述目标字节码中待监测的目标方法;将预设插桩代码转换为字节码形式的目标插桩代码;调用预设插桩接口,在所述目标方法中内部逻辑代码的前后插入所述目标插桩代码,其中,所述目标插桩代码用于获取所述目标方法的耗时数据。本发明降低了业务代码与插桩代码的耦合性、降低了代码维护成本,并提升了耗时数据的采集效率。
Description
技术领域
本发明涉及计算机技术领域,特别是涉及一种数据获取方法、装置、电子设备及计算机可读存储介质。
背景技术
在程序开发或应用过程中,需要对程序的性能进行不断优化,优化的性能参数中特别重要的一点是程序的运行速度。
那么为了监控程序中各个代码的耗时时间,目前主要通过在程序开发阶段,开发人员手动在程序源代码中针对每个方法分别预埋能够采集耗时时间的代码,然后,将预埋代码的程序源代码进行编译,生成字节码文件,最后对字节码文件打包,生成程序的安装文件。在将安装文件运行后,能够在程序运行过程中利用预埋的代码对待监测的代码进行耗时统计,以便对耗时较长的代码进行优化。
但是,这种通过预埋耗时时间采集代码的方式来进行耗时统计的方案,只能在代码开发阶段进行代码预埋,并且需要人工的逐个对每个待耗时统计的目标代码来预埋耗时时间采集代码,存在着耗时时间的采集效率较低的问题;另外,如果需要调整预埋代码,则需要对程序中的每个预埋代码逐个进行重复的修改,并重新进行编译、打包等操作,即程序需要重新进行一次完整的开发流程,显然,这会造成代码的维护成本较高;此外,耗时时间采集代码由于在开发阶段预埋至程序源代码中,这也会造成耗时时间采集代码与程序的业务代码的耦合性较强的问题。
发明内容
本发明提供了一种数据获取方法、装置、电子设备及计算机可读存储介质,以解决相关技术中的耗时数据采集方案所存在的数据采集效率低、采集代码与业务代码耦合性强、代码维护成本高的问题。
为了解决上述问题,根据本发明的一个方面,本发明公开了一种数据获取方法,包括:
根据应用程序的预设配置文件,识别所述应用程序中待监测的目标字节码、以及所述目标字节码中待监测的目标方法;
将预设插桩代码转换为字节码形式的目标插桩代码;
调用预设插桩接口,在所述目标方法中内部逻辑代码的前后插入所述目标插桩代码,其中,所述目标插桩代码用于获取所述目标方法的耗时数据。
根据本发明的另一方面,本发明还公开了一种数据获取装置,包括:
识别模块,用于根据应用程序的预设配置文件,识别所述应用程序中待监测的目标字节码、以及所述目标字节码中待监测的目标方法;
转换模块,用于将预设插桩代码转换为字节码形式的目标插桩代码;
插入模块,用于调用预设插桩接口,在所述目标方法中内部逻辑代码的前后插入所述目标插桩代码,其中,所述目标插桩代码用于获取所述目标方法的耗时数据。
根据本发明的又一方面,本发明还公开了一种电子设备,包括:存储器、处理器及存储在所述存储器上并可在所述处理器上运行的数据获取程序,所述数据获取程序被所述处理器执行时实现如上述任意一项所述的数据获取方法的步骤。
根据本发明的再一方面,本发明还公开了一种计算机可读存储介质,所述计算机可读存储介质上存储有数据获取程序,所述数据获取程序被处理器执行时实现如上述任意一项所述的数据获取方法中的步骤。
与现有技术相比,本发明包括以下优点:
本发明实施例的方法在应用程序编译阶段,将预设插桩代码对应的字节码形式的目标插桩代码,插入至目标字节码的目标方法中,以便于目标插桩代码对该目标方法获取耗时数据,而非在程序开发阶段预埋用于获取耗时数据的代码,从而降低了业务代码与插桩代码的耦合性;此外,本发明实施例的方法基于应用程序的预设配置文件,来识别需要插桩的对象(即目标字节码中的目标方法),使得被插桩的对象在预设配置文件中是可配置的,以及基于预设插桩代码来获取目标插桩代码,使得插桩代码也是可配置的。那么当需要调整对插桩对象或者插桩代码时,则只需要对预设配置文件、预设插桩代码中的信息进行调整即可,无需对应用程序的代码作任何调整,从而降低了代码维护成本;另外,为了达到对目标方法获取耗时数据的目的,只需要利用预设插桩代码和预设配置文件,来对已编译完成的应用程序做进一步的代码插入处理即可,无需在开发阶段对应用程序中的每个插桩对象逐个采用手工预埋的方式来插入用于采集耗时数据的插桩代码,从而大幅提升了耗时数据的采集效率。
附图说明
图1是本发明的一种数据获取方法实施例的步骤流程图;
图2是本发明的另一种数据获取方法实施例的步骤流程图;
图3是本发明的又一种数据获取方法实施例的步骤流程图;
图4是本发明的再一种数据获取方法实施例的步骤流程图;
图5是本发明的再一种数据获取方法实施例的步骤流程图;
图6示出了本发明的一个应用程序实施例的架构图;
图7是本发明的一种数据获取装置实施例的结构框图。
具体实施方式
为使本发明的上述目的、特征和优点能够更加明显易懂,下面结合附图和具体实施方式对本发明作进一步详细的说明。
为了获取应用程序中开发人员关注的代码的耗时数据,本发明提供了一种数据获取方法,该方法可以应用于应用程序编译生成字节码文件之后的阶段中,如图1所示,本发明实施例的方法可以对应用程序编译生成的字节码文件进行插桩处理,在插桩时,可以调用预设插桩接口,来将预设插桩代码插入至开发人员感兴趣的目标字节码文件中的目标方法的内部,从而便于该预设插桩代码来对该目标方法的执行耗时时长数据来进行采集。在插桩处理之后,就可以对应用程序的字节码文件(包括插入预设插桩代码的字节码文件)进行打包,生成插桩后的应用程序的安装文件;然后运行该安装文件,那么当该目标方法被调用而执行时,则该目标方法内部的预设插桩代码也会被运行,从而可以获取该目标方法的耗时数据并输出。图2~图5以及相关的可选实施例详细描述了图1中的插桩处理步骤,具体可以参照下文的相关描述。
参照图2,示出了本发明的一种数据获取方法实施例的步骤流程图,具体可以包括如下步骤:
步骤101,根据应用程序的预设配置文件,识别所述应用程序中待监测的目标字节码、以及所述目标字节码中待监测的目标方法;
其中,在应用程序的源代码编译生成字节码文件后,本发明实施例的方法可以根据该应用程序的预设配置文件,来识别应用程序的多个字节码文件中待监测耗时数据的目标字节码文件,以及该目标字节码文件中待监测耗时数据的目标方法。
其中,该目标方法可以是目标字节码文件中的部分或全部方法,本发明对此不做限制,目标方法具体属于目标字节码文件中的哪个方法均是可配置的。
在一个示例中,该预设配置文件可以记录目标字节码的标识信息(例如类名、字节码文件名称)、目标方法的标识信息(例如方法名),因此,基于该预设配置文件可以识别需要对哪个字节码中的哪个方法来获取耗时数据。
另外,该预设配置文件中的信息都是可配置的,因此,用户可以根据获取耗时数据的需求,来灵活的在预设配置文件中配置相应目标方法以及目标方法所属的目标字节码的信息,以便于本发明实施例的方法对相应的目标方法去获取其耗时数据,以便为应用程序的代码优化提供参考依据。
可选地,若检测到应用程序的源代码编译生成字节码,则执行所述步骤101。
在一个示例中,应用程序以Java语言编写,编写的各个Java文件在编译后可以生成Class(类)文件,Java文件中的每个类可以生成一个Class文件,因此,编译后的Java文件可以对应有多个Class文件;本发明实施例的方法可以基于该预设配置文件来从多个Class文件中识别出待监测的目标Class文件,以及目标Class文件中待监测的目标方法。
步骤102,将预设插桩代码转换为字节码形式的目标插桩代码;
其中,预设插桩代码可以用于对任意一个应用程序的任意一个方法进行耗时数据的获取,且应用于不同方法的预设插桩代码是相同的。即在本发明实施例中,针对目标字节码中的每个目标方法获取其耗时数据时,采用的都是同一套预设插桩代码。
在一个示例中,若应用程序的项目管理工具为Gradle(其中,Gradle是一个项目自动化构建开源工具),则该预设插桩代码可以是预先编写的一个自定义Gradle脚本。本发明实施例的预设插桩代码可以写在一个Gradle脚本中,而非编写在应用程序的配置文件中,由于配置文件是面向用户可配置的,这样,可以提升本发明实施例的预设插桩代码的安全性。
需要说明的是,本发明实施例的应用程序的项目管理工具并不限于Gradle,还可以是maven、ant等。
其中,由于本发明实施例的方法的目的在于利用预设插桩代码来获取目标字节码中目标方法的耗时数据,而该预设插桩代码是一个Java语言编写的脚本,该目标方法则是处于一个目标字节码文件中,字节码文件是一个二进制文件,因此,为了能够将该预设插桩代码插入至目标字节码中的目标方法中,本步骤中可以将该预设插桩代码转换为字节码形式的目标插桩代码。
在一个示例中,可以利用ASM(ASM是一个Java字节码操控框架)技术来将预设插桩代码(是Java代码)转为成字节码,从而得到目标插桩代码。
步骤103,调用预设插桩接口,在所述目标方法中内部逻辑代码的前后插入所述目标插桩代码,其中,所述目标插桩代码用于获取所述目标方法的耗时数据。
具体而言,在将目标插桩代码插入至目标字节码中的目标方法中时,由于在目标字节码中,该目标方法的内部具有该目标方法的内部逻辑代码,而本发明实施例的方法目的在于获取该目标方法执行完成该内部逻辑代码所耗费的时长,因此,在本步骤中,可以在该内部逻辑代码的前和后来插入该目标插桩代码,从而由该目标插桩代码来获取该目标方法的耗时数据。其中,该目标插桩代码插入至该目标方法内部,从而可以在目标方法执行后,获取该目标方法的耗时数据。
另外,在将目标插桩代码插入至目标方法中时,可以通过调用预设插桩接口来实现。具体而言,可以将步骤101所识别到的目标字节码的信息、目标方法的信息作为参数来传递给该预设插桩接口,并调用该预设插桩接口,那么该预设插桩接口就可以根据接收到的上述两个参数,来将目标插桩代码插入至目标字节码中的目标方法的内部。
在一个示例中,该应用程序的编写运行环境为Gradle环境,Gradle插件包含了一个名称为Transform的API(Application Programming Interface,应用程序编程接口),Transform是安卓提供的一个API的类名,Transform API允许第三方插件在Class文件转为dex(能够被ART虚拟机执行并且加载的文件格式)文件前操作编译好的Class文件。因此,该预设插桩接口可以为Gradle插件中的Transform API,本发明实施例的方法可以在代码编译阶段,调用该Transform API来对所述应用程序(APP,application)实现目标插桩代码的注入,从而可以将目标插桩代码插入到目标字节码的目标方法中的指定位置。
另外,本发明实施例在进行目标插桩代码的插入操作时,以字节码文件中的方法为单位进行插桩处理,而并非对某个事件节点进行插桩,从而不对业务进行感知。也就是说,本发明实施例的方法只针对感兴趣的目标方法逐个进行插桩,不关心该目标方法处于哪个事件中,或者处于哪个业务处理中。从而能够无需考虑应用程序的业务处理过程,直接对关注的目标方法进行插桩,提升了本发明实施例的插桩代码的通用性。
借助于本发明实施例的上述技术方案,本发明实施例的方法在应用程序编译阶段,将预设插桩代码对应的字节码形式的目标插桩代码,插入至目标字节码的目标方法中,以便于目标插桩代码对该目标方法获取耗时数据,而非在程序开发阶段预埋用于获取耗时数据的代码,从而降低了业务代码与插桩代码的耦合性;此外,本发明实施例的方法基于应用程序的预设配置文件,来识别需要插桩的对象(即目标字节码中的目标方法),使得被插桩的对象在预设配置文件中是可配置的,以及基于预设插桩代码来获取目标插桩代码,使得插桩代码也是可配置的。那么当需要调整对插桩对象或者插桩代码时,则只需要对预设配置文件、预设插桩代码中的信息进行调整即可,无需对应用程序的代码作任何调整,从而降低了代码维护成本;另外,为了达到对目标方法获取耗时数据的目的,只需要利用预设插桩代码和预设配置文件,来对已编译完成的应用程序做进一步的代码插入处理即可,无需在开发阶段对应用程序中的每个插桩对象逐个采用手工预埋的方式来插入用于采集耗时数据的插桩代码,从而大幅提升了耗时数据的采集效率。
可选地,在步骤103进行插桩处理之后,参照图1,根据本发明实施例的方法还可以将所述应用程序的每个字节码文件进行打包处理,生成插桩后的应用程序的安装文件;然后,根据所述安装文件运行插桩后的所述应用程序。
在一个示例中,本发明实施例的方法对应用程序的多个Class文件中目标Class文件进行了代码注入,注入目标插桩代码后,可以对应用程序的多个Class文件(包括注入目标插桩代码后的目标Class文件)进行打包处理,来生成APP的安装包,例如APK(AndroidPackage,安卓的安装包)。其中,对字节码文件打包生成安装文件的处理过程采用常规处理方法即可,本发明对此不做限制。那么在根据所述安装文件运行插桩后的所述应用程序后,当该目标方法被触发时,则所述目标方法中的目标插桩代码也会被执行,由于该目标插桩代码插入在目标方法的内部逻辑代码的前面和后面,所以该目标插桩代码可以获取到该目标方法的内部逻辑代码的执行耗时。
这样,本发明实施例通过在应用程序编译生成字节码后,就会触发本发明实施例的采用预设插桩代码对编译得到的待监测的目标字节码中的目标方法进行插桩的方案,然后,将插桩后的应用程序的多个字节码进行打包,来生成插桩后的应用程序的安装文件。其中,预设插桩代码的注入步骤在编译得到字节码文件之后执行,且在生成安装文件之前执行,避免了对应用程序的源代码的修改,降低了代码的维护成本。
可选地,在目标插桩代码输出目标方法的耗时数据之后,根据本发明实施例的方法还可以包括:将每个目标方法的耗时数据按照预设策略进行排序,并输出排序后的耗时数据。
其中,预设策略可以根据需要灵活配置,例如按照耗时数据从高到低的顺序依次显示每个目标方法的方法名和耗时数据;再如按照耗时数据的时间类型(例如时钟时间、CPU时间、系统时间)分类显示目标方法的方法名和耗时数据;又如,按照超时时间从多到少的顺序来对各个目标方法的方法名、耗时数据、超时时间进行显示,其中,超时数据的获取可以通过计算耗时数据与预设耗时阈值的差值来确定。
可选地,在输出排序后的耗时数据时,可以通过通知栏消息的方式输出排序后的耗时数据。其中,通知栏消息用户可以选择开启或关闭,若关闭,则不再以通知栏消息的方式将排序后的耗时数据提供给用户。
可选地,在输出排序后的耗时数据时,还可以通过日志的方式来供用户查看排序后的耗时数据。
这样,开发人员可以对应用程序中所关注的目标方法的耗时数据进行浏览,从而优化应用程序的目标方法的源代码,提升应用程序的性能。
可选地,如图3所示,在执行步骤101中的识别应用程序中待监测的目标字节码时,可以通过S201来实现:
S201,根据应用程序的预设配置文件中的字节码筛选参数,对所述应用程序的字节码进行筛选,识别与所述字节码筛选参数匹配的目标字节码;
可选地,所述字节码筛选参数可以包括以下至少之一:项目名、包名、类名。
在一个示例中,本发明实施例的应用程序的预设配置文件中配置有项目名、包名和类名。
一个项目中可以存在多个Java文件,Java文件经过编译则可以生成对应每个类的Class文件;一个包中也可以存在多个类,应用程序的源代码经过编译则可以生成对应每个类的Class文件;Java文件中的一个类可以生成一个Class文件。
而项目名、包名、类名则分别是项目的唯一标识、包(例如类库的包、或者安卓系统的包)的唯一标识、类的唯一标识,一个项目可以包括多个Java类,因此一个项目可以编译生成多个类文件,一个包可以包括多个Java类,因此一个包也可以编译生成多个类文件,一个Java类可以编译生成一个类文件。那么通过在预设配置文件中配置指定的项目名、包名和类名,则可以对应用程序编译得到的多个Class文件中筛选出指定的Class文件,即目标字节码。
其中,上述字节码筛选参数可以存储在白名单中,也就是说,预设配置文件可以包括白名单。白名单中的项目名、包名、类名用于从应用程序编译得到的多个Class文件中,筛选出指定的Class文件,即目标字节码。
以白名单包括项目名1、包名1、类名Class3和类名Class4为例进行说明:
项目名1对应的项目中包括3个Java文件,3个Java文件编译后生成Class1文件、Class2文件、Class3文件和Class4文件;包名1中存在Class3、Class4、Class5和Class6。
上述项目名1、包名2和类名分别限制了三组Class文件的集合,那么这三个集合的交集中的每个字节码文件,即为本发明实施例的目标字节码。本例中,目标字节码包括名称为Class3的class文件和名称为Class4的class文件。
在一个示例中,可以利用Transform API提供的插桩技术,来借助于上述白名单中的数据对编译后的多个字节码文件进行筛选。
可选地,在执行步骤101中的识别所述目标字节码中待监测的目标方法时,可以通过S202来实现:
S202,根据所述预设配置文件中的方法参数,对所述目标字节码中的方法进行筛选,识别所述目标字节码中的目标方法。
具体而言,本发明实施例的预设配置文件中还可以配置有用于筛选方法的方法参数(例如方法名)。由于前述步骤已经根据预设配置文件中的字节码筛选参数筛选得到一组目标字节码(即一组目标Class文件),而每个目标Class文件中都可以包括一个或多个方法。那么本步骤,只需要利用所述方法参数,来对每个目标Class文件中的方法进行筛选,识别到待监测的目标方法。
可选地,所述方法参数同样可以存储在所述白名单中。
在一个示例中,可以利用Transform API提供的插桩技术,来对筛选后的目标字节码进行解析,然后,对解析后的目标字节码中的目标方法进行筛选。
这样,本发明实施例通过在应用程序的预设配置文件中配置字节码筛选参数和方法参数,从而能够对指定范围内的目标字节码中的目标方法进行插桩,实现了对指定插桩范围内的目标方法进行插桩的方案。由于字节码筛选参数和方法参数可以指定目标字节码范围和目标方法范围,从而避免了对应用程序的源代码进行大范围注解的问题,提升了代码注入效率以及耗时数据的采集效率;此外,由于预设配置文件中的数据均是面向用户(开发人员)可配置的,因此,可以根据开发人员对各个方法的监测需求,来灵活配置应用程序的字节码筛选参数和方法参数。从而实现对目标方法的自动插桩,以获取目标方法的耗时数据。
可选地,在执行步骤101中的识别所述目标字节码中待监测的目标方法时,还可以通过注解的方式,来识别目标方法。
也就是说,本发明实施例的方法不仅可以利用预设配置文件来指定需要插桩的目标方法,还可以在应用程序的源代码开发阶段,对需要插桩的目标方法设置预设注解(相当于标记的作用),那么源代码编译完成得到字节码后,本发明实施例的方法可以从目标字节码中查找设置有预设注解的方法,查找到的设置有预设注解的目标方法即为需要进行插桩的方法。
这样,本发明实施例提供注解和配置文件的两种方式来指定需要插桩的目标方法,使得目标方法的识别更加灵活,可以根据需求灵活设置采用哪种方式来指定目标方法。
可选地,在一个实施例中,在执行S202时,若目标字节码中存在与所述预设配置文件中的方法参数相匹配的目标方法,则识别所述目标方法;若目标字节码中不存在与所述预设配置文件中的方法参数相匹配的目标方法,则将所述目标字节码中的每个方法识别为目标方法。
继续以上述示例来举例,这里的目标字节码分别为名称为Class3的class文件和名称为Class4的class文件,例如名称为Class3的class文件包括方法名为f1、f2的两个方法;名称为Class4的class文件包括方法名为f3、f4、f5的两个方法。而预设配置文件中的方法参数为f3和f4。那么在利用该方法参数来与两个Class文件中的方法名进行匹配时,可以确定名称为Class4的class文件中存在方法名为f3和f4的两个方法,因此,可以将名称为Class4的class文件中的方法名为f3和f4的两个方法分别识别为待监测的目标方法;而名称为Class3的class文件中不存在方法名为f3、f4的任意一个方法,那么说明名称为Class3的class文件中的方法不需要过滤,可以将名称为Class3的class文件中的f1、f2的两个方法均识别为待监测的目标方法。
综上,这里识别到的目标方法包括:名称为Class3的class文件中的f1方法、f2方法,名称为Class4的class文件中的f3方法、f4方法。
这样,本发明实施例在利用预设配置文件中的方法参数来对目标方法进行定位识别时,若目标字节码包括命中方法参数的方法,则可以识别该目标字节码中的被命中的方法为待监测的目标方法;若目标字节码中的任意一个方法均没有命中方法参数,则可以将该目标字节码中的每个方法均识别为监测的目标方法,这样,针对需要重点监测的目标字节码,无需对其进行方法参数的配置,只需要进行字节码筛选参数的配置即可完成对该目标字节码中每个方法的耗时监测,从而省略了目标方法的筛选过程,直接对目标字节码中的各个方法进行插桩,提升了耗时数据的采集效率;且由于配置文件中省略了方法参数,而只配置了字节码筛选参数,从而降低了配置文件中的数据量;并在使用配置文件时,减少了内存的不必要占用。
可选地,在另一个实施例中,在执行S202时,若目标字节码中存在与所述预设配置文件中的方法参数相匹配的目标方法,则识别所述目标方法;若目标字节码中不存在与所述预设配置文件中的方法参数相匹配的目标方法,则将所述目标字节码过滤掉。
继续以上述示例来举例,这里识别到的目标方法包括名称为Class4的class文件中的f3方法、f4方法,而不包括名称为Class3的class文件中的任何方法。并且,还需要将名称为Class3的class文件从目标字节码中剔除。
这样,本发明实施例通过在应用程序的预设配置文件中配置方法参数,从而以方法参数为最终确定的目标方法的条件,仅将目标字节码中与该方法参数的方法识别为待监测的目标方法,能够减少监测的目标方法的数量,从而降低插桩任务量,提升插桩效率和耗时数据的采集效率。
可选地,若所述预设配置文件还包括黑名单,则在执行步骤101时,可以首先,根据所述黑名单,对筛选后的所述目标字节码进行过滤,得到待监测的目标字节码;然后,根据所述黑名单,对过滤后的目标字节码中的所述目标方法进行过滤,得到待监测的目标方法。
具体而言,这里的黑名单与上文所述的白名单相对应,或者说与上文所述的字节码筛选参数和方法参数相对应。黑名单同样可以包括项目名,和/或,包名,和/或,类名,和/或,方法名,但是黑名单中的各个参数所指定的字节码范围、或者方法范围都是不需要监测的。
因此,可以利用黑名单来对本发明上述实施例中利用白名单中的数据筛选后的目标字节码、目标方法进行进一步的过滤。具体的过滤顺序,可以根据黑名单中的项目名,和/或,包名,和/或,类名来对目标字节码进行进一步的过滤,将多个目标字节码中与黑名单匹配的字节码进行剔除;然后,再利用黑名单中的方法名(如果存在的话),对过滤后得到的目标字节码中的目标方法(经过白名单识别到的)进行进一步的过滤,得到过滤后的所述目标字节码中待监测的目标方法。
这样,本发明实施例在利用预设配置文件中的字节码筛选参数、方法参数,对编译后得到的多个字节码文件进行筛选后,可以初步确定需要监测的目标字节码以及该目标字节码中需要监测的目标方法;而为了确保字节码筛选参数、方法参数的复用,避免频繁修改上述两类参数,本发明实施例的方法通过在应用程序的预设配置文件中配置黑名单,其中,黑名单中的信息包括以下至少之一:项目名、包名、类名、方法名。那么可以借助于黑名单中的信息来对目标字节码进行进一步的过滤,以及对过滤后的目标字节码中的目标方法进行进一步的过滤,从而确保对需要监测的目标方法进行准确的定位和耗时数据的获取。
可选地,如图4所示,所述目标插桩代码包括第一插桩代码和第二插桩代码,那么在执行步骤103时,则可以通过S301来实现:
S301,调用预设插桩接口,在所述目标方法中内部逻辑代码之前插入所述第一插桩代码,在所述目标方法中内部逻辑代码之后插入所述第二插桩代码;
其中,所述第一插桩代码用于采集时间信息,并将所述时间信息传递至所述第二插桩代码;
所述第二插桩代码也用于采集时间信息,并计算采集的时间信息与接收自所述第一插桩代码的时间信息的时间差值,其中,所述时间差值为所述目标方法的耗时数据。
具体而言,预设插桩代码可以分为两部分,第一预设插桩代码和第二预设插桩代码,那么二者转换为字节码形式后,可以生成第一插桩代码和第二插桩代码,其中,第一插桩代码插入在目标方法内部中内部逻辑代码之前,而第二插桩代码插入在目标方法内部中内部逻辑代码之后。第一插桩代码和第二插桩代码在执行过程中均可以采集时间信息,可选地,该时间信息的类型可以包括但不限于以下至少之一:系统时间、CPU时间、时钟时间。
其中,第一插桩代码和第二插桩代码所分别采集的时间信息的时间类型是预先配置好的,且二者采集的时间的时间类型是一致的,这样,就可以计算两个插桩代码采集到的时间信息的差值,来获取该目标方法对某一种类型的时间的耗时时长。
可选地,如图4所示,在S301之后,根据本发明实施例的方法还可以包括步骤104。
步骤104,在所述应用程序运行过程中,当所述目标方法被触发时,则依次执行所述第一插桩代码、所述内部逻辑代码和所述第二插桩代码,以获取所述第二插桩代码输出的所述目标方法的耗时数据。
以第一插桩代码和第二插桩代码采集的都是CPU时间为例进行说明,在应用程序运行过程中,当目标方法被调用时,则会执行目标方法内部中的各个逻辑代码,而在本发明实施例中,该目标方法的实际的内部逻辑代码之前和之后分别插入了第一插桩代码和第二插桩代码,那么按照目标方法内部各个代码的排列顺序,则依次执行第一插桩代码、内部逻辑代码、第二插桩代码。其中,该第一插桩代码在内部逻辑代码运行之前运行,从而可以获取到该内部逻辑代码运行之前的CPU时间信息,例如t1;然后,执行内部逻辑代码,在内部逻辑代码执行完成之后,执行第二插桩代码;第二插桩代码则可以获取到在内部逻辑代码运行完成之后的CPU时间信息,例如t2,那么显然,t2减t1的运算结果就是该内部逻辑代码的执行所耗费的CPU时长。
其中,由于第一插桩代码设置的代码逻辑包括将获取的t1发送给第二插桩代码的代码逻辑,因此,第二插桩代码在执行获取CPU时间信息的代码逻辑之后,就可以执行接收该t1的代码逻辑,并计算第二插桩代码所获取的t2与接收到的t1之前的差值,该差值即为该目标方法在插桩前所实际具有的内部逻辑代码在执行过程中的所耗费的CPU的时长。其中,第二插桩代码可以将该差值输出。
对于时间类型包括系统时间、或时钟时间的情况,获取目标方法的系统时间的耗时时长的方法,与获取该目标方法的CPU耗时时间的方法类似,这里不再赘述。
另外,目标插桩代码在输出耗时数据时,可以连同该目标方法的方法名一起输出,即目标插桩代码还可以获取被插桩的目标方法的方法名,这样,一个目标方法中被插入的目标插桩代码所输出的数据可以包括耗时数据以及方法名。那么当被插桩对象包括多个目标方法时,则每个目标方法被插入的目标插桩代码都可以输出一组数据(例如包括方法名、耗时数据),从而使得耗时数据与该耗时数据对应的目标方法的方法名成组输出,相互关联,便于开发人员了解哪些方法比较耗时、耗时多少。
这样,本发明实施例通过将目标插桩代码的第一插桩代码和第二插桩代码分别插入在目标字节码中的目标方法的内部逻辑代码之前和之后,从而在应用程序运行过程中,若调用该目标方法,则可以依次执行第一插桩代码、内部逻辑代码和第二插桩代码,从而可以准确的获取到该内部逻辑代码的耗时时间,提升了耗时数据的统计准确度。
可选地,在步骤104之后,如图4所示,根据本发明实施例的方法还可以包括:
步骤105,若所述应用程序的预设配置文件包括预设时长区间,则在多个目标方法中筛选出耗时数据在所述预设时长区间内的目标方法;
其中,本发明实施例的应用程序的预设配置文件还可以配置有预设时长区间,从而只获取耗时数据在该预设时长区间内的目标方法的耗时数据。
本发明实施例的耗时数据的时间类型可以包括但不限于CPU时间、时钟时间、系统时间。也即,本发明实施例的插桩代码可以配置为对被插桩的目标方法统计以上任意一种耗时时间。
这里以预设插桩代码配置为统计CPU耗时时间为例进行说明,则预设配置文件中可以包括开发人员需要统计的CPU的预设时长区间,例如[3s,10s]。
经过步骤104可以获取到每个被监测的目标方法的CPU耗时时间,那么这里需要从多个目标方法中筛选出CPU耗时时间在3s~10s范围内的目标方法,这里筛选得到的目标方法才是需要提供给开发人员的。
步骤106,输出筛选得到的所述目标方法、以及与筛选得到的所述目标方法匹配的耗时数据。
其中,可以将步骤105筛选得到的目标方法的方法名,以及该目标方法的耗时数据提供给开发人员,从而便于开发人员对这些目标方法的代码进行修改调试,降低其CPU耗时时间,优化应用程序的性能。
需要说明的是,统计时钟时间、系统时间的耗时数据的方法与这里举例的CPU时间的耗时数据的统计方法类似,这里不再一一赘述。
这样,本发明实施例通过在应用程序的预设配置文件中配置预设时长区间,从而可以在获取到每个目标方法的耗时数据后,利用预设时长区间对目标方法进行进一步筛选,只将筛选后耗时数据在该预设时长区间内的目标方法的耗时数据提供给开发人员,这样,开发人员可以根据应用程序的调试需求,灵活的配置预设时长区间,从而识别到耗时时长在关注的预设时长区间内的目标方法,继而便于对该目标方法的执行代码进行优化。
可选地,上述预设耗时时长不仅可以预先配置在配置文件中,还可以通过动态配置的方式来实现,例如在应用程序的源代码开发阶段,编写好设置耗时时长区间的代码(例如设置了[3s,10s]的区间),该代码在插桩代码执行前执行。那么在应用程序运行过程中,在执行该代码后,可以在内存中写入耗时时长区间数据[3s,10s]。在获取到目标插桩代码输出的耗时数据后也会写入内存,在内存中将目标方法的耗时数据与该耗时时长区间数据[3s,10s]进行比较,即可利用该耗时时长区间数据对目标方法进行筛选,后续过程与上述在预设配置文件中配置预设耗时时长的方法类似,这里不再赘述。
那么在预设耗时时长基本不变的情况下,则可以在应用程序的代码开发阶段编写好设置耗时时长区间的代码,从而完成对耗时数据在预设耗时时长内的目标方法的耗时数据的统计。
可选地,所述目标插桩代码还用于获取线程信息,其中,所述线程信息为所述目标方法占用的目标线程的信息(例如线程名)。
可选地,用于获取线程信息的插桩代码配置为第一插桩代码或第二插桩代码。
在步骤103之后,如图5所示,根据本发明实施例的方法还可以包括:
步骤107,在所述应用程序运行过程中,当所述目标方法被触发时,运行所述目标插桩代码,以获取所述目标插桩代码输出的所述目标方法占用的目标线程的信息;
其中,本发明实施例的预设插桩代码不仅包括获取被插桩的目标方法的方法名的逻辑代码、该目标方法在执行过程中的耗时数据的逻辑代码,还可以获取该目标方法所占用线程的线程信息的逻辑代码。本步骤中,在目标方法被触发后,插入在所述目标方法内部的目标插桩代码被执行,从而可以获取到该目标方法在执行过程中所占用的线程的信息。
其中,本发明实施例对于上述步骤104和这里的步骤107之间的执行顺序不做限制。
步骤108,若所述应用程序的预设配置文件包括预设线程信息,则在多个目标方法中筛选出占用的目标线程的信息与所述预设线程信息匹配的目标方法;
其中,本发明实施例的应用程序的预设配置文件中可以配置有关注的线程信息,其中,关注的线程的数量可以是一个或多个。该预设线程信息可以包括线程的ID、线程的名称等。那么在获取到目标方法所占用的目标线程的信息后,可以将该目标线程的信息与预设配置文件中的预设线程信息进行匹配,如果预设线程信息中存在与该目标线程的信息匹配的线程信息,则说明该目标方法占用了本发明实施例的方法比较关注的线程,那么该目标方法的耗时数据是需要提供给开发人员查看的,因此,可以在多个目标方法中,筛选出占用的线程与预设线程信息匹配的目标方法,这里筛选得到的目标方法才是开发人员需要关注的方法。
可选地,该预设线程信息为主线程的线程信息。由于主线程的占用情况会影响应用程序的性能,因此,为了避免过多方法对主线程的占用,这里可以筛选出占用主线程的目标方法。
步骤109,输出筛选得到的所述目标方法、以及与筛选得到的所述目标方法匹配的耗时数据。
其中,可以将步骤108筛选得到的目标方法的方法名、以及该目标方法的耗时数据提供给开发人员查看。具体显示方法可以按照上文所述的预设策略来确定,这里不再赘述。
这样,本发明实施例在获取到每个目标方法的耗时数据的同时,还可以获取到每个目标方法所占用的线程信息,那么通过在应用程序的预设配置文件中指定预设线程信息,从而可以从被监测的多个目标方法中筛选出只占用与预设线程信息匹配的指定线程的目标方法,并将筛选得到的占用指定线程的目标方法的耗时数据提供给用户,实现了对指定线程对应的耗时数据的筛选,利于对应用程序的方法代码进行优化。
图6示出了本发明的一个应用程序实施例的架构图。
如图6所示,该应用程序从上到下包括应用代码层、监控框架层、代码注入框架层和编译环境层。
本发明实施例的应用程序可以安装在具有安卓操作系统的移动终端侧,该应用程序的编译环境包括Gradle运行环境、ASM(ASM是一个Java字节码操控框架)库;
应用代码层包括业务代码、基础模块和第三方SDK(软件开发工具包,SoftwareDevelopment Kit));
其中,监控框架层和代码注入框架层为能够实现本发明上述图1~图4实施例的数据获取方法的实例结构,因此,这里着重描述这两层的主要实现的功能:
应用程序的源代码在Gradle运行环境下编译完成后,可以得到多个Class文件;
代码注入框架层可以利用ASM库,来根据预设配置文件中的白名单、黑名单,对编译得到的多个Class文件进行筛选;然后,使用ASM库对筛选后的Class文件进行解析;接着,对解析后的Class文件进行修改,注入耗时监控代码(即上文的插桩代码);
在对Class文件修改后,代码注入框架层将插桩后的应用程序中的每个Class文件重新打包生成安装文件;
待安装文件被安装后,在应用程序的运行过程中,本发明实施例的监控框架层可以利用插桩代码对被监测的目标方法进行耗时数据的采集,并将采集到的耗时数据获取到本地,在本地以UI(User Interface,用户界面)的方式来显示耗时数据。
需要说明的是,对于方法实施例,为了简单描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本发明实施例并不受所描述的动作顺序的限制,因为依据本发明实施例,某些步骤可以采用其他顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作并不一定是本发明实施例所必须的。
与上述本发明实施例所提供的方法相对应,参照图7,示出了本发明一种数据获取装置实施例的结构框图,具体可以包括如下模块:
识别模块71,用于根据应用程序的预设配置文件,识别所述应用程序中待监测的目标字节码、以及所述目标字节码中待监测的目标方法;
转换模块72,用于将预设插桩代码转换为字节码形式的目标插桩代码;
插入模块73,用于调用预设插桩接口,在所述目标方法中内部逻辑代码的前后插入所述目标插桩代码,其中,所述目标插桩代码用于获取所述目标方法的耗时数据。
可选地,所述识别模块71包括:
第一筛选子模块,用于根据应用程序的预设配置文件中的字节码筛选参数,对所述应用程序的字节码进行筛选,识别与所述字节码筛选参数匹配的目标字节码,其中,所述字节码筛选参数包括以下至少之一:项目名、包名、类名;
第二筛选子模块,用于根据所述预设配置文件中的方法参数,对所述目标字节码中的方法进行筛选,识别所述目标字节码中的目标方法。
可选地,所述第二筛选子模块包括:
第一识别单元,用于若目标字节码中存在与所述预设配置文件中的方法参数相匹配的目标方法,则识别所述目标方法;
第二识别单元,用于若目标字节码中不存在与所述预设配置文件中的方法参数相匹配的目标方法,则将所述目标字节码中的每个方法识别为目标方法。
可选地,所述识别模块71还包括:
第一过滤子模块,用于若所述预设配置文件还包括黑名单,则根据所述黑名单,对所述第一筛选子模块筛选后的所述目标字节码进行过滤,得到待监测的目标字节码;
第二过滤子模块,用于若所述预设配置文件还包括黑名单,则根据所述黑名单,对所述第一过滤子模块过滤后得到的目标字节码中经过所述第二筛选子模块筛选后的所述目标方法进行过滤,得到待监测的目标方法。
可选地,所述插入模块73包括:
插入子模块,用于当所述目标插桩代码包括第一插桩代码和第二插桩代码时,调用预设插桩接口,在所述目标方法中内部逻辑代码之前插入所述第一插桩代码,在所述目标方法中内部逻辑代码之后插入所述第二插桩代码;
其中,所述第一插桩代码用于采集时间信息,并将所述时间信息传递至所述第二插桩代码;
所述第二插桩代码用于采集时间信息,并计算采集的时间信息与接收自所述第一插桩代码的时间信息的时间差值,其中,所述时间差值为所述目标方法的耗时数据。
可选地,所述第一插桩代码和所述第二插桩代码采集的时间信息对应的时间类型包括以下至少之一:
CPU时间、系统时间、时钟时间。
可选地,所述装置还包括:
第一执行模块,用于在所述应用程序运行过程中,当所述目标方法被触发时,则依次执行所述第一插桩代码、所述内部逻辑代码和所述第二插桩代码,以获取所述第二插桩代码输出的所述目标方法的耗时数据。
可选地,所述装置还包括:
第一筛选模块,用于若所述预设配置文件包括预设时长区间,则在多个目标方法中筛选出耗时数据在所述预设时长区间内的目标方法;
第一输出模块,用于输出筛选得到的所述目标方法、以及与筛选得到的所述目标方法匹配的耗时数据。
可选地,所述目标插桩代码还用于获取线程信息,其中,所述线程信息为所述目标方法占用的目标线程的信息。
可选地,所述装置还包括:
第二执行模块,用于在所述应用程序运行过程中,当所述目标方法被触发时,运行所述目标插桩代码,以获取所述目标插桩代码输出的所述目标方法占用的目标线程的信息;
第二筛选模块,用于若所述应用程序的预设配置文件包括预设线程信息,则在多个目标方法中筛选出占用的目标线程的信息与所述预设线程信息匹配的目标方法;
第二输出模块,用于输出筛选得到的所述目标方法、以及与筛选得到的所述目标方法匹配的耗时数据。
可选地,所述装置还包括:
打包模块,用于将所述应用程序中的每个字节码进行打包处理,生成插桩后的所述应用程序的安装文件;
安装模块,用于根据所述安装文件运行插桩后的所述应用程序。
可选地,所述识别模块71,还用于若检测到应用程序的源代码编译生成字节码,则根据应用程序的预设配置文件,识别所述字节码中待监测的目标字节码、以及所述目标字节码中待监测的目标方法。
对于装置实施例而言,由于其与方法实施例基本相似,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
根据本发明的又一个实施例,本发明还提供了一种电子设备,包括:存储器、处理器及存储在所述存储器上并可在所述处理器上运行的数据获取程序,所述数据获取程序被所述处理器执行时实现如上述任意一个实施例所述的数据获取方法的步骤。
根据本发明的再一个实施例,本发明还提供了一种计算机可读存储介质,所述计算机可读存储介质上存储有数据获取程序,所述数据获取程序被处理器执行时实现如上述任意一个实施例所述的数据获取方法中的步骤。
本说明书中的各个实施例均采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似的部分互相参见即可。
本领域内的技术人员应明白,本发明实施例的实施例可提供为方法、装置、或计算机程序产品。因此,本发明实施例可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明实施例可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本发明实施例是参照根据本发明实施例的方法、终端设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理终端设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理终端设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理终端设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理终端设备上,使得在计算机或其他可编程终端设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程终端设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
尽管已描述了本发明实施例的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例做出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本发明实施例范围的所有变更和修改。
最后,还需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者终端设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者终端设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者终端设备中还存在另外的相同要素。
以上对本发明所提供的一种数据获取方法、一种数据获取装置、一种电子设备、一种计算机可读存储介质,进行了详细介绍,本文中应用了具体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想;同时,对于本领域的一般技术人员,依据本发明的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本发明的限制。
Claims (26)
1.一种数据获取方法,其特征在于,包括:
根据应用程序的预设配置文件,识别所述应用程序中待监测的目标字节码、以及所述目标字节码中待监测的目标方法;
将预设插桩代码转换为字节码形式的目标插桩代码;
调用预设插桩接口,在所述目标方法中内部逻辑代码的前后插入所述目标插桩代码,其中,所述目标插桩代码用于获取所述目标方法的耗时数据。
2.根据权利要求1所述的方法,其特征在于,所述根据应用程序的预设配置文件,识别所述应用程序中待监测的目标字节码、以及所述目标字节码中待监测的目标方法,包括:
根据应用程序的预设配置文件中的字节码筛选参数,对所述应用程序的字节码进行筛选,识别与所述字节码筛选参数匹配的目标字节码,其中,所述字节码筛选参数包括以下至少之一:项目名、包名、类名;
根据所述预设配置文件中的方法参数,对所述目标字节码中的方法进行筛选,识别所述目标字节码中的目标方法。
3.根据权利要求2所述的方法,其特征在于,所述根据所述预设配置文件中的方法参数,对所述目标字节码中的方法进行筛选,识别所述目标字节码中的目标方法,包括:
若目标字节码中存在与所述预设配置文件中的方法参数相匹配的目标方法,则识别所述目标方法;
若目标字节码中不存在与所述预设配置文件中的方法参数相匹配的目标方法,则将所述目标字节码中的每个方法识别为目标方法。
4.根据权利要求2所述的方法,其特征在于,若所述预设配置文件还包括黑名单,则所述根据应用程序的预设配置文件,识别所述应用程序中待监测的目标字节码、以及所述目标字节码中待监测的目标方法,还包括:
根据所述黑名单,对筛选后的所述目标字节码进行过滤,得到待监测的目标字节码;
根据所述黑名单,对过滤后的目标字节码中的所述目标方法进行过滤,得到待监测的目标方法。
5.根据权利要求1所述的方法,其特征在于,所述目标插桩代码包括第一插桩代码和第二插桩代码,所述调用预设插桩接口,在所述目标方法中内部逻辑代码的前后插入所述目标插桩代码,包括:
调用预设插桩接口,在所述目标方法中内部逻辑代码之前插入所述第一插桩代码,在所述目标方法中内部逻辑代码之后插入所述第二插桩代码;
其中,所述第一插桩代码用于采集时间信息,并将所述时间信息传递至所述第二插桩代码;
所述第二插桩代码用于采集时间信息,并计算采集的时间信息与接收自所述第一插桩代码的时间信息的时间差值,其中,所述时间差值为所述目标方法的耗时数据。
6.根据权利要求5所述的方法,其特征在于,所述第一插桩代码和所述第二插桩代码采集的时间信息对应的时间类型包括以下至少之一:
CPU时间、系统时间、时钟时间。
7.根据权利要求5所述的方法,其特征在于,所述调用预设插桩接口,在所述目标方法中内部逻辑代码的前后插入所述目标插桩代码之后,所述方法还包括:
在所述应用程序运行过程中,当所述目标方法被触发时,则依次执行所述第一插桩代码、所述内部逻辑代码和所述第二插桩代码,以获取所述第二插桩代码输出的所述目标方法的耗时数据。
8.根据权利要求7所述的方法,其特征在于,所述在所述应用程序运行过程中,当所述目标方法被触发时,则依次执行所述第一插桩代码、所述内部逻辑代码和所述第二插桩代码,以获取所述第二插桩代码输出的所述目标方法的耗时数据之后,所述方法还包括:
若所述预设配置文件包括预设时长区间,则在多个目标方法中筛选出耗时数据在所述预设时长区间内的目标方法;
输出筛选得到的所述目标方法、以及与筛选得到的所述目标方法匹配的耗时数据。
9.根据权利要求1所述的方法,其特征在于,所述目标插桩代码还用于获取线程信息,其中,所述线程信息为所述目标方法占用的目标线程的信息。
10.根据权利要求9所述的方法,其特征在于,所述调用预设插桩接口,在所述目标方法中内部逻辑代码的前后插入所述目标插桩代码之后,所述方法还包括:
在所述应用程序运行过程中,当所述目标方法被触发时,运行所述目标插桩代码,以获取所述目标插桩代码输出的所述目标方法占用的目标线程的信息;
若所述应用程序的预设配置文件包括预设线程信息,则在多个目标方法中筛选出占用的目标线程的信息与所述预设线程信息匹配的目标方法;
输出筛选得到的所述目标方法、以及与筛选得到的所述目标方法匹配的耗时数据。
11.根据权利要求1所述的方法,其特征在于,所述调用预设插桩接口,在所述目标方法中内部逻辑代码的前后插入所述目标插桩代码,其中,所述目标插桩代码用于获取所述目标方法的耗时数据之后,所述方法还包括:
将所述应用程序中的每个字节码进行打包处理,生成插桩后的所述应用程序的安装文件;
根据所述安装文件运行插桩后的所述应用程序。
12.根据权利要求1所述的方法,其特征在于,所述根据应用程序的预设配置文件,识别所述应用程序中待监测的目标字节码、以及所述目标字节码中待监测的目标方法,包括:
若检测到应用程序的源代码编译生成字节码,则根据应用程序的预设配置文件,识别所述字节码中待监测的目标字节码、以及所述目标字节码中待监测的目标方法。
13.一种数据获取装置,其特征在于,包括:
识别模块,用于根据应用程序的预设配置文件,识别所述应用程序中待监测的目标字节码、以及所述目标字节码中待监测的目标方法;
转换模块,用于将预设插桩代码转换为字节码形式的目标插桩代码;
插入模块,用于调用预设插桩接口,在所述目标方法中内部逻辑代码的前后插入所述目标插桩代码,其中,所述目标插桩代码用于获取所述目标方法的耗时数据。
14.根据权利要求13所述的装置,其特征在于,所述识别模块包括:
第一筛选子模块,用于根据应用程序的预设配置文件中的字节码筛选参数,对所述应用程序的字节码进行筛选,识别与所述字节码筛选参数匹配的目标字节码,其中,所述字节码筛选参数包括以下至少之一:项目名、包名、类名;
第二筛选子模块,用于根据所述预设配置文件中的方法参数,对所述目标字节码中的方法进行筛选,识别所述目标字节码中的目标方法。
15.根据权利要求14所述的装置,其特征在于,所述第二筛选子模块包括:
第一识别单元,用于若目标字节码中存在与所述预设配置文件中的方法参数相匹配的目标方法,则识别所述目标方法;
第二识别单元,用于若目标字节码中不存在与所述预设配置文件中的方法参数相匹配的目标方法,则将所述目标字节码中的每个方法识别为目标方法。
16.根据权利要求14所述的装置,其特征在于,所述识别模块还包括:
第一过滤子模块,用于若所述预设配置文件还包括黑名单,则根据所述黑名单,对所述第一筛选子模块筛选后的所述目标字节码进行过滤,得到待监测的目标字节码;
第二过滤子模块,用于若所述预设配置文件还包括黑名单,则根据所述黑名单,对所述第一过滤子模块过滤后得到的目标字节码中经过所述第二筛选子模块筛选后的所述目标方法进行过滤,得到待监测的目标方法。
17.根据权利要求13所述的装置,其特征在于,所述插入模块包括:
插入子模块,用于当所述目标插桩代码包括第一插桩代码和第二插桩代码时,调用预设插桩接口,在所述目标方法中内部逻辑代码之前插入所述第一插桩代码,在所述目标方法中内部逻辑代码之后插入所述第二插桩代码;
其中,所述第一插桩代码用于采集时间信息,并将所述时间信息传递至所述第二插桩代码;
所述第二插桩代码用于采集时间信息,并计算采集的时间信息与接收自所述第一插桩代码的时间信息的时间差值,其中,所述时间差值为所述目标方法的耗时数据。
18.根据权利要求17所述的装置,其特征在于,所述第一插桩代码和所述第二插桩代码采集的时间信息对应的时间类型包括以下至少之一:
CPU时间、系统时间、时钟时间。
19.根据权利要求17所述的装置,其特征在于,所述装置还包括:
第一执行模块,用于在所述应用程序运行过程中,当所述目标方法被触发时,则依次执行所述第一插桩代码、所述内部逻辑代码和所述第二插桩代码,以获取所述第二插桩代码输出的所述目标方法的耗时数据。
20.根据权利要求19所述的装置,其特征在于,所述装置还包括:
第一筛选模块,用于若所述预设配置文件包括预设时长区间,则在多个目标方法中筛选出耗时数据在所述预设时长区间内的目标方法;
第一输出模块,用于输出筛选得到的所述目标方法、以及与筛选得到的所述目标方法匹配的耗时数据。
21.根据权利要求13所述的装置,其特征在于,所述目标插桩代码还用于获取线程信息,其中,所述线程信息为所述目标方法占用的目标线程的信息。
22.根据权利要求21所述的装置,其特征在于,所述装置还包括:
第二执行模块,用于在所述应用程序运行过程中,当所述目标方法被触发时,运行所述目标插桩代码,以获取所述目标插桩代码输出的所述目标方法占用的目标线程的信息;
第二筛选模块,用于若所述应用程序的预设配置文件包括预设线程信息,则在多个目标方法中筛选出占用的目标线程的信息与所述预设线程信息匹配的目标方法;
第二输出模块,用于输出筛选得到的所述目标方法、以及与筛选得到的所述目标方法匹配的耗时数据。
23.根据权利要求13所述的装置,其特征在于,所述装置还包括:
打包模块,用于将所述应用程序中的每个字节码进行打包处理,生成插桩后的所述应用程序的安装文件;
安装模块,用于根据所述安装文件运行插桩后的所述应用程序。
24.根据权利要求13所述的装置,其特征在于,
所述识别模块,还用于若检测到应用程序的源代码编译生成字节码,则根据应用程序的预设配置文件,识别所述字节码中待监测的目标字节码、以及所述目标字节码中待监测的目标方法。
25.一种电子设备,其特征在于,包括:存储器、处理器及存储在所述存储器上并可在所述处理器上运行的数据获取程序,所述数据获取程序被所述处理器执行时实现如权利要求1至12中任一项所述的数据获取方法的步骤。
26.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质上存储有数据获取程序,所述数据获取程序被处理器执行时实现如权利要求1至12中任一项所述的数据获取方法中的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910263004.1A CN110134400A (zh) | 2019-04-02 | 2019-04-02 | 数据获取方法、装置、电子设备及计算机可读存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910263004.1A CN110134400A (zh) | 2019-04-02 | 2019-04-02 | 数据获取方法、装置、电子设备及计算机可读存储介质 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN110134400A true CN110134400A (zh) | 2019-08-16 |
Family
ID=67569216
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201910263004.1A Pending CN110134400A (zh) | 2019-04-02 | 2019-04-02 | 数据获取方法、装置、电子设备及计算机可读存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN110134400A (zh) |
Cited By (17)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110609703A (zh) * | 2019-09-18 | 2019-12-24 | 腾讯科技(深圳)有限公司 | 性能检测工具实现方法、装置、可读存储介质及终端设备 |
CN111078631A (zh) * | 2019-12-20 | 2020-04-28 | 广州品唯软件有限公司 | 文件的处理方法、终端设备及存储介质 |
CN111240927A (zh) * | 2020-01-03 | 2020-06-05 | 北京小米移动软件有限公司 | 检测程序中方法耗时的方法、装置及存储介质 |
CN111460516A (zh) * | 2020-06-22 | 2020-07-28 | 腾讯科技(深圳)有限公司 | 基于非侵入式的数据保护方法、装置、终端及存储介质 |
CN111679831A (zh) * | 2020-06-04 | 2020-09-18 | 同盾控股有限公司 | 软件开发包处理方法、运行监控方法、装置及存储介质 |
CN112099798A (zh) * | 2020-09-16 | 2020-12-18 | 广州虎牙科技有限公司 | 公有函数执行耗时的统计方法、装置、存储介质及终端 |
CN112114810A (zh) * | 2020-08-13 | 2020-12-22 | 浙江大搜车融资租赁有限公司 | 编译处理方法及装置 |
CN112650533A (zh) * | 2020-12-22 | 2021-04-13 | 深圳前海微众银行股份有限公司 | 接口文档的生成方法、装置和终端设备 |
CN112925523A (zh) * | 2021-03-02 | 2021-06-08 | 京东数字科技控股股份有限公司 | 对象比较方法、装置、设备及计算机可读介质 |
CN112947929A (zh) * | 2021-01-28 | 2021-06-11 | 北京字节跳动网络技术有限公司 | 应用程序安装包的构建方法、装置、计算机设备和介质 |
CN113010555A (zh) * | 2021-03-11 | 2021-06-22 | 京东数字科技控股股份有限公司 | 数据流输入参数的采集方法、装置、设备和存储介质 |
CN113448585A (zh) * | 2020-12-11 | 2021-09-28 | 北京新氧科技有限公司 | 一种对线程池的优化方法、装置、电子设备和存储介质 |
CN113721920A (zh) * | 2021-08-30 | 2021-11-30 | 济南浪潮数据技术有限公司 | 一种应用组件的诊断方法、系统、电子设备及存储介质 |
CN113885879A (zh) * | 2021-10-25 | 2022-01-04 | 上海商米科技集团股份有限公司 | 字节码插桩方法、系统和字节码插桩插件框架 |
CN114398285A (zh) * | 2022-01-19 | 2022-04-26 | 腾讯科技(深圳)有限公司 | 一种代码检测方法、装置、电子设备和存储介质 |
WO2022100485A1 (zh) * | 2020-11-10 | 2022-05-19 | 南京中兴新软件有限责任公司 | 插件资源管理的方法和装置、电子设备、计算机可读介质 |
CN115145585A (zh) * | 2022-07-19 | 2022-10-04 | 重庆长安汽车股份有限公司 | 一种数据采集方法、系统、电子设备及存储介质 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106649063A (zh) * | 2016-11-22 | 2017-05-10 | 腾讯科技(深圳)有限公司 | 用于监测程序运行时耗时数据的方法及系统 |
CN107038103A (zh) * | 2017-04-14 | 2017-08-11 | 上海交通大学 | 基于字节码插桩的Android程序监控系统及方法 |
US20180107821A1 (en) * | 2015-01-01 | 2018-04-19 | Checkmarx Ltd. | Code instrumentation for runtime application self-protection |
CN108984203A (zh) * | 2018-06-08 | 2018-12-11 | 广东伊莱特电器有限公司 | 一种用于Android应用运行时数据采集的方法及其系统 |
-
2019
- 2019-04-02 CN CN201910263004.1A patent/CN110134400A/zh active Pending
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20180107821A1 (en) * | 2015-01-01 | 2018-04-19 | Checkmarx Ltd. | Code instrumentation for runtime application self-protection |
CN106649063A (zh) * | 2016-11-22 | 2017-05-10 | 腾讯科技(深圳)有限公司 | 用于监测程序运行时耗时数据的方法及系统 |
CN107038103A (zh) * | 2017-04-14 | 2017-08-11 | 上海交通大学 | 基于字节码插桩的Android程序监控系统及方法 |
CN108984203A (zh) * | 2018-06-08 | 2018-12-11 | 广东伊莱特电器有限公司 | 一种用于Android应用运行时数据采集的方法及其系统 |
Cited By (24)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110609703B (zh) * | 2019-09-18 | 2024-02-23 | 腾讯科技(深圳)有限公司 | 性能检测工具实现方法、装置、可读存储介质及终端设备 |
CN110609703A (zh) * | 2019-09-18 | 2019-12-24 | 腾讯科技(深圳)有限公司 | 性能检测工具实现方法、装置、可读存储介质及终端设备 |
CN111078631A (zh) * | 2019-12-20 | 2020-04-28 | 广州品唯软件有限公司 | 文件的处理方法、终端设备及存储介质 |
CN111078631B (zh) * | 2019-12-20 | 2024-01-30 | 广州品唯软件有限公司 | 文件的处理方法、终端设备及存储介质 |
CN111240927A (zh) * | 2020-01-03 | 2020-06-05 | 北京小米移动软件有限公司 | 检测程序中方法耗时的方法、装置及存储介质 |
CN111240927B (zh) * | 2020-01-03 | 2024-01-30 | 北京小米移动软件有限公司 | 检测程序中方法耗时的方法、装置及存储介质 |
CN111679831A (zh) * | 2020-06-04 | 2020-09-18 | 同盾控股有限公司 | 软件开发包处理方法、运行监控方法、装置及存储介质 |
CN111460516A (zh) * | 2020-06-22 | 2020-07-28 | 腾讯科技(深圳)有限公司 | 基于非侵入式的数据保护方法、装置、终端及存储介质 |
CN112114810A (zh) * | 2020-08-13 | 2020-12-22 | 浙江大搜车融资租赁有限公司 | 编译处理方法及装置 |
CN112099798A (zh) * | 2020-09-16 | 2020-12-18 | 广州虎牙科技有限公司 | 公有函数执行耗时的统计方法、装置、存储介质及终端 |
CN112099798B (zh) * | 2020-09-16 | 2024-04-19 | 广州虎牙科技有限公司 | 公有函数执行耗时的统计方法、装置、存储介质及终端 |
WO2022100485A1 (zh) * | 2020-11-10 | 2022-05-19 | 南京中兴新软件有限责任公司 | 插件资源管理的方法和装置、电子设备、计算机可读介质 |
CN113448585B (zh) * | 2020-12-11 | 2024-01-16 | 北京新氧科技有限公司 | 一种线程池的编译方法、装置、电子设备和存储介质 |
CN113448585A (zh) * | 2020-12-11 | 2021-09-28 | 北京新氧科技有限公司 | 一种对线程池的优化方法、装置、电子设备和存储介质 |
CN112650533B (zh) * | 2020-12-22 | 2024-03-19 | 深圳前海微众银行股份有限公司 | 接口文档的生成方法、装置和终端设备 |
CN112650533A (zh) * | 2020-12-22 | 2021-04-13 | 深圳前海微众银行股份有限公司 | 接口文档的生成方法、装置和终端设备 |
CN112947929B (zh) * | 2021-01-28 | 2023-11-24 | 抖音视界有限公司 | 应用程序安装包的构建方法、装置、计算机设备和介质 |
CN112947929A (zh) * | 2021-01-28 | 2021-06-11 | 北京字节跳动网络技术有限公司 | 应用程序安装包的构建方法、装置、计算机设备和介质 |
CN112925523A (zh) * | 2021-03-02 | 2021-06-08 | 京东数字科技控股股份有限公司 | 对象比较方法、装置、设备及计算机可读介质 |
CN113010555A (zh) * | 2021-03-11 | 2021-06-22 | 京东数字科技控股股份有限公司 | 数据流输入参数的采集方法、装置、设备和存储介质 |
CN113721920A (zh) * | 2021-08-30 | 2021-11-30 | 济南浪潮数据技术有限公司 | 一种应用组件的诊断方法、系统、电子设备及存储介质 |
CN113885879A (zh) * | 2021-10-25 | 2022-01-04 | 上海商米科技集团股份有限公司 | 字节码插桩方法、系统和字节码插桩插件框架 |
CN114398285A (zh) * | 2022-01-19 | 2022-04-26 | 腾讯科技(深圳)有限公司 | 一种代码检测方法、装置、电子设备和存储介质 |
CN115145585A (zh) * | 2022-07-19 | 2022-10-04 | 重庆长安汽车股份有限公司 | 一种数据采集方法、系统、电子设备及存储介质 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN110134400A (zh) | 数据获取方法、装置、电子设备及计算机可读存储介质 | |
EP2598989B1 (en) | Developing programs in a graphical specification and constraint language | |
CN102597964B (zh) | 用于启用并行测试的计算装置 | |
US9612943B2 (en) | Prioritization of tests of computer program code | |
US8892953B2 (en) | Method and system for test suite control | |
Mariani et al. | Compatibility and regression testing of COTS-component-based software | |
US8359292B2 (en) | Semantic grouping for program performance data analysis | |
US20130318504A1 (en) | Execution Breakpoints in an Integrated Development Environment for Debugging Dataflow Progrrams | |
CN108108297A (zh) | 自动化测试的方法和装置 | |
CN105446868B (zh) | 系统兼容性测试方法、测试用例管理方法及相关装置 | |
CN105068929A (zh) | 测试脚本生成方法和装置、测试方法、测试装置以及测试系统 | |
CN105260315A (zh) | 一种在嵌入式系统进程中调试日志的方法 | |
CN105094783A (zh) | 安卓应用稳定性测试的方法及装置 | |
US20080010535A1 (en) | Automated and configurable system for tests to be picked up and executed | |
CN102375778A (zh) | 实现数字信号处理器自动测试的方法及系统 | |
CN107832059A (zh) | 一种基于Makefile的代码静态分析方法和装置 | |
CN106529304B (zh) | 一种安卓应用并发漏洞检测系统 | |
WO2014005762A1 (en) | Editor/development tool for dataflow programs | |
CN103927473A (zh) | 检测移动智能终端的源代码安全的方法、装置及系统 | |
CN111428431A (zh) | 一种支持eda软件的自动化测试并记录的方法及系统 | |
CN106681897A (zh) | 一种代码调试方法及装置 | |
CN101980546B (zh) | 智能网平台、业务执行方法和分析业务异常的方法 | |
CN109634569A (zh) | 基于注解的流程实现方法、装置、设备及可读存储介质 | |
CN110609703B (zh) | 性能检测工具实现方法、装置、可读存储介质及终端设备 | |
EP2972880B1 (en) | Kernel functionality checker |
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: 20190816 |