一种时长获取方法和装置的制造方法

文档序号:10686963阅读:206来源:国知局
一种时长获取方法和装置的制造方法
【专利摘要】本发明实施例公开了一种时长获取方法和装置;本发明实施例采用在开始执行应用程序内部的目标函数时跳转至执行该应用程序外部的第一时间获取函数,以获取该目标函数的开始执行时间,然后,在执行完该第一时间获取函数时跳转至执行该目标函数,在执行完该目标函数时跳转至执行该应用程序外部的第二时间获取函数,以获取该目标函数的执行完成时间,根据该开始执行时间和该执行完成时间获取该目标函数的执行时长;该方案可以提高函数时长耗时统计的准确性。
【专利说明】
_种时长获取方法和装置
技术领域
[0001 ]本发明涉及计算机技术领域,具体涉及一种时长获取方法和装置。
【背景技术】
[0002]随着移动终端技术的日益发展,应用程序数量也呈现出爆炸式增长趋势。应用程序开发者提供各种各样的应用程序,比如,娱乐、游戏、社交等类型的应用程序。
[0003]对于应用程序开发者来说,为了保证应用程序的质量,需要对应用程序的性能进行监测,然后,基于监测结果来完善应用程序,以提高其运行质量;比如,需要统计应用程序中函数的执行耗时(即执行时长)、检测应用程序中函数之间的调用关系等等。
[0004]现有技术中,统计函数的执行耗时需要在该函数的执行前后埋点,在运行过程中计算函数的执行耗时;具体地,预先在应用程序内部设置针对目标函数的两个信息收集函数,一个信息收集函数用于收集函数执行前的函数信息,比如收集函数执行前的时间信息、函数调用信息以及其他函数相关信息,另一个信息收集函数用于收集函数执行完成后的函数信息,比如,收集函数执行完成后的时间信息、函数调用信息以及其他函数相关信息,这样在运行应用程序,也即运行应用程序中的函数时,可以通过这两个信息收集函数来分别收集函数执行前、执行后的时间信息,从而获取该函数的执行耗时(执行时长)。
[0005]在对现有技术的研究和实践过程中,本发明的发明人发现,由于现有技术统计函数的执行耗时,需要执行应用程序内部相应的信息收集函数,其会影响应用程序的性能,因此,会导致统计的函数执行耗时不准确,函数执行耗时统计的准确性比较低。

【发明内容】

