内存测试方法、被测终端、测试客户端及系统与流程

文档序号:19366290发布日期:2019-12-10 20:52阅读:155来源:国知局
内存测试方法、被测终端、测试客户端及系统与流程
本申请主要涉及性能优化应用领域,更具体地说是涉及内存测试方法、被测终端、测试客户端及系统。
背景技术
:目前,随着用户对应用程序实现的功能要求越来越高,使得应用程序在移动终端运行需要占用的内存逐渐增高,所以,面对移动终端有限的系统资源,应用程序性能优化成为应用程序研发过程中的重中之重。在实际应用中,由于应用程序的内存绝大部分是被各种资源占用,在传统的内存测试中,通常只能获取应用程序运行期间应用进程占用的总内存,无法精确定位到细化类型资源对内存占用情况,导致开发人员无法根据内存测试结果,对应用程序性能进行有针对性地优化。技术实现要素:有鉴于此,本申请提供了一种内存测试方法、被测终端、测试客户端及系统,实现了目标应用程序运行过程中,具体类型资源对象的内存占用情况,方便开发人员对目标应用程序性能进行有针对性优化,提高了目标应用程序性能优化效率。为了实现上述目的,本申请提供了以下技术方案:本申请实施例提供了一种内存测试方法,应用于被测终端,所述方法包括:与测试终端上装载的测试客户端建立通信连接;接收所述测试客户端针对所述被测终端中的目标应用程序发送的动态库文件;将所述动态库文件注入所述目标应用程序的应用进程并执行,调取与不同资源对象一一对应的引擎接口;运行所述目标应用程序,通过调取的引擎接口获得针对所述目标应用程的各种资源对象数据;将获得的所述目标应用程序的各种资源对象数据发送至所述测试客户端输出。本申请实施例还提供了另一种内存测试方法,应用于测试客户端,所述测试客户端装载在测试终端,所述方法包括:启动所述测试客户端后,建立与被测终端的通信连接;确定被测终端中符合预设要求的目标应用程序;将与所述目标应用程序对应的动态库文件注入所述目标应用程序的应用程序,以使所述被测终端执行所述动态库文件,调取与不同资源对象一一对应的引擎接口;当所述被测终端运行所述目标应用程序,接收所述被测终端获得并发送的所述目标应用程序的各种资源对象数据;检测针对任一个资源对象的数据查看指令,按照预设方式输出相应的资源对象数据。本申请实施例还提供了一种被测终端,所述被测终端上设置有多个应用程序,所示测试终端还包括:通信模块,用于与测试终端上装载的测试客户端建立通信连接,并接收所述测试客户端针对所述被测终端中的目标应用程序发送的动态库文件;处理模块,用于将所述动态库文件注入所述目标应用程序的应用进程并执行,调取与不同资源对象一一对应的引擎接口;数据获取模块,用于在运行所述目标应用程序期间,通过调取的引擎接口获得针对所述目标应用程的各种资源对象数据,并通过所述通信模块将获得的所述目标应用程序的各种资源对象数据发送至所述测试客户端输出。本申请实施例还提供了一种测试客户端,所述测试客户端装载在测试终端上,所述测试客户端包括:第一通信模块,用于启动所述测试客户端后,建立与被测终端的通信连接;目标应用程序确定模块,用于确定被测终端中符合预设要求的目标应用程序,并通过所述第一通信模块将与所述目标应用程序对应的动态库文件注入所述目标应用程序的应用程序,以使所述被测终端执行所述动态库文件,调取与不同资源对象一一对应的引擎接口;当所述被测终端运行所述目标应用程序,通过所述第一通信模块接收所述被测终端获得并发送的所述目标应用程序的各种资源对象数据;输出模块,用于检测针对任一个资源对象的数据查看指令,按照预设方式输出相应的资源对象数据。本申请实施例还提供了一种内存测试系统,所述系统包括:测试终端和被测终端,所述测试终端上装载有测试客户端;所述测试客户端,用于在启动后与被测终端建立通信连接,确定被测终端中符合预设要求的目标应用程序,并将与所述目标应用程序对应的动态库文件注入所述目标应用程序的应用程序;所述被测终端,用于接收所述测试客户端针对所述被测终端中的目标应用程序发送的动态库文件,并将所述动态库文件注入所述目标应用程序的应用进程并执行,调取与不同资源对象一一对应的引擎接口,在运行所述目标应用程序期间,通过调取的引擎接口获得针对所述目标应用程的各种资源对象数据,将获得的所述目标应用程序的各种资源对象数据发送至所述测试客户端,以使所述测试客户端检测到针对任一个资源对象的数据查看指令,按照预设方式输出相应的资源对象数据。基于上述技术方案,在本申请实施例中,当需要获得被测终端上的某一个应用程序即目标应用程序运行情况时,本申请将由测试客户端将针对该目标应用程序的库文件注入该目标应用程序的目标进程,从而调取该目标应用程序的引擎未导出的检测接口,这样,当在被测终端上运行目标应用程序时,被测终端就能够通过该检测接口获得针对该目标应用程序的至少一类资源对象数据,如贴图、视频、模型等资源对象的数据,之后,被测终端将会把获得资源对象数据发送至测试客户端输出,从而使开发人员能够准确了解目标应用程序在被测终端实际应用期间各类资源对象的数据,以便据此对目标应用程序性能进行有针对性地优化,提高了优化效率。附图说明为了更清楚地说明本申请实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据提供的附图获得其他的附图。图1为本申请实施例提供的一种内存测试系统的结构图;图2为本申请实施例提供的一种测试终端的硬件结构图;图3为本申请实施例提供的一种内存测试方法的信令流程图;图4(a)~(e)为本申请实施例提供内存测试过程中不同阶段测试终端输出的测试窗口;图4(f)本申请实施例提供的一种内存测试方法生成的测试报告的示例图;图5为本申请实施例提供的另一种内存测试方法的部分流程图;图6为本申请实施例提供的一种object基类派生出各资源对象的示意图;图7为本申请实施例提供的一种被测终端的结构框图;图8为本申请实施例提供的另一种被测终端的结构框图;图9为本申请实施例提供的一种测试客户端的结构框图;图10为本申请实施例提供的另一种测试客户端的结构框图;图11为本申请实施例提供的又一种测试客户端的结构框图;图12为本申请实施例提供的又一种测试客户端的结构框图。具体实施方式下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。为了方便理解下文各实施例,在此对本文涉及到的一些专业术语或名称进行以下解释:unity:其是由unitytechnologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。unity类似于director,blendergameengine,virtools或torquegamebuilder等利用交互的图型化开发环境为首要方式的软件。其编辑器运行在windows和macosx下,可发布游戏至windows、mac、wii、iphone、webgl(需要html5)、windowsphone8和android平台。也可以利用unitywebplayer插件发布网页游戏,支持mac和windows的网页浏览。它的网页播放器也被macwidgets所支持。so注入:是将一个so放进某个进程的地址空间里,让它成为那个进程的一部分。注入so之后就可以在注入的so中调用目标应用进程的函数。资源对象:unity游戏运行过程中,资源加载后以资源对象的形式存在,占用内存空间。资源对象类型包括但不限于模型、贴图、音频、视频、动画等。图1为本申请实施例提供的一种应用程序内存测试系统的结构示意图,该系统可以包括:被测终端100和测试终端200,所述测试终端200上装载有测试客户端,所述被测终端100上有需要测试的应用程序。在实际应用中,根据需要系统还可以包括网络侧为用户提供服务,且与测试客户端对应的服务器300,与需要测试的应用程序相对应的应用服务器(图1中并未示出),服务器可能是多台服务器组成的服务器群组,也可能由单台服务器实现。可选的,当需要测试的应用程序是各种游戏软件时,应用服务器可以是为用户提供游戏服务的服务设备,此时游戏客户端可以是用于完成对游戏软件的内存测试的应用程序。例如,用于unity游戏性能测试及调优的工具,提供整套的测试方案,可以在无源码情况下对unity游戏进行真机性能测试的natrix。其中,natrix可以兼容全系unity版本即引擎版本。在本申请提供的内存测试方案中,可以在测试终端上实时查看unity游戏运行过程中内存占用情况,即实时获得unity游戏的各种资源对象数据,并对其进行分析,生成测试报告,并基于该测试报告进行风险评估等,以便据此对unity游戏性能进行优化。在实际应用中,被测终端可以是手机、平板电脑等移动终端,而测试终端可以是区别于被测终端的计算机设备,本申请对被测终端以及测试终端的具体产品类型不作限定。如图2所示,为本申请实施例提供的测试终端的硬件结构图,该测试终端可以包括处理器1,通信接口2,显示器3、存储器4和通信总线5;其中,处理器1、通信接口2、显示器3、存储器4可以通过通信总线5完成相互间的通信;可选的,通信接口2可以为无线通信模块的接口以及有线通信模块的接口,如usb接口,gsm模块的接口、wifi模块的接口等;在本申请实际应用中,可以通过无线通信模块的接口与服务器30的无线通信模块建立通信通道,实现测试终端与服务器30之间的数据传输,当然,也可以采用无线通信模块的接口实现两者之间的数据传输。另外,本申请还可以利用有线通信模块的接口与被测终端的有线通信模块的接口连接,从而实现测试终端与被测终端之间的通信连接,进而实现测试客户端与该被测终端的目标应用程序之间的通信,具体可以参见下文方法实施例对应部分的描述。处理器1,用于执行应用程序,如测试客户端等。在本申请中,处理器1可能是一个中央处理器cpu,或者是特定集成电路asic(applicationspecificintegratedcircuit),或者是被配置成实施本发明实施例的一个或多个集成电路。显示器3,用于显示处理器1运行测试客户端输出的不同测试窗口、以及测试进度和测试产生的数据等,如显示在测试终端中运行的测试客户端的操作界面,测试界面等在本申请,显示器3可以是触摸屏或液晶显示屏,本申请对此不作限定,当显示器结构不同时,测试过程中选择测试对象等操作的方式可以相应调整。存储器4,用于存放处理器1执行的应用程序的相关程序代码等信息,还可以缓存应用程序执行过程中产生的各种数据,本申请对其不作限定;其中,应用程序可以包括程序代码,所述程序代码包括计算机操作指令。在本申请中,存储器4可能包含高速ram存储器,也可能还包括非易失性存储器(non-volatilememory),例如至少一个磁盘存储器。本申请中,被测终端的硬件结构与上述测试终端的硬件结构类型,也可以包括处理器、通信接口、显示器、存储器等,其与测试终端的区别在于,被测终端的处理器用于执行游戏软件等应用程序,而非测试客户端,相应的存储器存储的也是如游戏软件等应用程序的相关信息,如程序代码等。所以,本申请在此不再对被测终端的硬件结构详细描述。另外,对于上述服务器30以及应用服务器的硬件结构,都可以包括处理器、通信接口、存储器以及通信总线,各部分的相应功能可以参照上述对测试终端的硬件结构的描述,本申请对其也不再赘述。基于图1示出的内存测试系统的结构示意图,图2示出测试终端的硬件结构图,还有描述的被测终端以及相应服务器的硬件结构,以及对应支持实现的功能,提出了本申请以下各个实施例。如图3所示,为本申请实施例提供的一种内存测试方法的信令流程图,该方法可以包括:步骤s11,测试客户端在测试终端中运行,并与被测终端建立通信连接;在实际应用中,当需要对测试终端中的应用程序内存占用情况进行测试时,用户可以双击测试终端上测试客户端的图标,启动测试客户端,此时,为了方便开发人员了解测试进度,可以在测试终端上输出连接被测终端的测试窗口,如图4(a)所示,但并不局限于图4(a)所示的输出形式。开发人员可以根据测试终端输出的测试窗口,将被测终端与测试终端进行通信连接,测试客户端检测到与测试终端连接的被测终端后,可以与被测终端建立通信连接。可选的,本申请可以利用数据传输线分别连接测试终端通信接口和被测终端的通信接口,如利用usb线,分别连接测试终端的usb端口和被测终端的usb端口,本申请对试终端和被测终端进行通信的通信接口类型不作限定。如图4(b)所示,当测试客户端成功与被测终端建立通信连接后,相对于图4(a)所示的测试窗口,可以增加如“被测终端已连接,请选择一个应用程序开始测试”等内容的提示信息,指示开发人员进行后续测试步骤。步骤s12,测试客户端检测被测终端中满足预设要求的所有应用程序并输出;测试客户端确定与被测终端建立通信连接后,可以系统查找被测终端上满足预设要求的所有应用程序,并将查找到的应用程序及其相关信息显示出来。在本实施例中,达到该步骤后,测试终端显示的测试窗口可以由图4(b)所示的测试窗口变为如图4(c)所示的测试窗口,所显示的应用程序的信息可以包括应用程序的名称、安装路径以及使用的引擎版本号等,本申请对显示的信息内容不作限定。可选的,上述预设要求可以是指使用预设引擎的应用程序,可以包括该预设引擎就有的所有引擎版本号,那么,在实际检测中,可以基于这些引擎版本号确定满足预设要求的所有应用程序,即使用这些引擎版本号中的任意一个引擎版本号的应用程序。步骤s13,测试客户端检测针对当前显示的应用程序的选择指令,确定本次测试的目标应用程序;在如图4(c)所示得到测试窗口中,开发人员可以根据当前测试需要,从中选择一个需要测试内存的应用程序作为目标应用程序,以便后续针对该目标应用程序进行内存测试。可选的,确定目标应用程序后,被测终端还可以进一步验证该目标应用程序使用的引擎版本号是否属于预设引擎,若不属于,可以提示开发人员重新选择一个新的目标应用程序,进一步保证测试的目标应用程序使用的是预设引擎。步骤s14,测试客户端将目标应用程序对应的动态库文件注入目标应用程序的应用进程;在本实施例中,对于不同版本的应用程序通常会设置相应release版本(发布版本)的动态库文件,如libunity.so等动态链接库。因此,测试客户端确定需要测试的目标应用程序后,可以查找与该目标应用程序对应的发布版本的libunity.so,并可以通过socket通信方式,将其注入目标应用程序对应应用进程,替换该目标应用程序自身具有的debug版本(调试版本)的libunity.so。可选的,本申请可以将libloader.so注入被测终端的目标应用程序的应用进程,具体的,可以通过调用ptrace系统函数,获取目标进程寄存器,在目标进程调用dlopen/dlsym等动态库函数,使当前目标进程加载指定的动态库文件。需要说明的是,本申请对so注入的具体实现方式不作限定。其中,libloader.so文件可用来调用目标应用程序使用的引擎未导出接口即测试接口,具体可以调用目标进程的libunity.so文件的未导出接口,以便通过该未导出接口,将目标应用程序未导出的自身调试版本的libunity.so,替换成测试终端发送的针对该目标应用程序的发布版本的libunity.so,但并不局限于此。步骤s15,被测终端执行注入的动态库文件,调取与各种资源对象一一对应的引擎接口;需要说明的是,对于使用同一引擎的不同应用程序来说,实际运行过程中资源对象的类型通常是相同的,且不同应用程序对应同一类型资源对应的引擎接口是相同的。其中,上述动态库文件可以包括上述针对目标应用程序的发布版本的libunity.so文件。在本实施例中,被测终端的目标应用程序的引用进程注入相应的动态库文件后,可以执行该动态库文件,完成初始化操作,为后续测试目标应用程序内存准备。其中,执行动态库文件可以包括利用注入的动态库文件相应的文件替换目标应用程序的一些核心文件,如利用注入的动态库文件中的针对目标应用程序的发布版本的libunity.so替换目标应用程序自身调试版本的libunity.so等;还可以将动态库文件中的钩子(hook)安装到被测终端的目标应用程序的应用进程,即将hook函数写入该应用进程对应的函数库。当然,根据实际需要,动态库文件还可以包括其他信息内容,相应的初始化操作还可以包括其他初始化内容,本申请在此不再一一详述。可选的,由于被测终端的初始化过程是其接收到库文件后自动执行的,为了使开发人员了解初始化情况,还可以在测试终端当前输出的窗口显示被测终端是否在初始化,以及是否完成初始化,可以开始进行测试等信息,如图4(d)所示,但并不局限于图4(d)所示的提示内容和方式。步骤s16,被测终端检测到针对目标应用程序的触发指令,控制所述目标应用程序运行;在实际应用中,在确定被测终端完成初始化后,开发人员可以启动目标应用程序,为了提供测试准确性以及可靠性,在测试期间,开发人员可以在被测终端上实现目标应用程序的各种功能,以便获得更为全面的资源对象数据。另外,开发人员控制目标应用程序在被测终端上运行后,可以点击图4(d)所示的开始按钮,从而正式开始目标应用程序的内存测试。可选的,当目标应用程序为游戏时,完成初始化操作后,将会自动拉起游戏,确定游戏成功拉起后,才会启动该游戏。步骤s17,被测终端通过调取的引擎接口,获得针对目标应用程序的各种资源对象数据;如上述所述,由于每一类型的资源对象都有与其一一对应的引擎接口,当目标应用程序运行期间,所产生的各类资源对象数据都会通过与该类型资源对象对应的引擎接口,所以,被测终端可以通过监测该引擎接口,获得相应类型资源对象的数据。需要说明的是,本申请对获的资源对象数据包含的具体内容不作限定,可以是资源对象个数、资源对象占用内存统计或者其他性能参数等,具体检测过程可以参见下文相应实施例的描述,本实施例在此不再赘述。步骤s18,被测终端将获得的目标应用程序的各类型的资源对象数据发送至测试客户端;可选的,本申请仍可采用socket通信方式,将获得的关于目标应用程序的各资源对象的资源对象数据发送至测试客户端。在资源对象数据实际传输过程中,被测终端可以将获得资源对象数据实时传输至测试客户端,也可以是按照一定周期传输获得的资源对象数据,或者是采集目标应用程序整个运行期间内的所有资源对象数据后,再传输至测试客户端等,本申请对具体传输方式不作限定,可根据实际需要确定。步骤s19,测试客户端检测针对任一个资源对象的数据查看指令,按照预设方式输出该资源对象对应的资源对象数据。开始对目标应用程序的各资源对象测试后,测试客户端可以在测试终端显示如图4(e)所示的测试窗口,但并不局限于如图4(e)所示的输出形式。如图4(e)所示,在测试窗口的主题栏可以显示各资源对象的名称,开发人员可以根据实际查看需要,点击某一个资源对象,如“audio”,从而使该测试窗口的数据显示区域呈现关于audio这一资源对象的数据。可选的,对于测试客户端接收到的各资源对象数据,可存储到测试终端存储器或测试客户端的内存中,根据需要,还可以针对不同资源对象的资源对象数据生成如图4(e)所示的图表,以便更为直观了解目标应用程序的各资源对象的具体情况。其中,关于资源对象的数据图表可以采用如图4(e)所示的形式,也可以采用曲线图,本申请对各资源对象数据的具体输出形式不作限定。可选的,对于测试终端当前显示的资源对象数据,还可以根据需要进行截图保存,且对于不同资源对象的数据可以进行分类存储,但并不局限于此。综上所述,本申请通过向被测终端的目标应用程序的应用进程注入相应的动态库文件,即区别于目标应用程序的调试版本的发布版本动态库文件,调取各资源对象对应的引擎接口,在目标应用程序运行过程中,获得各引擎接口的相应资源对象数据,并呈现在测试终端,从而使开发人员能够直观了解目标应用程序实际运行中细分资源的内存占用情况,精确定位内存占用过高的资源,有针对性地实现对目标应用程序性能优化。作为本申请另一实施例,在上述实施例的基础上,测试客户端得到目标应用程序运行期间的各资源对象数据后,测试终端可以这些资源对象数据同步到服务器,由服务器对这些资源对象数据进行分析,得到测试结果,并在测试结束后,开发人员或其他用户都可以从网页上查看针对该被测终端上的目标应用程序的测试结果。具体的,服务器可以从各资源对象数据中提取所需要的数据,如各资源对象数据的峰值数据等,以判断目标应用程序的各资源对象数据是否满足预存的判断标准,进而根据判断结果生成测试报告,供开发人员参考并优化目标应用程序性能。以audioclip占用内存为例,生成的测试报告可以如图4(f)所示,但并不局限于此可选的,上述预存的判断标准可以是经过经验数据测试确定的,以使用unity的手游为例,可以根据unity官方建议以及unity手游的经验数据,确定判断标准,如下表一所示,但并不局限于此。表一资源项判断标准总体内存占用峰值<150mbmono堆内存峰值<40mbdrawcall峰值<250渲染triangle数峰值<100000skinnedmeshrender峰值<50rigdbody峰值<50碰撞体(静态碰撞+动态碰撞)峰值<100texture内存占用峰值<50mbskinnedmeshrender内存占用峰值<15mbaudioclip内存占用峰值<15mb其中,在测试报告中,可以包括本次对被测终端中的目标应用程序的测试结果的综合描述,比较详细的数据、图标和简要的分析等内容,本申请对该测试报告包含的具体内容不作限定。在实际应用中,为了使其他用户也能够看到目标应用程序在被测终端运行的内存测试结果,开发人员可以在测试终端上选择web端查看数据方式,并将对应的url(uniformresourelocator:统一资源定位器)地址发送至其他用户的终端,以便其他用户登录该url地址同时查看测试数据以及测试报告等内容。作为本申请又一实施例,对于上述测试报告的生成过程也可以在测试终端上实现,也就是说,由测试终端利用接收到的针对目标应用程序的各资源对象数据,生成目标应用程序的测试报告,具体过程与上述测试报告的生成过程类似,本实施在此不再详述。可选的,对于上述实施例中,被测终端获取目标应用程序运行期间各资源对象数据,根据资源对象的不同,所采用的具体获取方式可以不同,下面仅以资源对象个数统计以及资源对象占用内存统计为例,来说明具体的资源对象数据获取过程,对于其他资源对象数据的获取方式,可以参照这两种获取方式并根据资源对象本身特点确定,本申请在此不再一一详述。由于目标应用程序运行期间,其各资源对象数据的获取过程是由被测终端实现的,所以,在上述实施例的基础上,本实施例将从被测终端角度进行描述,如图5所示的流程图,关于被测终端获取资源对象数据的步骤可以参照上文描述的内存测试信令流程内容相应部分的描述,本实施例在此不再赘述。图5示出了本申请实施例提供的另一种内存测试方法的部分流程图,该方法可以用于被测终端,具体是针对资源对象占用内存的统计方法,可以包括以下步骤:步骤s21,静态解析动态库文件,获取目标函数在该动态库文件中的偏移地址;可选的,该目标函数可以是getruntimememorysize()函数,该函数可以是object基类实现的,也可以是各资源子类自己实现,本申请对此不作限定。以目标应用程序是unity游戏为例,unity游戏资源类都是从object基类派生而成,例如mesh、audio、texture等资源对象都继承于nameobject类,如图6所示,但并不局限于本文列举的方式。步骤s22,利用动态库文件的基地址以及偏移地址,确定目标函数的运行地址;本申请可以将动态库文件的基地址与得到的偏移地址相加,得到目标函数在运行时的地址,即运行地址。步骤s23,将运行地址转换为目标函数的函数指针,并利用该函数指针调取目标函数。步骤s24,运行该目标函数,获得当前运行的目标应用程序的各种资源对象占用的内存数据。由此可见,本申请可以通过调取注入目标应用程序的动态库文件中的目标函数,获取资源对象占用的内存数据,并发送至测试客户端显示,以使开发人员能够直观了解目标应用程序运行期间其各种资源对象对内存的占用情况。以一个满足预设要求的应用程序为unity游戏,被测终端为手机、测试终端为计算机,测试客户端为natrix客户端为例,对本申请实施例进行以下说明:当需要对手机上unity游戏进行内存测试时,开发人员启动计算机装载的natrix客户端,从而输出如图4(a)所示的测试界面,开发人员可以根据该提示,通过数据线将手机连接到计算机上的通信接口,从而建立与natrix客户端的通信连接,此时计算机上将是输出如图4(b)所示的测试界面,之后,natrix客户端可以检测手机上使用unity开发的所有游戏app,并输出如图4(c)所示的游戏选择窗口,开发人员可以根据测试需要选择需要测试的游戏app,之后,natrix客户端将会在手机上根据选择的游戏app以及unity版本号进行一些初始化工作,如替换一些核心文件,安装hook等,初始化完成后,将会拉起游戏,如图4(d)所示的测试窗口。当开发人员确定选择的游戏app被成功拉起后,就可以启动该游戏app,并点击图4(d)中的开始按钮,从而使手机开始采集游戏app进行各种游戏操作过程中的各种资源对象数据,并传输至natrix客户端存储,如图4(e)所示,natrix客户端可以对接收到的各种资源对象数据进行图表绘制,开发人员可以点击标题栏中的标签,选择需要查看的某一种资源对象的数据。完成对游戏app的各种资源对象数据的收集后,可以点击停止按钮,之后,natrix客户端的后台服务器将会根据存储的各种资源对象数据,生成针对该游戏app的测试报告,并可以发送至开发人员或其他用户的预设邮箱地址,以便查看。其中,测试包括可以包括本次测试的综合描述,比较详细的数据、图表和简要的分析等内容,如图4(f)所示的测试报告,但并不局限于此。综上,本申请可以采用上述描述的内存测试方法对手机上的所有unity游戏进行测试,本申请在此不再一一详述。如图7所示,为本申请提供的一种被测终端的结构框图,被测终端可以是手机、平板电脑等移动终端,本申请对其具体产品类型不作限定,而且,被测终端上可以设置多个应用程序,还包括:通信模块11,用于与测试终端上装载的测试客户端建立通信连接,并接收测试客户端针对被测终端中的目标应用程序发送的动态库文件;在本实施例中,通信模块可以是socket通信模块,从而使被测终端通过socket通信方式与测试客户端进行通信,但并不局限于此。可选的,与目标应用程序对应的动态库文件可以为so库中的发布版本libunity.so文件,其与目标应用程序自身未调用的调试版本的libunity.so文件不同,具体功能可以参照方法实施例对应部分的描述。处理模块12,用于将动态库文件注入目标应用程序的应用进程并执行,调取与不同资源对象一一对应的引擎接口;申请对so注入的具体过程不作限定,关于处理模块12利用接收到的动态库文件进行初始化的过程可以参照上述方法实施例对应部分的描述,在此不再赘述。数据获取模块13,用于在运行目标应用程序期间,通过调取的引擎接口获得针对目标应用程的各种资源对象数据,并通过通信模块11将获得的目标应用程序的各种资源对象数据发送至测试客户端输出。由此可见,测试客户端可以直接将与需要测试的目标应用程序对应的动态库文件注入目标应用程序的应用进程,以使被测终端自动完成初始化操作,并在启动目标应用程序,并实现该目标应用程序的各功能过程中,将利用动态库文件调取引擎接口,从而获得目标应用程序运行期间各种资源对象数据,并反馈至测试客户端输出,从而使开发人员能够直观了解目标应用程序在被测终端运行过程中,各种资源对象占用内存情况,便于开发人员据此对目标应用程序性能进行有针对性地优化,大大提高了优化效率。可选的,在上述实施例的基础上,为了统计目标应用程序运行期间的资源对象的个数,数据获取模块13具体可以包括:资源对象数量统计单元,用于利用所述动态库文件中的hook函数,确定当前运行的目标应用程序的各种资源对象的总数。需要说明的是,本申请对利用hook函数对资源对象的统计方法不作限定,具体可以参照hook函数本身特性实现,本实施例在此不作详述。可选的,为了统计各资源对象占用内存情况,如图8所示,上述实施例的数据获取模块13还可以包括:目标函数调取单元131,用于调取动态库文件中的目标函数;在本实施例中,目标函数可以是getruntimememorysize()函数,但并不局限于此,可以根据测试需要确定。其中,getruntimememorysize()函数是上述动态库文件中未导出的私有函数。在本实施例中,如图8所示,该目标函数调取单元131可以包括:解析单元1311,用于静态解析动态库文件,获取目标函数在动态库文件中的偏移地址;函数指针确定单元1312,用于利用所述动态库文件的基地址以及所述偏移地址,确定所述目标函数的运行地址,并将所述运行地址转换为所述目标函数的函数指针;函数调取单元1313,用于利用所述函数指针调取目标函数。内存数据获取单元132,用于运行目标函数,获得当前运行的目标应用程序的各种资源对象占用的内存数据。另外,需要说明的是,被测终端还可以利用动态库文件中其他信息来获取目标应用程序的其他性能数据,如drawcall数量、mono占用内存等,具体实现过程可以根据被测性能数据本身特点,并结合上述描述的两种性能数据的测试方法确定,本申请并不限定具体测试方式。如图9所示,为本申请实施例提供的一种测试客户端的结构框图,该测试客户端可以装载测试终端上,测试终端可以是计算机设备,本申请并不限定其具体产品类型,则该测试客户端可以包括:第一通信模块21,用于启动测试客户端后,建立与被测终端的通信连接;如上述方法实施例相应部分的描述,当需要对被测终端中的某类型应用程序进行测试时,可以在测试终端上启动测试客户端后,将被测终端与测试终端连接,从而实现被测终端与测试客户端的通信。其中,测试客户端可以采用socket通信方式与被测终端进行通信,但并不局限于此。目标应用程序确定模块22,用于确定被测终端中符合预设要求的目标应用程序,并通过所述第一通信模块将与所述目标应用程序对应的动态库文件注入所述目标应用程序的应用程序,以使所述被测终端执行所述动态库文件,调取与不同资源对象一一对应的引擎接口;当所述被测终端运行所述目标应用程序,通过所述第一通信模块接收所述被测终端获得并发送的所述目标应用程序的各种资源对象数据;可选的,在实际应用中,如图10所示,该目标应用程序确定模块22可以包括:检测单元221,用于检测并显示被测终端中符合要求的所有应用程序;确定单元222,用于获得针对当前显示的所有应用程序的选择指令,确定本次测试的目标应用程序。其中,关于确定被测终端中目标应用程序的过程可以参照上述方法实施例对应部分的描述,本实施例在此不再详述。在实际应用中,测试客户端确定目标应用程序后,还可以通过调取模块调取与该目标应用程序对应的动态库文件。输出模块23,用于检测针对任一个资源对象的数据查看指令,按照预设方式输出相应的资源对象数据。在本实施例,测试客户端接收到目标应用程序的各种资源对象数据后,可以对其进行分析,得到相应的各种资源对象数据图表等,如图4(e)所示的资源对象数据的输出形式,但并不局限于此。可选的,上述输出模块23还可以输出测试窗口,如上图4(a)~(d)所示,测试窗口可以包含有已完成的内存测试步骤,以及用于指示所述内存测试下一步骤的提示信息。综上可知,本申请测试客户端通过与被测终端的目标应用程序建立通信连接,并将该目标应用程序对应的动态库文件发送至目标应用程序的应用进行,从而使被测终端完成初始后,并在实现目标应用程序的各种功能期间,由被测终端利用该动态库文件调用引擎接口,获取各种资源对象数据,并实时反馈至测试客户端显示,从而使开发人员能够直观了解目标应用程序在被测终端运行过程中,各种资源对象占用内存情况,便于开发人员据此对目标应用程序性能进行有针对性地优化,大大提高了优化效率。可选的,在上述测试客户端实施例的基础上,如图11所示,该测试客户端还可以包括:第二通信模块24,用于将接收到的各种资源对象数据同步到服务器,以使服务器对所述各种资源对象数据进行分析,生成针对所述目标应用程序的测试报告。其中,关于服务器对各种资源对象进行分析,生成测试报告的具体过程可以参照上述方法实施例对应部分的描述,本实施在此不再赘述。另外,为了能够使其他用户实时查看目标应用程序的测试数据,如图12所示,测试客户端还可以包括:数据查看模式切换模块25,用于触发所述测试客户端切换到网页数据查看模式;第三通信模块26,用于将切换后的url地址发送至第二终端,以使所述第二终端显示所述测试客户端接收到的各种资源对象数据。基于此,其他用户的终端即第二终端接收到url地址后,可以进入与测试终端相同的网页测试界面,实时了解测试客户端对被测终端中的目标应用程序的测试过程。本申请实施例还提供了一种内存测试系统,参数上图1所示的结构图,该测试系统可以包括:被测终端100和测试终端200,测试终端200上装载有测试客户端;所述测试客户端,用于在启动后与被测终端建立通信连接,确定被测终端中符合预设要求的目标应用程序,并将与所述目标应用程序对应的动态库文件注入所述目标应用程序的应用程序;所述被测终端200,用于接收所述测试客户端针对所述被测终端中的目标应用程序发送的动态库文件,并将所述动态库文件注入所述目标应用程序的应用进程并执行,调取与不同资源对象一一对应的引擎接口,在运行所述目标应用程序期间,通过调取的引擎接口获得针对所述目标应用程的各种资源对象数据,将获得的所述目标应用程序的各种资源对象数据发送至所述测试客户端,以使所述测试客户端检测到针对任一个资源对象的数据查看指令,按照预设方式输出相应的资源对象数据。可选的,为了实现数据共享,测试系统还可以包括服务器300,其中:服务器300,用于同步所述测试客户端接收到的针对所述目标应用程序的各种资源对象数据,并对对所述各种资源对象数据进行分析,生成针对所述目标应用程序的测试报告。需要说明的是,关于本系统实施例中各组成部分的具体功能实现过程可以参照上述方法实施例对应部分的描述,本实施在此不再赘述。综上所述,本申请实施例能够在目标应用程序运行过程中,获得该目标应用程序各细分资源的实时内存占用情况,即获得各种资源对象数据,从而使开发人员根据测试结果,精确定位到真实应用场景中内存占用过高的资源对象,大大提高了目标应用程序性能优化效率。最后,需要说明的是,关于上述各实施例中,诸如第一、第二等之类的关系术语仅仅用来将一个操作、单元或模块与另一个操作、单元或模块区分开来,而不一定要求或者暗示这些单元、操作或模块之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法或者系统不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法或者系统所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法或者系统中还存在另外的相同要素。本说明书中各个实施例采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似部分互相参见即可。对于实施例公开的装置而言,由于其与实施例公开的方法相对应,所以描述的比较简单,相关之处参见方法部分说明即可。专业人员还可以进一步意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、计算机软件或者二者的结合来实现,为了清楚地说明硬件和软件的可互换性,在上述说明中已经按照功能一般性地描述了各示例的组成及步骤。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本申请的范围。结合本文中所公开的实施例描述的方法或算法的步骤可以直接用硬件、处理器执行的软件模块,或者二者的结合来实施。软件模块可以置于随机存储器(ram)、内存、只读存储器(rom)、电可编程rom、电可擦除可编程rom、寄存器、硬盘、可移动磁盘、cd-rom、或
技术领域
内所公知的任意其它形式的存储介质中。对所公开的实施例的上述说明,使本领域专业技术人员能够实现或使用本申请。对这些实施例的多种修改对本领域的专业技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本申请的精神或范围的情况下,在其它实施例中实现。因此,本申请将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。当前第1页1 2 3 
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1