CN107025173B - 一种函数执行时间的测试方法及装置 - Google Patents
一种函数执行时间的测试方法及装置 Download PDFInfo
- Publication number
- CN107025173B CN107025173B CN201710218404.1A CN201710218404A CN107025173B CN 107025173 B CN107025173 B CN 107025173B CN 201710218404 A CN201710218404 A CN 201710218404A CN 107025173 B CN107025173 B CN 107025173B
- Authority
- CN
- China
- Prior art keywords
- function
- tested
- tracking process
- testing
- execution time
- 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
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3668—Software testing
- G06F11/3672—Test management
- G06F11/3688—Test management for test execution, e.g. scheduling of test suites
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Debugging And Monitoring (AREA)
Abstract
本发明公开了一种函数执行时间的测试方法及装置,其中该方法包括:接收测试指令,并根据该测试指令获取函数跟踪进程,该函数跟踪进程用于获取待测试函数的时间测试参数;通过预设钩子函数对函数跟踪进程进行挂起,并触发开启跟踪功能;在开启跟踪功能后,确定待测试函数是否满足预设条件;当确定待测试函数满足预设条件时,返回函数跟踪进程,并测试出待测试函数的执行时间。由于利用钩子对函数跟踪进程进行挂起,改变了待测试函数的执行路径,且在开启跟踪功能后,先对待测试函数进行判断,满足预设条件的函数才进行测试和记录函数耗时的逻辑,因此可以过滤掉一些无用的函数耗时数据,大大减少函数耗时数据的内存占用空间,降低***资源浪费。
Description
技术领域
本发明属于通信技术领域,尤其涉及一种函数执行时间的测试方法及装置。
背景技术
目前在对电子设备(如手机、平板电脑、电视等)的性能进行测试时,需要定位当前应用程序(app,application)调用了哪些函数并且这些函数调用或占用中央处理器(CPU,Central Processing Unit)的执行时间,帮助开发人员和测试人员能够更快定位和查找到相应的函数位置。
如,通过traceView(一种测试应用程序性能的工具)进行测试时,从抓取执行的函数开始计算耗时,到抓取该进程所有被执行的函数,得到的函数耗时数据在短时间内3至5秒就可以达到8M(兆字节),从而造成***内存空间占用较大,***资源浪费。
发明内容
本发明的目的在于提供一种函数执行时间的测试方法及装置,旨在减少函数耗时数据的内存占用空间,降低***资源浪费。
为解决上述技术问题,本发明实施例提供以下技术方案:
第一方面,本发明提供一种函数执行时间的测试方法,其中包括:
接收测试指令,并根据所述测试指令获取函数跟踪进程,所述函数跟踪进程用于获取待测试函数的时间测试参数;
通过预设钩子函数对所述函数跟踪进程进行挂起,并触发开启跟踪功能;
在开启跟踪功能后,确定待测试函数是否满足预设条件;
当确定所述待测试函数满足预设条件时,返回所述函数跟踪进程,并测试出所述待测试函数的执行时间。
第二方面,本发明一种函数执行时间的测试装置,其中包括:
接收单元,用于接收测试指令;
获取单元,用于根据所述测试指令获取函数跟踪进程,所述函数跟踪进程用于获取待测试函数的时间测试参数;
挂起单元,用于通过预设钩子函数对所述函数跟踪进程进行挂起,并触发开启跟踪功能;
确定单元,用于在开启跟踪功能后,确定待测试函数是否满足预设条件;
测试单元,用于当确定所述待测试函数满足预设条件时,返回所述函数跟踪进程,并测试出所述待测试函数的执行时间。
相对于现有技术,本实施例,在接收到测试指令后,可以先获取函数跟踪进程,并通过预设钩子函数对函数跟踪进程进行挂起,其中函数跟踪进程用于获取待测试函数的时间测试参数,在挂起函数跟踪进程后开启跟踪功能,当确定待测试函数满足预设条件时,返回函数跟踪进程,并测试出待测试函数的执行时间;由于利用钩子对函数跟踪进程进行挂起,改变了待测试函数的执行路径,且在开启跟踪功能后,先对待测试函数进行判断,满足预设条件的函数才进行测试和记录函数耗时的逻辑,因此可以过滤掉一些无用的函数耗时数据,大大的减少函数耗时数据的内存占用空间,降低***资源浪费。
附图说明
下面结合附图,通过对本发明的具体实施方式详细描述,将使本发明的技术方案及其它有益效果显而易见。
图1是本发明实施例提供的函数执行时间的测试方法的流程示意图;
图2为本发明实施例提供的函数执行时间的测试方法的另一流程示意图;
图3a为本发明实施例提供的函数执行时间的测试装置的结构示意图;
图3b为本发明实施例提供的函数执行时间的测试装置的另一结构示意图;
图4为本发明实施例提供的终端的结构示意图。
具体实施方式
请参照图式,其中相同的组件符号代表相同的组件,本发明的原理是以实施在一适当的运算环境中来举例说明。以下的说明是基于所例示的本发明具体实施例,其不应被视为限制本发明未在此详述的其它具体实施例。
在以下的说明中,本发明的具体实施例将参考由一部或多部计算机所执行的步骤及符号来说明,除非另有述明。因此,这些步骤及操作将有数次提到由计算机执行,本文所指的计算机执行包括了由代表了以一结构化型式中的数据的电子信号的计算机处理单元的操作。此操作转换该数据或将其维持在该计算机的内存***中的位置处,其可重新配置或另外以本领域测试人员所熟知的方式来改变该计算机的运作。该数据所维持的数据结构为该内存的实***置,其具有由该数据格式所定义的特定特性。但是,本发明原理以上述文字来说明,其并不代表为一种限制,本领域测试人员将可了解到以下所述的多种步骤及操作亦可实施在硬件当中。
本文所使用的术语「模块」可看做为在该运算***上执行的软件对象。本文所述的不同组件、模块、引擎及服务可看做为在该运算***上的实施对象。而本文所述的装置及方法优选的以软件的方式进行实施,当然也可在硬件上进行实施,均在本发明保护范围之内。
本发明实施例提供一种函数执行时间的测试方法及装置。
其中,该函数执行时间的测试装置具体可以集成在如手机、平板电脑、掌上电脑(PDA,Personal Digital Assistant)等终端中,也可以集成在服务器,如测试服务器中。
例如,在本实施例中,将从函数执行时间的测试装置的角度进行描述,该函数执行时间的测试装置具体可以集成在终端等设备中。
一种函数执行时间的测试方法,包括:接收测试指令,并根据该测试指令获取函数跟踪进程,该函数跟踪进程用于获取待测试函数的时间测试参数;通过预设钩子函数对函数跟踪进程进行挂起,并触发开启跟踪功能;在开启跟踪功能后,确定待测试函数是否满足预设条件;当确定待测试函数满足预设条件时,返回函数跟踪进程,并测试出待测试函数的执行时间。
请参阅图1,图1是本发明实施例提供的函数执行时间的测试方法的流程示意图。该方法可具体包括:
在步骤S101中,接收测试指令,并根据测试指令获取函数跟踪进程,该函数跟踪进程用于获取待测试函数的时间测试参数。
例如,具体可以接收用户通过终端上的输入控件发送的测试指令,或接收其他设备发送的测试指令;然后在接收到测试指令之后,获取函数跟踪进程,其中,该函数跟踪进程可以从本地存储空间中获取。
本发明实施例中,该函数跟踪进程可理解为获取待测试函数(即被执行函数)的入口,对待测试函数进行跟踪测试的函数,主要用于获取待测试函数的时间测试参数,如获取待测试函数所属的线程、待测试函数方法的指针地址、待测试函数的执行状态(如在执行中还是已经执行完毕),等等。
在某些实施方式中,“根据测试指令获取函数跟踪进程”可以具体如下:
(11)在接收到测试指令时,确定操作***版本信息。
比如,在接收到测试指令时,首先确定当前测试平台的操作***版本信息,以安卓(Android)***平台为例,先确定操作***的版本信息,如Android4.4、Android5.0等等。
(12)根据该操作***版本信息,获取相应的函数跟踪进程。
进一步的,根据确定的操作***的版本信息,获取相应的函数跟踪进程,比如,可具体的,目前Android4.4及其以下的版本中,对应的是dalvik模式,Android4.4以上的版本中,对应的是art模式,其中,dalvik以及art为用于Android平台的Java虚拟机。
其中,dalvik模式相应的函数跟踪进程为“dvmMethodTraceAdd()”函数,art模式相应的函数跟踪进程为“LogMethodTraceEvent()”函数。
在步骤S102中,通过预设钩子函数对函数跟踪进程进行挂起,并触发开启跟踪功能。
可以理解的是,目前在启动跟踪功能(Trace功能)后,待测试函数在执行时,一定会执行函数跟踪进程,因此,本发明实施例,可以利用钩子hook技术在初始化时将函数跟踪进程挂起(hook掉),hook后再开启跟踪功能。
本实施例中,此处挂起又可称为钩起,将函数跟踪进程挂起(hook掉)就是说暂不执行函数跟踪进程的逻辑,其中,该预设钩子函数可具体包括内联钩子(inline hook)函数,inline hook函数主要是指通过hook“接触”到需要修改的函数(即函数跟踪进程)入口点,在动态库执行内部函数调用时,改变函数跳转指令,使***跳转到自定义的外部函数上执行。
比如,目前在启动跟踪功能后,待测试函数在执行时,在dalvik机器上会执行“dvmMethodTraceAdd()”函数,在art机器上会执行“LogMethodTraceEvent()”函数,因此该实施例中,在执行函数跟踪进程前,先利用hook技术在初始化时将获取到的“dvmMethodTraceAdd()”函数或者“LogMethodTraceEvent()”函数hook掉。
在步骤S103中,在开启跟踪功能后,确定待测试函数是否满足预设条件。
在某些实施方式中,“开启跟踪功能后,确定待测试函数是否满足预设条件”的方式有很多,比如,可以具体包括:
(21)在开启跟踪功能后,获取待测试函数的预设参数信息。
其中,待测试函数的预设参数信息可以具体为方法类(Method)参数,由此,“在开启跟踪功能后,获取待测试函数的预设参数信息”可以具体为:在开启跟踪功能后,获取待测试函数的方法类参数。
(22)根据预设参数信息,判断待测试函数为***函数或非***函数。
例如,可以具体为根据该待测试函数的方法类参数,判断待测试函数为***函数或非***函数。
可以理解的是,在开启跟踪功能后自动跳转到自定义函数,即待测试函数中,并在自定义函数中增加处理逻辑,如判断待测试函数为***函数或非***函数的判断程序。
进一步的,在某些实施方式中,函数执行时间的测试装置“根据该待测试函数的方法类参数,判断待测试函数为***函数或非***函数”的方式有很多,比如可具体包括:
22-1、在方法类参数的成员变量中,提取类地址指针变量的成员变量。
22-2、根据类地址指针变量的成员变量,确定类加载器变量的值。
其中,类地址指针(declaring_class_)变量为方法类(Method)参数的成员变量之一,在获取到类地址指针变量后,再提取类地址指针变量中的成员变量——类加载器(class_loader_)变量,并根据类加载器变量的值来判断待测试函数为***函数或非***函数。
22-3、若确定类加载器变量的值为空,则判断出待测试函数为***函数。
22-4、若确定类加载器变量的值不为空,则判断出待测试函数为非***函数。
在一种实施方式中,如果确定类加载器变量的值为空,则可以确定该待测试函数为***函数,在另一种实施方式中,如果确定类加载器变量的值不为空,则可以确定出待测试函数为非***函数。
本发明实施例中,把被执行的待测试函数分为两大类,***函数与非***函数,其中此处***函数实际上是区别于应用上层函数,指的是Android程序运行的过程中,所属于Linux核心层,***运行库层、框架层的函数,例如所属类名以android.*,java.*,org.*等开头的函数;除外,将其他函数确定为非***函数。
(23)若判断出该待测试函数为非***函数,则确定待测试函数满足预设条件。
(24)若判断出该待测试函数为***函数,则确定待测试函数不满足预设条件。
由于***函数属于业务侧函数,在开启跟踪trace功能后,生成的trace文件中,***函数总数占比较大,并且对于分析性能(如卡顿问题)没有帮助,因此本实施例中,如果在确定待测试函数为***函数时,终止运行测试和记录函数耗时的逻辑,如果在确定待测试函数为非***函数时,继续运行测试和记录函数耗时的逻辑。
在步骤S104中,当确定待测试函数满足预设条件时,返回函数跟踪进程,并测试出该待测试函数的执行时间。
可以理解的是,在一种实施方式中,函数执行时间的测试装置确定待测试函数满足预设条件时,可以继续运行测试和记录函数耗时的逻辑,例如,可具体包括:
(31)当确定待测试函数满足预设条件时,返回被挂起的函数跟踪进程,并在该函数跟踪进程中提取该待测试函数的时间测试参数。
(32)根据该时间测试参数,测试待测试函数的执行时间。
在确定待测试函数为非***函数时,返回被挂起的函数跟踪进程,在该函数跟踪进程中提取该待测试函数的时间测试参数,如待测试函数所属的线程、待测试函数方法的指针地址、待测试函数的执行状态(如在执行中还是已经执行完毕),并根据这些时间测试参数测试待测试函数的执行时间,从而可以测试得到函数占用内存、函数调用CPU的时间和占用CPU的执行时间等各方面性能。
在另一种实施方式中,“确定待测试函数是否满足预设条件”之后,还可以包括如下步骤:
当确定待测试函数不满足预设条件时,将该待测试函数进行过滤,并终止测试待测试函数的执行时间。
也就是说,在确定待测试函数为***函数时,将***函数这部分无用的函数耗时数据进行过滤,不再往下执行运行测试和记录函数耗时的逻辑,继续进行下一个待测试函数。
由上述可知,本实施例提供的函数执行时间的测试方法,在接收到测试指令后,可以先获取函数跟踪进程,并通过预设钩子函数对函数跟踪进程进行挂起,其中函数跟踪进程用于获取待测试函数的时间测试参数,在挂起函数跟踪进程后开启跟踪功能,当确定待测试函数满足预设条件时,返回函数跟踪进程,并测试出待测试函数的执行时间;由于利用钩子对函数跟踪进程进行挂起,改变了待测试函数的执行路径,且在开启跟踪功能后,先对待测试函数进行判断,满足预设条件的函数才进行测试和记录函数耗时的逻辑,因此可以过滤掉一些无用的函数耗时数据,大大的减少函数耗时数据的内存占用空间,降低***资源浪费。
根据上一实施例所描述的方法,以下将举例作进一步详细说明。
首先,目前在对电子设备(如手机、平板电脑、电视等)的性能进行分析时,会使用traceView工具去测试被执行函数调用或占用中央处理器CPU的执行时间,以帮助测试人员能够更快定位到相应的函数位置;其中,traceView工具是Android平台上性能测试与分析的工具,它通过图形化的方式让测试人员了解要跟踪的函数的性能。但是由于在使用traceView工具的方案中,测试得到的函数耗时数据,不仅数据量大,而且包含了很多无用的函数耗时数据。
基于此,本发明实施例利用inlineHook(内联钩子)技术过滤掉无用的函数耗时数据,其中inlineHook主要是指通过hook“接触”到需要修改的函数入口点,在动态库执行内部函数调用时,改变函数跳转指令,使***跳转到自定义的外部函数上执行。以下将进行详细说明。
请参阅图2,图2为本发明实施例提供的函数执行时间的测试方法的流程示意图。该方法包括:
在步骤S201中,终端接收到测试指令后,钩子hook初始化,并将A函数进行hook。
在步骤S202中,终端在A函数被hook后,开启跟踪Trace功能。
为方便描述,本实施例将用于获取待测试函数的时间测试参数的函数跟踪进程简称为A函数,A函数是开启跟踪Trace功能后,运行路径里一定会执行的函数之一。A函数可理解为获取待测试函数(即被执行函数)的入口,对待测试函数进行跟踪测试的函数;其中,此处A函数可具体包括“dvmMethodTraceAdd()”函数以及“LogMethodTraceEvent()”函数。
可以理解的是,目前由于在启动Trace功能后,每个待测试函数被执行时,在dalvik机器上会执行dvmMethodTraceAdd()函数,或者在art机器上会执行LogMethodTraceEvent()函数,也就是说,都会经过dvmMethodTraceAdd()函数或LogMethodTraceEvent()函数的处理,A函数是开启Trace功能后,路径里面一定会执行的函数之一。
因此,该实施例中,在启动函数跟踪前,先利用hook技术在初始化时将dvmMethodTraceAdd()函数或者LogMethodTraceEvent()函数hook掉。
其中,A函数作用是获取被执行函数所属的线程、函数方法的指针地址,函数的执行状态(如在执行中还是已经执行完毕)等,获取这些信息为后续计算函数耗时做准备。
在步骤S203中,终端开启Trace功能后自动跳转到自定义函数my_A函数中。
可具体的,终端在A函数被hook后,开启Trace功能,如通过hook“接触”到需要修改的A函数入口点,在动态库执行A函数内部函数调用时,改变函数跳转指令,使***自动跳转到自定义的my_A函数上执行。
其中,my_A函数包含待测试函数以及待测试函数的判断处理逻辑,如判断待测试函数为***函数或非***函数的判断程序。
在步骤S204中,终端判断待测试函数为***函数或非***函数。
可以理解的是,在开启Trace过程中,执行的待测试函数的多种多样,这里可以把这些函数分为两大类,***函数和非***函数,
比如,待测试函数的参数之一方法类(Method)参数,如果其成员变量类地址指针(declaring_class_)变量中,成员变量类加载器(class_loader_)变量的值为空,则可以表示该待测试函数为***函数;相反,如果成员变量类加载器变量的值不为空,则可以表示该待测试函数为非***函数。
其中,类地址指针(declaring_class_)定义一个指向某个类的指针地址,通过这个变量可以获取这个类的地址,以方便调用;类加载器(class_loader_)负责加载Java的核心类,主要用于判断类加载的情况,如果这个变量的值是空的话表示是***类加载器,如果不为空的话表示是非***类加载器。
在步骤S205a中,终端确定待测试函数为非***函数时,返回A函数,并执行测试函数执行时间的流程。
在步骤S205b中,终端确定待测试函数为***函数时,将该待测试函数进行过滤,并终止执行测试函数执行时间的流程。
在一种实施方式中,如果终端确定待测试函数为非***函数时,原函数返回,即返回A函数,继续走测试和记录函数耗时的逻辑;该实施方式中,函数运行路径a可以为:
A函数→将A函数hook,跳转到my_A函数→判断执行的待测试函数是否为***函数→为非***函数,返回A函数→执行A函数剩余逻辑,测试函数执行时间。
在另一种实施方式中,如果确定待测试函数为***函数,则返回不做任何事情,即该待测试函数进行过滤,从而终止该函数计算函数耗时的逻辑;该实施方式中,函数运行路径b可以为:
A函数→将A函数hook,跳转到my_A函数→判断执行的待测试函数是否为***函数→为***函数,不执行A函数剩余逻辑,直接返回,即终止A函数的执行,继续重复以上路径,判断下一个待测试函数。
需说明的是,对于每一个被执行的待测试函数都要经过运行路径a或者运行路径b,并按照设定好的次序逐一进行判断。
可以理解的是,Traceview工具是通过图形化的方式让测试人员了解要跟踪的函数的性能,而本发明提出的测试方法,是基于Traceview工具原理,利用inlineHook技术对Trace进行改造,从而可以针对不同的操作***都可去掉一些无用的函数耗时数据。
其中,本发明利用inlineHook技术对Trace进行改造可具体如下:首先找到Trace获取函数耗时的必经路径,利用inlineHook技术修改必经路径,并跳转到自定义函数当中,自定义函数中增加对待测试函数的相关判断处理逻辑,以达到对***Trace进行改造,将无用的***函数耗时数据过滤掉。
由于本方案是在将函数内部实现做了hook处理,而无需依赖连接外部的测试设备,也无需带界面,因此可以认为是形成了轻量的trace,又称Minitrace,不仅可以过滤无用的函数耗时数据,减少生成的文件大小,还提高了性能,扩大了应用场景。
该Minitrace可以应用到基于安卓***的终端设备中,对终端应用性能进行测试,比如,可以将Minitrace结合到终端应用程序中,在操作终端应用时,如果发生卡顿,终端应用会触发Minitrace生成trace文件,从而可以分析终端应用哪里发生卡顿,实现快速定位,分析结果反馈至开发人员或测试人员后,实现对应用程序性能进行测试。
由上述可知,本实施例提供的函数执行时间的测试方法,在接收到测试指令后,可以先获取函数跟踪进程,并通过预设钩子函数对函数跟踪进程进行挂起,其中函数跟踪进程用于获取待测试函数的时间测试参数,在挂起函数跟踪进程后开启跟踪功能,当确定待测试函数满足预设条件时,返回函数跟踪进程,并测试出待测试函数的执行时间;由于利用钩子对函数跟踪进程进行挂起,改变了待测试函数的执行路径,且在开启跟踪功能后,先对待测试函数进行判断,满足预设条件的函数才进行测试和记录函数耗时的逻辑,因此可以过滤掉一些无用的函数耗时数据,进一步的,应用到终端应用时,可以分析终端应用哪里发生卡顿,即该测试方法不仅可以大大的减少函数耗时数据的内存占用空间,降低***资源浪费,还可以实现函数快速定位,
为便于更好的实施本发明实施例提供的函数执行时间的测试方法,本发明实施例还提供一种基于上述函数执行时间的测试方法的装置。其中名词的含义与上述函数执行时间的测试的方法中相同,具体实现细节可以参考方法实施例中的说明。
请参阅图3a,图3a为本发明实施例提供的函数执行时间的测试装置的结构示意图,其中该函数执行时间的测试装置300可以包括接收单元301、获取单元302、挂起单元303、确定单元304以及测试单元305,如下:
(1)接收单元301;
接收单元301,用于接收测试指令。
(2)获取单元302;
获取单元302,用于根据所述测试指令获取函数跟踪进程,所述函数跟踪进程用于获取待测试函数的时间测试参数。
例如,具体可以接收用户通过终端上的输入控件发送的测试指令,或接收其他设备发送的测试指令;然后在接收到测试指令之后,获取函数跟踪进程,其中,该函数跟踪进程可以从本地存储空间中获取。
本发明实施例中,该函数跟踪进程可理解为获取待测试函数(即被执行函数)的入口,对待测试函数进行跟踪测试的函数,主要用于获取待测试函数的时间测试参数,如获取待测试函数所属的线程、待测试函数方法的指针地址、待测试函数的执行状态(如在执行中还是已经执行完毕),等等。
(3)挂起单元303;
挂起单元303,用于通过预设钩子函数对所述函数跟踪进程进行挂起,并触发开启跟踪功能。
可以理解的是,目前在启动跟踪功能(Trace功能)后,待测试函数在执行时,一定会执行函数跟踪进程,因此,本发明实施例,可以利用钩子hook技术在初始化时将函数跟踪进程挂起(hook掉),hook后再开启跟踪功能。
比如,目前在启动跟踪功能后,待测试函数在执行时,在dalvik机器上会执行“dvmMethodTraceAdd()”函数,在art机器上会执行“LogMethodTraceEvent()”函数,因此该实施例中,在执行函数跟踪进程前,先利用hook技术在初始化时将获取到的“dvmMethodTraceAdd()”函数或者“LogMethodTraceEvent()”函数hook掉。
其中,该预设钩子函数可具体包括内联钩子(inline hook)函数,inline hook函数主要是指通过hook“接触”到需要修改的函数入口点,在动态库执行内部函数调用时,改变函数跳转指令,使***跳转到自定义的外部函数上执行。
(4)确定单元304;
确定单元304,用于在开启跟踪功能后,确定待测试函数是否满足预设条件。
(5)测试单元305;
测试单元305,用于当确定所述待测试函数满足预设条件时,返回所述函数跟踪进程,并测试出所述待测试函数的执行时间。
在确定待测试函数满足预设条件时,返回被挂起的函数跟踪进程,在该函数跟踪进程中提取该待测试函数的时间测试参数,如待测试函数所属的线程、待测试函数方法的指针地址、待测试函数的执行状态(如在执行中还是已经执行完毕),并根据这些时间测试参数测试待测试函数的执行时间,从而可以测试得到函数占用内存、函数的调用CPU的时间和占用CPU的执行时间等各方面性能。
请一并参阅图3b,图3b为本发明实施例提供的函数执行时间的测试装置的结构示意图,其中函数执行时间的测试装置400中获取单元302可以具体包括:
第三确定子单元3021;
用于在接收到测试指令时,确定操作***版本信息。
比如,在接收到测试指令时,首先确定当前测试平台的操作***版本信息,以安卓(Android)***平台为例,先确定操作***的版本信息,如Android4.4、Android5.0等等。
第二获取子单元3022;
用于根据所述操作***版本信息,获取相应的函数跟踪进程。
进一步的,根据确定的操作***的版本信息,获取相应的函数跟踪进程,比如,可具体的,目前Android4.4及其以下的版本中,对应的是dalvik模式,Android4.4以上的版本中,对应的是art模式,其中,dalvik以及art为用于Android平台的Java虚拟机。
其中,dalvik模式相应的函数跟踪进程为“dvmMethodTraceAdd()”函数,art模式相应的函数跟踪进程为“LogMethodTraceEvent()”函数。
在某些实施方式中,函数执行时间的测试装置400中确定单元304可以具体包括第一获取子单元3041、判断子单元3042、第一确定子单元3043以及第二确定子单元3044,如下:
第一获取子单元3041;
用于在开启跟踪功能后,获取待测试函数的预设参数信息。
其中,待测试函数的预设参数信息可以具体为方法类(Method)参数,由此,“在开启跟踪功能后,获取待测试函数的预设参数信息”可以具体为:在开启跟踪功能后,获取待测试函数的方法类参数。
判断子单元3042;
用于根据所述预设参数信息,判断待测试函数为***函数或非***函数。
例如,所述第一获取子单元3041用于,在开启跟踪功能后,获取待测试函数的方法类参数,则所述判断子单元3042可以具体用于根据所述方法类参数,判断待测试函数为***函数或非***函数。
第一确定子单元3043;
用于若判断出所述待测试函数为非***函数,则确定待测试函数满足预设条件。
第二确定子单元3044;
用于若判断出所述待测试函数为***函数,则确定待测试函数不满足预设条件。
由于***函数属于业务侧函数,在开启跟踪trace功能后,生成的trace文件中,***函数总数占比较大,并且对于分析性能(如卡顿问题)没有帮助,因此本实施例中,如果在确定待测试函数为***函数时,终止运行测试和记录函数耗时的逻辑,如果在确定待测试函数为非***函数时,继续运行测试和记录函数耗时的逻辑。
进一步的,在某些实施方式中,判断子单元3042可以具体用于:
在所述方法类参数的成员变量中,提取类地址指针变量的成员变量,根据所述类地址指针变量的成员变量,确定类加载器变量的值。
若确定所述类加载器变量的值为空,则判断出待测试函数为***函数,若确定所述类加载器变量的值不为空,则判断出待测试函数为非***函数。
其中,类地址指针(declaring_class_)变量为方法类(Method)参数的成员变量之一,在获取到类地址指针变量后,再提取类地址指针变量中的成员变量——类加载器(class_loader_)变量,并根据类加载器变量的值来判断待测试函数为***函数或非***函数。
在一种实施方式中,如果确定类加载器变量的值为空,则可以确定该待测试函数为***函数,在另一种实施方式中,如果确定类加载器变量的值不为空,则可以确定出待测试函数为非***函数。
本发明实施例中,把被执行的待测试函数分为两大类,***函数与非***函数,其中此处***函数实际上是区别于应用上层函数,指的是Android程序运行的过程中,所属于Linux核心层,***运行库层、框架层的函数,例如所属类名以android.*,java.*,org.*等开头的函数;除外,将其他函数确定为非***函数。
如图3b所示,在某些实施方式中,测试单元305可以具体包括:
返回子单元3051;
用于当确定所述待测试函数满足预设条件时,返回所述函数跟踪进程,并在所述函数跟踪进程中提取所述待测试函数的时间测试参数。
测试子单元3052;
用于根据所述时间测试参数,测试所述待测试函数的执行时间。
在确定待测试函数为非***函数时,返回被挂起的函数跟踪进程,在该函数跟踪进程中提取该待测试函数的时间测试参数,如待测试函数所属的线程、待测试函数方法的指针地址、待测试函数的执行状态(如在执行中还是已经执行完毕),并根据这些时间测试参数测试待测试函数的执行时间,从而可以测试得到函数占用内存、函数的调用CPU的时间和占用CPU的执行时间等各方面性能。
另外,如图3b所示,函数执行时间的测试装置400还可以包括:
过滤单元306,用于当确定所述待测试函数不满足预设条件时,将所述待测试函数进行过滤,并终止测试所述待测试函数的执行时间。
也就是说,在确定待测试函数为***函数时,将***函数这部分无用的函数耗时数据进行过滤,不再往下执行运行测试和记录函数耗时的逻辑,继续进行下一个待测试函数。
具体实施时,以上各个单元可以作为独立的实体来实现,也可以进行任意组合,作为同一或若干个实体来实现,以上各个单元的具体实施可参见前面的方法实施例,在此不再赘述。
该函数执行时间的测试装置具体可以集成在如手机、平板电脑、掌上电脑PDA等终端中。
由上述可知,本实施例提供的函数执行时间的测试装置,在接收到测试指令后,可以先获取函数跟踪进程,并通过预设钩子函数对函数跟踪进程进行挂起,其中函数跟踪进程用于获取待测试函数的时间测试参数,在挂起函数跟踪进程后开启跟踪功能,当确定待测试函数满足预设条件时,返回函数跟踪进程,并测试出待测试函数的执行时间;由于利用钩子对函数跟踪进程进行挂起,改变了待测试函数的执行路径,且在开启跟踪功能后,先对待测试函数进行判断,满足预设条件的函数才进行测试和记录函数耗时的逻辑,因此可以过滤掉一些无用的函数耗时数据,大大的减少函数耗时数据的内存占用空间,降低***资源浪费。
本发明实施例还提供一种终端,如图4所示,该终端400可以包括有一个或一个以上计算机可读存储介质的存储器401、传感器402、输入单元403、显示单元404、电源405以及包括有一个或者一个以上处理核心的处理器406等部件。本领域技术人员可以理解,图4中示出的终端结构并不构成对终端的限定,可以包括比图示更多或更少的部件,或者组合某些部件,或者不同的部件布置。
存储器401可用于存储应用程序和数据。存储器401存储的应用程序中包含有可执行代码。应用程序可以组成各种功能模块。处理器406通过运行存储在存储器401的应用程序,从而执行各种功能应用以及数据处理。此外,存储器401可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他易失性固态存储器件。相应地,存储器401还可以包括存储器控制器,以提供处理器406和输入单元403对存储器401的访问。
终端还可包括至少一种传感器402,比如光传感器、重力加速度传感器以及其他传感器。具体地,光传感器可包括环境光传感器及接近传感器,其中,环境光传感器可根据环境光线的明暗来调节显示面板的亮度,接近传感器可在终端移动到耳边时,关闭显示面板和/或背光。作为运动传感器的一种,重力加速度传感器可检测各个方向上(一般为三轴)加速度的大小,静止时可检测出重力的大小及方向,可用于识别手机姿态的应用(比如横竖屏切换、相关游戏、磁力计姿态校准)、振动识别相关功能(比如计步器、敲击)等;至于终端还可配置的陀螺仪、气压计、湿度计、温度计、红外线传感器等其他传感器,在此不再赘述。
输入单元403可用于接收输入的数字、字符信息或用户特征信息(比如指纹),以及产生与用户设置以及功能控制有关的键盘、鼠标、操作杆、光学或者轨迹球信号输入。具体地,在一个具体的实施例中,输入单元403可包括触敏表面以及其他输入设备。触敏表面,也称为触摸显示屏或者触控板,可收集用户在其上或附近的触摸操作(比如用户使用手指、触笔等任何适合的物体或附件在触敏表面上或在触敏表面附近的操作),并根据预先设定的程式驱动相应的连接装置。可选的,触敏表面可包括触摸检测装置和触摸控制器两个部分。其中,触摸检测装置检测用户的触摸方位,并检测触摸操作带来的信号,将信号传送给触摸控制器;触摸控制器从触摸检测装置上接收触摸信息,并将它转换成触点坐标,再送给处理器406,并能接收处理器406发来的命令并加以执行。此外,可以采用电阻式、电容式、红外线以及表面声波等多种类型实现触敏表面。除了触敏表面,输入单元403还可以包括其他输入设备。具体地,其他输入设备可以包括但不限于物理键盘、功能键(比如音量控制按键、开关按键等)、指纹识别模组、轨迹球、鼠标、操作杆等中的一种或多种。
显示单元404可用于显示由用户输入的信息或提供给用户的信息以及终端的各种图形用户接口,这些图形用户接口可以由图形、文本、图标、视频和其任意组合来构成。显示单元404可包括显示面板。可选的,可以采用液晶显示器(LCD,Liquid Crystal Display)、有机发光二极管(OLED,Organic Light-Emitting Diode)等形式来配置显示面板。进一步的,触敏表面可覆盖显示面板,当触敏表面检测到在其上或附近的触摸操作后,传送给处理器406以确定触摸事件的类型,随后处理器406根据触摸事件的类型在显示面板上提供相应的视觉输出。虽然在图4中,触敏表面与显示面板是作为两个独立的部件来实现输入和输入功能,但是在某些实施例中,可以将触敏表面与显示面板集成而实现输入和输出功能。
终端还包括给各个部件供电的电源405(比如电池)。优选的,电源可以通过电源管理***与处理器406逻辑相连,从而通过电源管理***实现管理充电、放电、以及功耗管理等功能。电源405还可以包括一个或一个以上的直流或交流电源、再充电***、电源故障检测电路、电源转换器或者逆变器、电源状态指示器等任意组件。
处理器406是终端的控制中心,利用各种接口和线路连接整个终端的各个部分,通过运行或执行存储在存储器401内的应用程序,以及调用存储在存储器401内的数据,执行终端的各种功能和处理数据,从而对终端进行整体监控。可选的,处理器406可包括一个或多个处理核心;优选的,处理器406可集成应用处理器和调制解调处理器,其中,应用处理器主要处理操作***、用户界面和应用程序等。
尽管图4中未示出,终端还可以包括摄像头、蓝牙模块、网络模块等,在此不再赘述。
具体在本实施例中,终端中的处理器406会按照如下的指令,将一个或一个以上的应用程序的进程对应的可执行代码加载到存储器401中,并由处理器406来运行存储在存储器401中的应用程序,从而实现各种功能:
通过处理器406接收测试指令,并根据所述测试指令获取函数跟踪进程,所述函数跟踪进程用于获取待测试函数的时间测试参数。
通过处理器406通过预设钩子函数对所述函数跟踪进程进行挂起,并触发开启跟踪功能。
通过处理器406在开启跟踪功能后,确定待测试函数是否满足预设条件。
通过处理器406当确定所述待测试函数满足预设条件时,返回所述函数跟踪进程,并测试出所述待测试函数的执行时间。
处理器406确定待测试函数是否满足预设条件之后,还可以用于:当确定所述待测试函数不满足预设条件时,将所述待测试函数进行过滤,并终止测试所述待测试函数的执行时间。
在某些实施方式中,处理器406在开启跟踪功能后,确定待测试函数是否满足预设条件,可以具体包括:在开启跟踪功能后,获取待测试函数的预设参数信息;根据所述预设参数信息,判断待测试函数为***函数或非***函数;若判断出所述待测试函数为非***函数,则确定待测试函数满足预设条件;若判断出所述待测试函数为***函数,则确定待测试函数不满足预设条件。
进一步的,在某些实施方式中,处理器406在开启跟踪功能后,获取待测试函数的方法类参数;并根据所述方法类参数,判断待测试函数为***函数或非***函数。
其中,处理器406根据所述方法类参数,判断待测试函数为***函数或非***函数可以具体包括:在所述方法类参数的成员变量中,提取类地址指针变量的成员变量;根据所述类地址指针变量的成员变量,确定类加载器变量的值;若确定所述类加载器变量的值为空,则判断出待测试函数为***函数;若确定所述类加载器变量的值不为空,则判断出待测试函数为非***函数。
处理器406根据所述测试指令获取函数跟踪进程可以具体包括:在接收到测试指令时,确定操作***版本信息;根据所述操作***版本信息,获取相应的函数跟踪进程。
处理器406当确定所述待测试函数满足预设条件时,返回所述函数跟踪进程,并测试出所述待测试函数的执行时间可以具体包括:当确定所述待测试函数满足预设条件时,返回所述函数跟踪进程,并在所述函数跟踪进程中提取所述待测试函数的时间测试参数;根据所述时间测试参数,测试所述待测试函数的执行时间。
由上述可知,本实施例提供的终端中,在接收到测试指令后,可以先获取函数跟踪进程,并通过预设钩子函数对函数跟踪进程进行挂起,其中函数跟踪进程用于获取待测试函数的时间测试参数,在挂起函数跟踪进程后开启跟踪功能,当确定待测试函数满足预设条件时,返回函数跟踪进程,并测试出待测试函数的执行时间;由于利用钩子对函数跟踪进程进行挂起,改变了待测试函数的执行路径,且在开启跟踪功能后,先对待测试函数进行判断,满足预设条件的函数才进行测试和记录函数耗时的逻辑,因此可以过滤掉一些无用的函数耗时数据,大大的减少函数耗时数据的内存占用空间,降低***资源浪费。
在上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见上文针对函数执行时间的测试方法的详细描述,此处不再赘述。
本发明实施例提供的所述函数执行时间的测试装置,譬如为计算机、平板电脑、具有触摸功能的手机等等,所述函数执行时间的测试装置与上文实施例中的函数执行时间的测试方法属于同一构思,在所述函数执行时间的测试装置上可以运行所述函数执行时间的测试方法实施例中提供的任一方法,其具体实现过程详见所述函数执行时间的测试方法实施例,此处不再赘述。
需要说明的是,对本发明所述函数执行时间的测试方法而言,本领域普通测试人员可以理解实现本发明实施例所述函数执行时间的测试方法的全部或部分流程,是可以通过计算机程序来控制相关的硬件来完成,所述计算机程序可存储于一计算机可读取存储介质中,如存储在终端的存储器中,并被该终端内的至少一个处理器执行,在执行过程中可包括如所述函数执行时间的测试方法的实施例的流程。其中,所述的存储介质可为磁碟、光盘、只读存储器(ROM,Read Only Memory)、随机存取记忆体(RAM,Random Access Memory)等。
对本发明实施例的所述函数执行时间的测试装置而言,其各功能模块可以集成在一个处理芯片中,也可以是各个模块单独物理存在,也可以两个或两个以上模块集成在一个模块中。上述集成的模块既可以采用硬件的形式实现,也可以采用软件功能模块的形式实现。所述集成的模块如果以软件功能模块的形式实现并作为独立的产品销售或使用时,也可以存储在一个计算机可读取存储介质中,所述存储介质譬如为只读存储器,磁盘或光盘等。
以上对本发明实施例所提供的一种函数执行时间的测试方法及装置进行了详细介绍,本文中应用了具体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想;同时,对于本领域的技术人员,依据本发明的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本发明的限制。
Claims (9)
1.一种函数执行时间的测试方法,其特征在于,包括:
接收测试指令,并根据所述测试指令获取函数跟踪进程,所述函数跟踪进程用于获取待测试函数的时间测试参数;
通过预设钩子函数对所述函数跟踪进程进行挂起,并触发开启跟踪功能,其中,所述对所述函数跟踪进程进行挂起指的是暂不执行函数跟踪进程,所述开启跟踪功能指的是修改函数跟踪进程入口点,在动态库执行待测试函数内部函数调用时,改变函数跳转指令,使***跳转到自定义的外部函数上执行;
在开启跟踪功能后,获取待测试函数的方法类参数;
根据所述方法类参数,判断待测试函数为***函数或非***函数;
若判断出所述待测试函数为非***函数,则确定待测试函数满足预设条件;
若判断出所述待测试函数为***函数,则确定待测试函数不满足预设条件;
当确定所述待测试函数满足预设条件时,返回所述函数跟踪进程,并测试出所述待测试函数的执行时间;
当确定所述待测试函数不满足预设条件时,将所述待测试函数进行过滤,并终止测试所述待测试函数的执行时间。
2.根据权利要求1所述的函数执行时间的测试方法,其特征在于,所述根据所述方法类参数,判断待测试函数为***函数或非***函数包括:
在所述方法类参数的成员变量中,提取类地址指针变量的成员变量;
根据所述类地址指针变量的成员变量,确定类加载器变量的值;
若确定所述类加载器变量的值为空,则判断出待测试函数为***函数;
若确定所述类加载器变量的值不为空,则判断出待测试函数为非***函数。
3.根据权利要求1所述的函数执行时间的测试方法,其特征在于,所述根据所述测试指令获取函数跟踪进程包括:
在接收到测试指令时,确定操作***版本信息;
根据所述操作***版本信息,获取相应的函数跟踪进程。
4.根据权利要求1所述的函数执行时间的测试方法,其特征在于,所述当确定所述待测试函数满足预设条件时,返回所述函数跟踪进程,并测试出所述待测试函数的执行时间包括:
当确定所述待测试函数满足预设条件时,返回所述函数跟踪进程,并在所述函数跟踪进程中提取所述待测试函数的时间测试参数;
根据所述时间测试参数,测试所述待测试函数的执行时间。
5.一种函数执行时间的测试装置,其特征在于,包括:
接收单元,用于接收测试指令;
获取单元,用于根据所述测试指令获取函数跟踪进程,所述函数跟踪进程用于获取待测试函数的时间测试参数;
挂起单元,用于通过预设钩子函数对所述函数跟踪进程进行挂起,并触发开启跟踪功能,其中,所述对所述函数跟踪进程进行挂起指的是暂不执行函数跟踪进程,所述开启跟踪功能指的是修改函数跟踪进程入口点,在动态库执行待测试函数内部函数调用时,改变函数跳转指令,使***跳转到自定义的外部函数上执行;
确定单元包括第一获取子单元、判断子单元、第一确定子单元以及第二确定子单元:
第一获取子单元,用于在开启跟踪功能后,获取待测试函数的方法类参数;
判断子单元,用于根据所述方法类参数,判断待测试函数为***函数或非***函数;
第一确定子单元,用于若判断出所述待测试函数为非***函数,则确定待测试函数满足预设条件;
第二确定子单元,用于若判断出所述待测试函数为***函数,则确定待测试函数不满足预设条件;
测试单元,用于当确定所述待测试函数满足预设条件时,返回所述函数跟踪进程,并测试出所述待测试函数的执行时间;
过滤单元,用于当确定所述待测试函数不满足预设条件时,将所述待测试函数进行过滤,并终止测试所述待测试函数的执行时间。
6.根据权利要求5所述的函数执行时间的测试装置,其特征在于,所述判断子单元具体用于:
在所述方法类参数的成员变量中,提取类地址指针变量的成员变量;
根据所述类地址指针变量的成员变量,确定类加载器变量的值;
若确定所述类加载器变量的值为空,则判断出待测试函数为***函数;
若确定所述类加载器变量的值不为空,则判断出待测试函数为非***函数。
7.根据权利要求5所述的函数执行时间的测试装置,其特征在于,所述获取单元包括:
第三确定子单元,用于在接收到测试指令时,确定操作***版本信息;
第二获取子单元,用于根据所述操作***版本信息,获取相应的函数跟踪进程。
8.根据权利要求5所述的函数执行时间的测试装置,其特征在于,所述测试单元包括:
返回子单元,用于当确定所述待测试函数满足预设条件时,返回所述函数跟踪进程,并在所述函数跟踪进程中提取所述待测试函数的时间测试参数;
测试子单元,用于根据所述时间测试参数,测试待测试函数的执行时间。
9.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质存储有多条指令,所述指令适于处理器进行加载,以执行权利要求1至4中任一项所述的函数执行时间的测试方法中的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201710218404.1A CN107025173B (zh) | 2017-04-05 | 2017-04-05 | 一种函数执行时间的测试方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201710218404.1A CN107025173B (zh) | 2017-04-05 | 2017-04-05 | 一种函数执行时间的测试方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN107025173A CN107025173A (zh) | 2017-08-08 |
CN107025173B true CN107025173B (zh) | 2021-08-31 |
Family
ID=59526706
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201710218404.1A Active CN107025173B (zh) | 2017-04-05 | 2017-04-05 | 一种函数执行时间的测试方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN107025173B (zh) |
Families Citing this family (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109871307A (zh) * | 2018-12-25 | 2019-06-11 | 杭州茂财网络技术有限公司 | 一种精确定位启动时间问题的自动化测试方法 |
CN110941553A (zh) * | 2019-11-22 | 2020-03-31 | 山东英信计算机技术有限公司 | 一种代码检测方法、装置、设备及可读存储介质 |
CN111625302A (zh) * | 2020-05-29 | 2020-09-04 | 北京字节跳动网络技术有限公司 | 函数耗时跟踪方法、设备和存储介质 |
CN112698890A (zh) * | 2020-12-31 | 2021-04-23 | 百果园技术(新加坡)有限公司 | 函数耗时采集方法、装置、设备及存储介质 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105426310A (zh) * | 2015-11-27 | 2016-03-23 | 北京奇虎科技有限公司 | 一种检测目标进程的性能的方法和装置 |
CN105550104A (zh) * | 2015-12-08 | 2016-05-04 | 北京奇虎科技有限公司 | 应用程序性能测试方法及装置 |
CN106055462A (zh) * | 2016-05-20 | 2016-10-26 | 腾讯科技(深圳)有限公司 | 一种时长获取方法和装置 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US9465717B2 (en) * | 2013-03-14 | 2016-10-11 | Riverbed Technology, Inc. | Native code profiler framework |
-
2017
- 2017-04-05 CN CN201710218404.1A patent/CN107025173B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105426310A (zh) * | 2015-11-27 | 2016-03-23 | 北京奇虎科技有限公司 | 一种检测目标进程的性能的方法和装置 |
CN105550104A (zh) * | 2015-12-08 | 2016-05-04 | 北京奇虎科技有限公司 | 应用程序性能测试方法及装置 |
CN106055462A (zh) * | 2016-05-20 | 2016-10-26 | 腾讯科技(深圳)有限公司 | 一种时长获取方法和装置 |
Also Published As
Publication number | Publication date |
---|---|
CN107025173A (zh) | 2017-08-08 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN107025173B (zh) | 一种函数执行时间的测试方法及装置 | |
CN103473163B (zh) | 应用程序检测方法及装置 | |
CN112052008B (zh) | 代码检查方法、装置、计算机设备及计算机可读存储介质 | |
CN107018022B (zh) | 软件升级的处理方法、装置及终端 | |
CN108595218B (zh) | 一种加载***动态库的方法和装置 | |
CN107395871B (zh) | 一种开启应用的方法、装置、存储介质及终端 | |
CN109726067B (zh) | 一种进程监控方法以及客户端设备 | |
CN106502703B (zh) | 一种函数调用方法和装置 | |
CN107390923B (zh) | 一种屏幕防误触方法、装置、存储介质和终端 | |
CN107302633B (zh) | 应用控制方法、装置、存储介质以及电子设备 | |
CN106919824B (zh) | 一种指纹解锁的控制方法、装置及计算机设备 | |
CN107025002B (zh) | 终端应用控制方法、装置及终端 | |
CN108984089B (zh) | 触控操作方法、装置、存储介质及电子设备 | |
CN110941551B (zh) | 一种应用卡顿检测方法、装置、设备及计算机存储介质 | |
EP3407162A1 (en) | Mobile terminal application program processing method and apparatus, storage medium, and electronic device | |
WO2016044109A1 (en) | Code development tool with multi-context intelligent assistance | |
CN110888740B (zh) | 小程序的增量内存确定方法、装置、设备及存储介质 | |
CN111078523A (zh) | 日志获取方法、装置、存储介质及电子设备 | |
CN110471870B (zh) | 多***运行的方法、装置、电子设备及存储介质 | |
WO2014206295A1 (en) | Method, device and computer-readable storage medium for monitoring uninstallation event in operation platform | |
CN111966491A (zh) | 统计占用内存的方法及终端设备 | |
CN116027953A (zh) | 指关节触控操作的识别方法、电子设备及可读存储介质 | |
CN106933576B (zh) | 一种终端解锁方法、装置及计算机设备 | |
US20240152439A1 (en) | Detection Method and Electronic Device | |
US20140280263A1 (en) | Electronic device with a funiction of applying applications of different operating systems and method thereof |
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 |