[0006]本发明实施例提供一种时长获取方法和装置,可以提高函数耗时统计的准确性。
[0007]本发明实施例提供一种时长获取方法,包括:
[0008]在开始执行应用程序内部的目标函数时,跳转至执行所述应用程序外部的第一时间获取函数,以获取所述目标函数的开始执行时间;
[0009]在执行完所述第一时间获取函数时,跳转至执行所述目标函数;
[0010]在执行完所述目标函数时,跳转至执行所述应用程序外部的第二时间获取函数,以获取所述目标函数的执行完成时间;
[0011 ]根据所述开始执行时间和所述执行完成时间获取所述目标函数的执行时长。
[0012]相应的,本发明实施例还提供一种时长获取装置,包括:
[0013]第一跳转单元,用于在开始执行应用程序内部的目标函数时,跳转至执行所述应用程序外部的第一时间获取函数,以获取所述目标函数的开始执行时间;
[0014]第二跳转单元,用于在执行完所述第一时间获取函数时,跳转至执行所述目标函数;
[0015]第三跳转单元,用于在执行完所述目标函数时,跳转至执行所述应用程序外部的第二时间获取函数,以获取所述目标函数的执行完成时间;
[0016]时长获取单元,用于根据所述开始执行时间和所述执行完成时间获取所述目标函数的执行时长。
[0017]本发明实施例采用在开始执行应用程序内部的目标函数时跳转至执行该应用程序外部的第一时间获取函数,以获取该目标函数的开始执行时间,然后,在执行完该第一时间获取函数时跳转至执行该目标函数,在执行完该目标函数时跳转至执行该应用程序外部的第二时间获取函数,以获取该目标函数的执行完成时间,根据该开始执行时间和该执行完成时间获取该目标函数的执行时长;该方案可以通过应用程序外部的时间获取函数来获取目标函数的开始执行时间以及执行完成时间,然后,基于该开始执行时间以及执行完成时间获取该目标函数的执行耗时,由于该方案通过应用程序外部的时间获取函数来获取时间,不会影响应用程序自身的性能,因此,相对于现有技术而言,可以提高函数耗时统计的准确性。
【附图说明】
[0018]为了更清楚地说明本发明实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
[0019]图1是本发明实施例一提供的一种时长获取方法的流程意图;
[0020]图2a是本发明实施例二提供的一种时长获取方法的流程图;
[0021 ]图2b是本发明实施例二提供的一种函数调用示意图;
[0022]图3是本发明实施例三提供的一种时长获取装置的结构示意图。
【具体实施方式】
[0023]下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
[0024]本发明实施例提供一种时长获取方法和装置。以下将分别进行详细说明。
[0025]实施例一、
[0026]本实施例将从时长获取装置的角度进行描述,该时长获取装置具体可以集成在终端等设备中,该终端具体可以为手机、平板电脑或PC等设备。
[0027]—种时长获取方法,包括:在开始执行应用程序内部的目标函数时跳转至执行该应用程序外部的第一时间获取函数,以获取该目标函数的开始执行时间,然后,在执行完该第一时间获取函数时跳转至执行该目标函数,在执行完该目标函数时跳转至执行该应用程序外部的第二时间获取函数,以获取该目标函数的执行完成时间,根据该开始执行时间和该执行完成时间获取该目标函数的执行时长。
[0028]如图1所示,该时长获取方法的流程图具体可以如下:
[0029]101、在开始执行应用程序内部的目标函数时,跳转至执行该应用程序外部的第一时间获取函数,以获取该目标函数的开始执行时间。
[0030]其中,应用程序内部的函数指的是:位于应用程序的构成函数集合内的函数,该构成函数集合可以包括多个构成该应用程序的函数;比如,当某个功能函数在应用程序的构成函数集合内,则认为该功能函数为应用程序内部的函数;应用程序外部的函数指的是:位于应用程序的构成函数集合之外的函数,即不在该构成函数集合内的函数,比如,当某个功能函数不在应用程序的构成函数集合内,则认为该函数为应用程序外部的函数。
[0031 ]本实施例中,确定开始执行目标函数的方式可以有多种,比如,在执行应用程序内部的目标函数的begin时可确定此时开始执行该目标函数,也即步骤“在开始执行应用程序内部的目标函数时跳转至执行第一时间获取函数”可以包括:在执行应用程序内部目标函数的begin时跳转至执行第一时间获取函数;在实际应用中,确定开始执行目标函数的方式可以根据需求设定,比如,可以设置在调用目标函数的时刻即为开始执行该目标函数的时亥丨J,等等。
[0032]本实施例的时长获取方法可以在Dalvik(虚拟机)上实施,比如,在需要获取安卓应用程序中函数的执行耗时,可以在Android Dalvik(安卓虚拟机)上应用本实施例方法;也即步骤“在开始执行应用程序内部的目标函数时,跳转至执行该应用程序外部的第一时间获取函数”可以包括:
[0033]在安卓虚拟机执行应用程序内部的目标函数时,安卓虚拟机跳转执行该应用程序外部的第一时间获取函数。
[0034]本实施例中,第一时间获取函数位于应用程序外部,该函数用于获取目标函数的开始执行时间,该开始执行时间可以为一个时间戳;其中,该第一时间获取函数可以为用户自定义的函数;具体地,该第一时间获取函数可以用于获取函数标识及其对应的开始执行时间等等。
[0035]可选地,本实施例中第一时间获取函数可以为终端操作系统中的本地函数,比如安卓系统中的本地(Native)函数。
[0036]可选地,本实施例中可以采用Hook(钩子)实现跳转执行函数,以提高函数跳转的速度,进而提高函数耗时统计的速度;也即步骤“跳转至执行该应用程序外部的第一时间获取函数”可以包括:通过第一钩子函数跳转至执行该应用程序外部的第一时间获取函数。
[0037]具体地,本实施例可以通过钩子函数修改函数执行指令来实现函数跳转;比如可以在动态库执行内部函数调用时,对函数执行指令进行修改,以使得系统可以跳转至执行应用程序外部相应的函数(如外部自定义函数);即步骤“通过第一钩子函数跳转至执行该应用程序外部的第一时间获取函数”可以包括:
[0038]获取第一函数执行指令;
[0039]通过第一钩子函数对该第一函数执行指令进行修改,以使得该第一函数执行指令指示执行该应用程序外部的该第一时间获取函数;
[0040]根据该第一函数指令跳转至执行该第一时间获取函数。
[0041]该第一函数执行指令在修改之前,原本指示执行应用程序内部的信息收集函数,通过第一钩子函数对其的修改,使得该第一函数执行指令指示执行第一时间获取函数,比如,执行安卓系统Native时间获取函数。
[0042]可选地,本实施例中函数执行指令可以通过指向函数地址的方式来指示执行该函数地址对应的函数;此时,可以通过执行指令指向的函数地址进行修改(如替换)来使得该执行指令指示执行其他函数,例如,可以通过第一钩子函数对第一函数执行指令对应的函数地址代码进行修改,将该函数地址代码替换成第一时间获取函数地址的代码。
[0043]也即步骤“通过第一钩子函数对该第一函数执行指令进行修改”可以包括:
[0044]通过第一钩子函数将该第一函数执行指令指向的函数地址修改为该第一时间获取函数的函数地址。
[0045]例如,原本第一函数执行指令指向函数B的函数地址,此时可以通过第一钩子函数将该第一函数执行指令指向的地址替换为函数A的函数地址,这样系统就可以根据第一函数执行指令跳转至执行函数B。
[0046]本实施例中钩子函数可以为系统本地的钩子函数(即Native Hook函数),该钩子函数可以预先在系统中设置,并可以将该钩子函数与相应的指令关联。
[0047]可选地,当目标函数存在调用函数(即目标函数直接或者间接调用的函数)时,本实施例还可以通过第一时间获取函数获取调用函数的开始执行时间,也即步骤“跳转至执行该应用程序外部的第一时间获取函数,以获取该目标函数的开始执行时间”可以包括:
[0048]跳转至执行该应用程序外部的第一时间获取函数,以获取该目标函数的开始执行时间和目标函数的调用函数的开始执行时间。
[0049]102、在执行完该第一时间获取函数时,跳转至执行该目标函数。
[0050]比如,在执行完第一时间获取函数的Return时跳转至执行该目标函数;也即在执行完第一时间获取函数的Return时即认为执行完该第一时间获取函数。
[0051]本实施例中在执行完第一时间获取函数时,还需要返回执行目标函数,具体地,可以通过函数返回执行指令来实现,也即步骤“跳转至执行该目标函数”可以包括:
[0052]获取函数返回执行指令,该函数返回执行指令指示需要返回执行该目标函数;
[0053]根据该函数返回执行指令跳转至执行该目标函数。
[0054]比如,可以在第一时间获取函数中设置函数返回执行指令对应的代码,该代码包含返回执行的函数地址代码;在执行完第一时间获取函数的Return时,将该代码转换成函数返回执行指令,然后,根据该函数返回执行指令跳转执行该目标函数。
[0055]103、在执行完该目标函数时,跳转至执行该应用程序外部的第二时间获取函数,以获取该目标函数的执行完成时间。
[0056]本实施例中,确定执行完目标函数的方式可以有多种,可以根据实际需求设定,比如,可以在执行完目标函数的return时可以确定此时执行完该目标函数;也即步骤“在执行完该目标函数时,跳转至执行该应用程序外部的第二时间获取函数”可以包括:
[0057]在执行完目标函数的return时,跳转至执行该应用程序外部的第二时间获取函数。
[0058]在本实施例方法应用在Dalvik(虚拟机)时,该步骤的执行主体可以为虚拟机,也步骤“在执行完该目标函数时,跳转至执行该应用程序外部的第二时间获取函数”可以包括:虚拟机在执行完该目标函数时,虚拟机跳转至执行该应用程序外部的第二时间获取函数。
[0059]同样,本实施例中第二时间获取函数位于应用程序外部,该函数用于获取目标函数的执行完成时间,该执行完成时间可以为一个时间戳;其中,该第二时间获取函数可以为用户自定义的函数,该第二时间获取函数可以具体用于获取函数标识及其对应的执行完成时间等等。
[0060]可选地,本实施例中第二时间获取函数也可以为终端操作系统中的本地函数,比如安卓系统中的本地(Native)函数。
[0061]可选地,本实施例中同样可以采用Hook来实现跳转至执行第二时间获取函数,其可以提高函数跳转的速度;也即步骤即步骤“通过第二钩子函数跳转至执行该应用程序外部的第二时间获取函数”可以包括:
[0062]获取第二函数执行指令;
[0063]通过第二钩子函数对该第二函数执行指令进行修改,以使得该第二函数执行指令指示执行该应用程序外部的该第二时间获取函数;
[0064]根据该第二函数指令跳转至执行该第二时间获取函数。
[0065]该第二函数执行指令在修改之前,原本指示执行应用程序内部的信息收集函数,通过第二钩子函数对其的修改,使得该第二函数执行指令指示执行第二时间获取函数,比如,执行安卓系统Native时间获取函数。
[0066]同样,本实施例可以通过对第二函数执行指令指向的函数地址进行修改,实现跳转执行至第二时间获取函数,也即步骤“通过第二钩子函数对该第二函数执行指令进行修改”可以包括:
[0067]通过第二钩子函数将该第二函数执行指令指向的函数地址修改为该第二时间获取函数的函数地址。
[0068]例如,可以通过第二钩子函数对第二函数执行指令对应的函数地址代码进行修改,将该函数地址代码替换成第二时间获取函数地址的代码。
[0069]可选地,当目标函数存在调用函数(即目标函数直接或者间接调用的函数)时,本实施例还可以通过第二时间获取函数获取调用函数的开始执行时间,也即步骤“跳转至执行该应用程序外部的第一时间获取函数,以获取该目标函数的开始执行时间”可以包括:
[0070]跳转至执行该应用程序外部的第二时间获取函数,以获取该目标函数的执行结束时间和目标函数的调用函数的执行结束时间。
[0071]本实施例中,第一钩子函数和第二钩子函数可以集成在一个钩子函数中,以节省资源。
[0072]104、根据该开始执行时间和该执行完成时间获取该目标函数的执行时长。
[0073]比如,可以在执行完应用程序中所有函数之后,根据该开始执行时间和该执行完成时间获取该目标函数的执行时长;也可以在执行应用程序中函数的过程中获取执行时长,即实时获取执行时长,这样可以提高时长获取速度。
[0074]可选地,本实施例中时间获取函数可以在获取目标函数对应的时间(开始执行时间或者执行完成时间)之后,或者在获取目标函数及其调用函数的时间(开始执行时间或者执行完成时间),将该时间写入相应的信息集合,在此情况下,本实施例可以从该信息集合中读取目标函数对应的开始执行时间、执行完成时间,或者可以从该信息集合中读取目标函数的调用函数的开始执行时间、执行完成时间,然后,根据函数的开始执行时间和执行完成时间获取该函数的执行时长。其中,该信息集合可以位于存储单元中,比如,存储单元可以为数据库、内存等。
[0075]具体地,步骤“根据该开始执行时间和该执行完成时间获取该目标函数的执行时长”可以包括:
[0076]获取该开始执行时间与该执行完成时间之间的时间间隔,以得到该目标函数的执行时长。
[0077]本实施例中,函数的时间可以由该函数的函数标识以及相应的时间来表示,比如,目标函数的时间(开始执行时间或者执行完成时间),可以由目标函数的函数标识以及时间(开始执行时间或者执行完成时间)表示,目标函数的调用函数的时间可以由该调用函数的函数标识以及时间表示,比如调用函数的执行完成时间,可以由调用函数的函数标识以及执行完成时间来表示。在目标函数存在调用函数,并且本实施例还获取调用函数的开始执行时间、执行完成时间的情况下,本实施例还可以根据函数标识及其对应的时间(开始执行时间和/或者执行完成时间)获取目标函数的调用栈。
[0078]例如,目标函数为函数A,函数A存在调用函数B、C,本实施例可以通过时间获取函数来获取函数A的开始执行时间、执行完时间,调用函数B的开始执行时间、执行完时间,调用函数C的开始执行时间、执行完时间,在用函数标识以及时间表示时也即获取A/begintime、B/begin time、C/begin time、A/return time、B/return time、B/return time;然后,基于函数标识及其对应的时间可以获取函数A的调用栈,比如函数A->函数B-〉函数C。
[0079]可选地,考虑到应用程序中函数调用比较复杂,函数数量多,如果将获取的时间信息写入本地文件,可能会影响系统和应用程序的性能,导致函数执行耗时统计不准确;为了克服该问题,本实施例可以采用共享内存方式来存储时间信息和读取时间信息;也即:
[0080]步骤“跳转至执行该应用程序外部的第一时间获取函数,以获取该目标函数的开始执行时间”的步骤具体包括:
[0081]跳转至执行该应用程序外部的第一时间获取函数,以获取该目标函数的开始执行时间并将该开始执行时间写入共享内存中;
[0082]步骤“跳转至执行该应用程序外部的第二时间获取函数,以获取该目标函数的执行完成时间”的步骤具体包括:
[0083]跳转至执行该应用程序外部的第二时间获取函数,以获取该目标函数的执行完成时间并将该执行完成时间写入该共享内存中;
[0084]此时,步骤“根据该开始执行时间和该执行完成时间获取该目标函数的执行时长”可以包括:
[0085]从该共享内存中提取该开始执行时间和该执行完成时间;
[0086]根据该开始执行时间和该执行完成时间计算该目标函数的执行时长。
[0087]在实际应用中,可以另启一个进程来从共享内存中读取目标函数对应的时间信息。
[0088]可选地,由于本实施例方法中时间获取函数位于应用程序外部,比如可以为系统本地函数,其跟应用程序本身无关,不受应用程序的限制,因此,该时间获取函数还可以获取操作系统中函数的开始执行时间以及执行完成时间,从而可以统计操作系统的函数执行耗时;在实际实施过程中,只需将本实施例中应用程序中的目标函数替换为操作系统中的函数即可;比如,本实施例方法可以统计安卓系统中Android Framework(安卓应用框架)层函数的耗时,提高了函数耗时统计的兼容性以及应用的范围。
[0089]本发明实施例采用在开始执行应用程序内部的目标函数时跳转至执行该应用程序外部的第一时间获取函数,以获取该目标函数的开始执行时间,然后,在执行完该第一时间获取函数时跳转至执行该目标函数,在执行完该目标函数时跳转至执行该应用程序外部的第二时间获取函数,以获取该目标函数的执行完成时间,根据该开始执行时间和该执行完成时间获取该目标函数的执行时长;该方案可以通过应用程序外部的时间获取函数来获取目标函数的开始执行时间以及执行完成时间,然后,基于该开始执行时间以及执行完成时间获取该目标函数的执行耗时,由于该方案通过应用程序外部的时间获取函数来获取时间,不会影响应用程序自身的性能,因此,相对于现有技术而言,可以提高函数耗时统计的准确性。
[0090]此外,本实施例方案还可以具有很强的兼容性,可以对各种版本的应用程序中函数的执行耗时进行统计,还可以对操作系统中各种函数的执行耗时进行统计;比如可以对外网release(发布)版本应用程序中函数的执行耗时进行统计,可以辅助开发者解决应用程序运行卡顿的问题,提高应用程序优化的速度,又比如可以统计Android Framework层函数执行耗时等。
[0091]实施例二、
[0092]根据实施例一所描述的方法,以下将举例作进一步详细说明。
[0093]在本实施例中,将以该时长获取装置具体集成在终端虚拟机中为例进行说明。比如,该时长获取装置可以以软件的形式集成在该终端虚拟机中。其中,该终端虚拟机可以为Android Dalvik(安卓虚拟机)或者其他虚拟机。
[0094]如图2a所示,该时长获取方法的具体流程可以如下:
[0095]201、终端虚拟机在执行应用程序中目标函数的begin时,获取第一函数执行指令。
[0096]本实施例中,该目标函数还可以为各种版本应用程序的函数,比如,release版本应用程序内的函数;本实施例中目标函数可以仅限于应用的函数,还可以为终端系统的函数等,比如安卓应用框架层的函数。
[0097]本实施例中,第一函数执行指令可以原本指示应用程序内部的信息收集函数。
[0098]比如,终端虚拟机调用应用程序中的目标函数,然后,终端虚拟机执行目标函数,在执行到目标函数的begin时,获取第一函数执行指令。
[0099]202、终端虚拟机通过第一钩子函数对该第一函数执行指令进行修改,以使得该第一函数执行指令指示执行第一时间获取函数。
[0100]其中,第一时间获取函数可以应用程序外部的函数,比如终端系统本地Native函数;该第一钩子函数也可以为终端系统本地Nat i ve函数。该第一时间获取函数可以为用户自定义的系统本地函数,比如为Android系统本地的自定义函数。
[0101 ]具体地,终端虚拟机可以通过第一钩子函数将第一函数执行指令指向的函数地址替换为第一时间获取函数的函数地址,以使得该第一函数执行指令指示执行第一时间获取函数。
[0102]203、终端虚拟机根据该第一函数指令跳转至执行该第一时间获取函数,以获取该目标函数的开始执行时间,并将该开始执行时间写入共享内存。
[0103]参考图2b,以目标函数为函数A为例,在调用函数A后执行函数A的begin时,会获取第一函数执行指令,该第一函数执行指令原本指示执行应用程序内部的信息收集函数dvmReportlnvoke,如果未对指令修改,那么此时终端虚拟机将会执行信息收集函数dvmReportlnvoke;本实施例需要对该指令进行修改以使得该指令指示执行自定义的信息收集函数myDvmReportlnvoke,此时,终端虚拟机将会根据第一函数执行指令跳转到执行自定义信息收集函数myDvmReportlnvoke,以获取函数A的开始执行时间(begin time),并将该开始执行时间(begin time)写入共享内存。
[0104]为了方便统计函数执行耗时,提高统计速度,本实施例中可以采用“目标函数标识/开始执行时间”这种信息结构来表示目标函数的开始执行时间,此时,终端虚拟机可以将目标函数标识/开始执行时间这种信息结构写入共享内存,比如,将A/begin time写入共享内存。
[0105]在实际应用中,如果目标函数存在函数调用时,本实施例还需要通过第一时间获取函数获取目标函数的调用函数的开始执行时间;也即步骤203可以具体包括:
[0106]终端虚拟机根据该第一函数指令跳转至执行该第一时间获取函数,以获取该目标函数的开始执行时间以及调用函数的开始执行时间,并将标函数的开始执行时间以及调用函数的开始执行时间写入共享内存,其中,该调用函数为目标函数的调用函数。
[0107]比如,当函数A存在调用函数B时,此时,终端虚拟机可以通过执行自定义信息收集函数myDvmReportlnvoke,以获取函数A的开始执行时间、函数B的开始执行时间,并将函数A的开始执行时间、函数B的开始执行时间写入共享内存;例如,将A/begin time,B/begintime写入共享内存。
[0108]204、终端虚拟机执行完成第一时间获取函数的return时,跳转至执行该目标函数。
比如,参考图2b,终端虚拟机在执行完信息收集函数myDvmReportlnvoke的return时,会返回执行函数A。
[0110]205、终端虚拟机执行完成该目标函数的return时,获取第二函数执行指令。
[0111]比如,参考图2b,在执行完成函数A时,获取第二函数执行指令,该指令指示执行应用程序内部的信息收集函数dvmReportReturn。
[0112]206、终端虚拟机通过第二钩子函数对该第二函数执行指令进行修改,以使得该第二函数执行指令指示执行第二时间获取函数。
[0113]比如,参考图2b,如果未对第二函数执行指令修改的话,那么此时终端虚拟机将会执行信息收集函数dvmReportReturn;然而,本实施例通过钩子函数对第二函数执行指令进行修改,使其指示执行本地自定义的信息收集函数myDvmReportReturn。
[0114]207、终端虚拟机根据该第二函数执行指令跳转至执行该第二时间获取函数,以获取该目标函数的执彳丁完成时间,并将该执彳丁完成时间与入共孚内存。
[0115]比如,参考图2b,在对指令修改之后,终端虚拟机会根据第二函数执行指令跳转到执行本地自定义的信息收集函数myDvmReportReturn,以获取函数A的执行完成时间(return time),并将执行完成时间写入共享内存中。本实施例中可以采用“目标函数标识/执行完成时间”这种信息结构来表示目标函数的执行完成时间,此时,终端虚拟机可以将目标函数标识/执行完成时间这种信息结构写入共享内存,比如,将A/return time写入共享内存。
[0116]在实际应用中,如果目标函数存在函数调用时,本实施例还需要通过第二时间获取函数获取目标函数的调用函数的执行结束时间;也即步骤207可以具体包括:
[0117]终端虚拟机根据该第二函数执行指令跳转至执行该第二时间获取函数,以获取该目标函数的执行完成时间以及调用函数的执行完成时间,并将该目标函数的执行完成时间以及调用函数的执行完成时间写入共享内存,其中该调用函数为目标函数的调用函数。
[0118]比如,当函数A存在调用函数B时,此时,终端虚拟机可以通过执行自定义信息收集函数myDvmReportReturn,以获取函数A的执行结束时间、函数B的执行结束时间,并将执行结束时间写入共享内存;例如,将A/return time,B/return time写入共享内存。
[0119]208、终端虚拟机从该共享内存中提取目标函数的开始执行时间、执行完成时间。
[0120]当目标函数存在调用函数时,本实施需要获取目标函数和调用函数的开始执行时间,目标函数和调用函数的执行完成时间,因此,共享内存可以存储有目标函数的开始执行时间和执行完成、调用函数的开始执行时间和执行完成时间,比如,目标函数A存在调用函数B等调用函数时,共享内存存储的信息可以如下:
[0121]函数A/begintime
[0122]函数B/begintime
[0123]……
[0124]函数B/returntime
[0125]函数A/returntime。
[0126]此时,本实施例中终端虚拟机不仅可以从共享内存中提取目标函数的开始执行时间和执行完成时间,还可以从共享内存中提取目标函数的调用函数的开始执行时间和执行完成时间。
[0127]209、终端虚拟机计算目标函数对应的执行完成时间与目标函数对应的开始执行时间之间的时间间隔,以得到该目标函数的执行时长。
[ΟΙ28] 比如终端虚拟机可以计算函数A的begin time与函数A的return time之间的时间间隔或者时间差,以得到函数A的执行耗时。
[0129]在目标函数存在调用函数的情况下,终端虚拟机还可以调用函数的对应的开始执行时间和执行完成时间获取调用函数的执行时长。
[0130]比如终端虚拟机可以计算调用函数B的begin time与return time之间的时间间隔或者时间差,以得到调用函数B的执行耗时。
[0131]可选地,在采用函数标识和时间表示函数对应的时间(如A/return time表示函数A的执行完成时间)的情况下,还可以根据函数标识及其对应的时间(开始执行时间和/或执行完成时间)获取目标函数的调用栈。比如,可以根据函数A的标识及其对应的时间、调用函数B的标识及其对应的时间……其他调用函数N的标识及其对应的时间,获取函数A的调用栈,即函数A->函数B-〉……函数N。
[0132]本发明实施例采用在开始执行应用程序内部的目标函数时跳转至执行该应用程序外部的第一时间获取函数,以获取该目标函数的开始执行时间,然后,在执行完该第一时间获取函数时跳转至执行该目标函数,在执行完该目标函数时跳转至执行该应用程序外部的第二时间获取函数,以获取该目标函数的执行完成时间,根据该开始执行时间和该执行完成时间获取该目标函数的执行时长;该方案可以通过应用程序外部的时间获取函数来获取目标函数的开始执行时间以及执行完成时间,然后,基于该开始执行时间以及执行完成时间获取该目标函数的执行耗时,由于该方案通过应用程序外部的时间获取函数来获取时间,不会影响应用程序自身的性能,因此,相对于现有技术而言,可以提高函数耗时统计的准确性。
[0133]此外,本实施例方案还可以具有很强的兼容性,可以对各种版本的应用程序中函数的执行耗时进行统计,还可以对操作系统中各种函数的执行耗时进行统计;比如可以对外网release(发布)版本应用程序中函数的执行耗时进行统计,可以辅助开发者解决应用程序运行卡顿的问题,提高应用程序优化的速度,又比如可以统计Android Framework层函数执行耗时等。
[0134]实施例三、
[0135]为了更好地实施以上方法,本发明实施例还提供一种时长装置,如图3所示,该时长获取装置包括第一跳转单元301、第二跳转单元302、第三跳转单元303和时长获取单元304,如下:
[0136](I)第一跳转单元301;
[0137]第一跳转单元301,用于在开始执行应用程序内部的目标函数时,跳转至执行该应用程序外部的第一时间获取函数,以获取该目标函数的开始执行时间。
[0138]比如,该第一跳转单元301,可以具体用于通过第一钩子函数跳转至执行该应用程序外部的第一时间获取函数。
[0139]具体地,该第一跳转单元301可以包括:第一指令获取子单元、第一指令修改子单元以及第一跳转子单元;
[0140]该第一指令获取子单元,用于获取第一函数执行指令;
[0141]该第一指令修改子单元,用于通过第一钩子函数对该第一函数执行指令进行修改,以使得该第一函数执行指令指示执行该应用程序外部的该第一时间获取函数;
[0142]该第一跳转子单元,用于根据该第一函数指令跳转至执行该第一时间获取函数。
[0143]具体地,该第一指令修改子单元,具体用于:通过第一钩子函数将该第一函数执行指令指向的函数地址修改为该第一时间获取函数的函数地址。
[0144]本实施例中,第一跳转单元301可以具体用于:跳转至执行该应用程序外部的第一时间获取函数,以获取该目标函数的开始执行时间并将该开始执行时间写入共享内存中。
[0145]本实施例中,第一时间获取函数位于应用程序外部,该函数用于获取目标函数的开始执行时间,该开始执行时间可以为一个时间戳;其中,该第一时间获取函数可以为用户自定义的函数;具体地,该第一时间获取函数可以用于获取函数标识及其对应的开始执行时间等等。
[0146]其中,本实施例中第一时间获取函数可以为终端操作系统中的本地函数,比如安卓系统中的本地(Native)函数。
[0147](2)第二跳转单元302;
[0148]第二跳转单元302,用于在执行完该第一时间获取函数时,跳转至执行该目标函数。
[0149]比如,该第二跳转单元302可以用于,在执行完第一时间获取函数的Return时跳转至执行该目标函数。
[0150]具体地,该第二跳转单元302可以具体用于:
[0151]获取函数返回执行指令,该函数返回执行指令指示需要返回执行该目标函数;
[0152]根据该函数返回执行指令跳转至执行该目标函数。
[0153](3)第三跳转单元303;
[0154]第三跳转单元303,用于在执行完该目标函数时,跳转至执行该应用程序外部的第二时间获取函数,以获取该目标函数的执行完成时间。
[0155]比如,该第三跳转单元303,可以具体用于通过第二钩子函数跳转至执行该应用程序外部的第二时间获取函数。
[0156]其中,第三跳转单元303可以包括:第二指令获取子单元、第二指令修改子单元以及第二跳转子单元;
[0157]该第二指令获取子单元,用于获取第二函数执行指令;
[0158]该第二指令修改子单元,用于通过第二钩子函数对该第二函数执行指令进行修改,以使得该第二函数执行指令指示执行该应用程序外部的该第二时间获取函数;
[0159]该第二跳转子单元,用于根据该第二函数指令跳转至执行该第二时间获取函数。
[0160]例如,该第二指令修改子单元,具体用于:通过第二钩子函数将该第二函数执行指令指向的函数地址修改为该第二时间获取函数的函数地址。
[0161]本实施例中,第三跳转单元303可以具体用于:跳转至执行该应用程序外部的第二时间获取函数,以获取该目标函数的执行完成时间并将该执行完成时间写入该共享内存中。
[0162]本实施例中第二时间获取函数位于应用程序外部,该函数用于获取目标函数的执行完成时间,该执行完成时间可以为一个时间戳;其中,该第二时间获取函数可以为用户自定义的函数,该第二时间获取函数可以具体用于获取函数标识及其对应的执行完成时间等等。
[0163]其中,本实施例中第二时间获取函数可以为终端操作系统中的本地函数,比如安卓系统中的本地(Native)函数。
[0164](4)时长获取单元304;
[0165]时长获取单元304,用于根据该开始执行时间和该执行完成时间获取该目标函数的执行时长。
[0166]比如,该时长获取单元304可以具有用于:从该共享内存中提取该开始执行时间和该执彳丁完成时间;
[0167]根据该开始执行时间和该执行完成时间计算该目标函数的执行时长。
[0168]又比如时长获取单元304,可以具体用于获取该开始执行时间与该执行完成时间之间的时间间隔,以得到该目标函数的执行时长。
[0169]具体实施时,以上各个单元可以作为独立的实体来实现,也可以进行任意组合,作为同一或若干个实体来实现,以上各个单元的具体实施可参见前面的方法实施例,在此不再赘述。
[0170]该时长获取装置具体可以集成在终端等设备中,该终端具体可以为手机、平板电脑或PC等设备。
[0171]本发明实施例的时长获取装置通过第一跳转单元301在开始执行应用程序内部的目标函数时跳转至执行该应用程序外部的第一时间获取函数,以获取该目标函数的开始执行时间,然后,由第二跳转单元302在执行完该第一时间获取函数时跳转至执行该目标函数,由第三跳转单元303在执行完该目标函数时跳转至执行该应用程序外部的第二时间获取函数,以获取该目标函数的执行完成时间,由时长获取都那样304根据该开始执行时间和该执行完成时间获取该目标函数的执行时长;该方案可以通过应用程序外部的时间获取函数来获取目标函数的开始执行时间以及执行完成时间,然后,基于该开始执行时间以及执行完成时间获取该目标函数的执行耗时,由于该方案通过应用程序外部的时间获取函数来获取时间,不会影响应用程序自身的性能,因此,相对于现有技术而言,可以提高函数耗时统计的准确性。
[0172]此外,本实施例方案还可以具有很强的兼容性,可以对各种版本的应用程序中函数的执行耗时进行统计,还可以对操作系统中各种函数的执行耗时进行统计;比如可以对外网release(发布)版本应用程序中函数的执行耗时进行统计,可以辅助开发者解决应用程序运行卡顿的问题,提高应用程序优化的速度,又比如可以统计Android Framework层函数执行耗时等。
[0173]本领域普通技术人员可以理解上述实施例的各种方法中的全部或部分步骤是可以通过程序来指令相关的硬件来完成,该程序可以存储于一计算机可读存储介质中,存储介质可以包括:只读存储器(R0M,Read Only Memory)、随机存取记忆体(RAM,RandomAccess Memory)、磁盘或光盘等。
[0174]以上对本发明实施例所提供的一种时长获取方法和装置进行了详细介绍,本文中应用了具体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想;同时,对于本领域的技术人员,依据本发明的思想,在【具体实施方式】及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本发明的限制。
【主权项】
1.一种时长获取方法,其特征在于,包括: 在开始执行应用程序内部的目标函数时,跳转至执行所述应用程序外部的第一时间获取函数,以获取所述目标函数的开始执行时间; 在执行完所述第一时间获取函数时,跳转至执行所述目标函数; 在执行完所述目标函数时,跳转至执行所述应用程序外部的第二时间获取函数,以获取所述目标函数的执行完成时间; 根据所述开始执行时间和所述执行完成时间获取所述目标函数的执行时长。2.如权利要求1所述的时长获取方法,其特征在于,所述跳转至执行所述应用程序外部的第一时间获取函数的步骤具体包括: 通过第一钩子函数跳转至执行所述应用程序外部的第一时间获取函数; 所述跳转至执行所述应用程序外部的第二时间获取函数的步骤具体包括: 通过第二钩子函数跳转至执行所述应用程序外部的第二时间获取函数。3.如权利要求2所述的时长获取方法,其特征在于,所述通过第一钩子函数跳转至执行所述应用程序外部的第一时间获取函数的步骤具体包括: 获取第一函数执行指令; 通过第一钩子函数对所述第一函数执行指令进行修改,以使得所述第一函数执行指令指示执行所述应用程序外部的所述第一时间获取函数; 根据所述第一函数指令跳转至执行所述第一时间获取函数。4.如权利要求3所述的时长获取方法,其特征在于,所述通过第一钩子函数对所述第一函数执行指令进行修改的步骤具体包括: 通过第一钩子函数将所述第一函数执行指令指向的函数地址修改为所述第一时间获取函数的函数地址。5.如权利要求2所述的时长获取方法,其特征在于,所述通过第二钩子函数跳转至执行所述应用程序外部的第二时间获取函数的步骤具体包括: 获取第二函数执行指令; 通过第二钩子函数对所述第二函数执行指令进行修改,以使得所述第一函数执行指令指示执行所述应用程序外部的所述第二时间获取函数; 根据所述第二函数指令跳转至执行所述第一时间获取函数。6.如权利要求5所述的时长获取方法,其特征在于,所述通过第二钩子函数对所述第二函数执行指令进行修改的步骤具体包括: 通过第二钩子函数将所述第二函数执行指令指向的函数地址修改为所述第二时间获取函数的函数地址。7.如权利要求1所述的时长获取方法,其特征在于, 所述跳转至执行所述应用程序外部的第一时间获取函数,以获取所述目标函数的开始执行时间的步骤具体包括: 跳转至执行所述应用程序外部的第一时间获取函数,以获取所述目标函数的开始执行时间并将所述开始执行时间写入共享内存中; 所述跳转至执行所述应用程序外部的第二时间获取函数,以获取所述目标函数的执行完成时间的步骤具体包括: 跳转至执行所述应用程序外部的第二时间获取函数,以获取所述目标函数的执行完成时间并将所述执行完成时间写入所述共享内存中; 所述根据所述开始执行时间和所述执行完成时间获取所述目标函数的执行时长的步骤具体包括: 从所述共享内存中提取所述开始执行时间和所述执行完成时间; 根据所述开始执行时间和所述执行完成时间计算所述目标函数的执行时长。8.一种时长获取装置,其特征在于,包括: 第一跳转单元,用于在开始执行应用程序内部的目标函数时,跳转至执行所述应用程序外部的第一时间获取函数,以获取所述目标函数的开始执行时间; 第二跳转单元,用于在执行完所述第一时间获取函数时,跳转至执行所述目标函数;第三跳转单元,用于在执行完所述目标函数时,跳转至执行所述应用程序外部的第二时间获取函数,以获取所述目标函数的执行完成时间; 时长获取单元,用于根据所述开始执行时间和所述执行完成时间获取所述目标函数的执行时长。9.如权利要求8所述的时长获取装置,其特征在于, 所述第一跳转单元,具体用于:通过第一钩子函数跳转至执行所述应用程序外部的第一时间获取函数; 所述第三跳转单元,具体用于通过第二钩子函数跳转至执行所述应用程序外部的第二时间获取函数。10.如权利要求9所述的时长获取装置,其特征在于,所述第一跳转单元,具体包括:第一指令获取子单元、第一指令修改子单元以及第一跳转子单元; 所述第一指令获取子单元,用于获取第一函数执行指令;所述第一指令修改子单元,用于通过第一钩子函数对所述第一函数执行指令进行修改,以使得所述第一函数执行指令指示执行所述应用程序外部的所述第一时间获取函数;所述第一跳转子单元,用于根据所述第一函数指令跳转至执行所述第一时间获取函数。11.如权利要求10所述的时长获取装置,其特征在于,所述第一指令修改子单元,具体用于:通过第一钩子函数将所述第一函数执行指令指向的函数地址修改为所述第一时间获取函数的函数地址。12.如权利要求9所述的时长获取装置,其特征在于,所述第三跳转单元,具体包括:第二指令获取子单元、第二指令修改子单元以及第二跳转子单元; 所述第二指令获取子单元,用于获取第二函数执行指令;所述第二指令修改子单元,用于通过第二钩子函数对所述第二函数执行指令进行修改,以使得所述第二函数执行指令指示执行所述应用程序外部的所述第二时间获取函数;所述第二跳转子单元,用于根据所述第二函数指令跳转至执行所述第二时间获取函数。13.如权利要求12所述的时长获取装置,其特征在于,所述第二指令修改子单元,具体用于:通过第二钩子函数将所述第二函数执行指令指向的函数地址修改为所述第二时间获取函数的函数地址。14.如权利要求8所述的时长获取装置,其特征在于, 所述第一跳转单元,具体用于跳转至执行所述应用程序外部的第一时间获取函数,以获取所述目标函数的开始执行时间并将所述开始执行时间写入共享内存中; 所述第三跳转单元,具体用于跳转至执行所述应用程序外部的第二时间获取函数,以获取所述目标函数的执行完成时间并将所述执行完成时间写入所述共享内存中; 所述时长获取单元,具体用于: 从所述共享内存中提取所述开始执行时间和所述执行完成时间; 根据所述开始执行时间和所述执行完成时间计算所述目标函数的执行时长。
【文档编号】G06F11/34GK106055462SQ201610338973
【公开日】2016年10月26日
【申请日】2016年5月20日
【发明人】王俊俊, 王波, 彭毕雨
【申请人】腾讯科技(深圳)有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1