屏幕刷新率的确定方法和装置与流程

文档序号:12363405阅读:319来源:国知局
屏幕刷新率的确定方法和装置与流程

本申请涉及应用测试领域,尤其涉及屏幕刷新率(Frames Per Second,FPS)的确定方法和装置。



背景技术:

当前,随着智能手机的普及,针对智能手机所开发的手机应用也是种类繁多。由于智能手机的硬件局限性,手机应用往往需要比计算机应用有更严格的性能要求,其中,应用运行流畅是对手机应用的一个基本的性能要求,它直接影响着用户体验,为了衡量手机应用运行是否流畅,通常,可以获取手机应用运行时的屏幕刷新率,将屏幕刷新率作为衡量手机应用是否流畅的量化指标。

现有技术中,针对手机上常用的安卓(Android)操作系统,通过获取应用页面根节点DecorView,然后设置事件监听器OnPreDrawListener对DecorView进行监听,从而实现对页面的重画进行监听,以便确定屏幕刷新率。

由上可见,当采用现有技术中的方式来确定屏幕刷新率时,由于只针对应用根节点设置监听器,所以当被测应用调用第三方的activity组件时,无法得到此时的屏幕刷新率。



技术实现要素:

本申请实施例提供了屏幕刷新率的确定方法和装置,通过将动态链接库加入系统进程,能够得到系统在任何应用切换状态下的屏幕刷新率。

一方面,提供了一种屏幕刷新率的确定方法,所述方法包括:

采用注入的方式将动态链接库加入图层投递进程,所述图层投递进程为系统进程,所述图层投递进程通过调用第一图像渲染函数完成屏幕刷新操作;

通过所述图层投递进程调用所述动态链接库,以便通过钩挂方法将所述第一图像渲染函数替换为第二图像渲染函数;

在屏幕刷新重画时,通过所述图层投递进程调用所述第二图像渲染函数,以便通过所述第二图像渲染函数统计屏幕刷新次数,根据所述屏幕刷新次数确定屏幕刷新率。

优选地,所述在屏幕刷新重画时,通过所述图层投递进程调用所述第二图像渲染函数,以便通过所述第二图像渲染函数统计屏幕刷新次数,根据所述屏幕刷新次数确定屏幕刷新率,包括:

在屏幕刷新重画时,通过所述图层投递进程调用所述第二图像渲染函数,通过所述第二图像渲染函数调用所述第一图像渲染函数完成屏幕刷新操作,并通过变量累加屏幕刷新次数,根据所述屏幕刷新次数确定屏幕刷新率。

优选地,所述采用注入的方式将动态链接库加入图层投递进程,包括:

找到图层投递进程的进程文件目录地址;

根据所述目录地址,利用系统调用函数控制图层投递进程;

获取所述图层投递进程中库加载函数、地址查找函数和库移除函数的函数地址,所述库加载函数用于将所述动态链接库加载到所述图层投递进程的内存中,所述地址查找函数用于查找所述动态链接库中的指定函数在所述内存中的地址,所述库移除函数用于在满足预设条件时将所述动态链接库从所述图层投递进程的内存中移除;

根据所述函数地址,调用所述库加载函数、所述地址查找函数和所述库移除函数将所述动态链接库加入所述图层投递进程。

优选地,所述通过所述图层投递进程调用所述动态链接库,以便通过钩挂方法将所述第一图像渲染函数替换为第二图像渲染函数,包括:

通过所述图层投递进程调用所述动态链接库,记录所述第一图像渲染函数 的函数地址;

获取所述第一图像渲染函数的函数地址在全局偏移表(Global Offset Tables,GOT)中的位置信息;

根据所述位置信息,用所述第二图像渲染函数的函数地址覆盖GOT中的所述第一图像渲染函数的函数地址,以便在屏幕刷新重画时调用所述第二图像渲染函数而非所述第一图像渲染函数。

优选地,所述通过所述图层投递进程调用所述动态链接库,以便通过钩挂方法将所述第一图像渲染函数替换为第二图像渲染函数,包括:

通过所述图层投递进程调用所述动态链接库,以便创建共享内存,并通过钩挂方法将所述第一图像渲染函数替换为第二图像渲染函数;

所述在屏幕刷新重画时,通过所述图层投递进程调用所述第二图像渲染函数,以便通过所述第二图像渲染函数统计屏幕刷新次数,根据所述屏幕刷新次数确定屏幕刷新率,包括:

在屏幕刷新重画时,通过所述图层投递进程调用所述第二图像渲染函数,以便通过所述第二图像渲染函数统计屏幕刷新次数,根据所述屏幕刷新次数确定屏幕刷新率,并将所述屏幕刷新率写入所述共享内存。

另一方面,提供了一种屏幕刷新率的确定装置,所述装置包括:

注入单元,用于采用注入的方式将动态链接库加入图层投递进程,所述图层投递进程为系统进程,所述图层投递进程通过调用第一图像渲染函数完成屏幕刷新操作;

钩挂单元,用于通过所述图层投递进程调用所述注入单元注入的动态链接库,以便通过钩挂方法将所述第一图像渲染函数替换为第二图像渲染函数;

确定单元,用于在屏幕刷新重画时,通过所述图层投递进程调用所述钩挂单元替换后的所述第二图像渲染函数,以便通过所述第二图像渲染函数统计屏幕刷新次数,根据所述屏幕刷新次数确定屏幕刷新率。

优选地,所述确定单元包括:

屏幕刷新子单元,用于在屏幕刷新重画时,通过所述图层投递进程调用所述第二图像渲染函数,通过所述第二图像渲染函数调用所述第一图像渲染函数完成屏幕刷新操作;

确定子单元,用于通过变量累加屏幕刷新次数,根据所述屏幕刷新次数确定屏幕刷新率。

优选地,所述注入单元包括:

查找子单元,用于找到图层投递进程的进程文件目录地址;

控制子单元,用于根据所述查找子单元找到的目录地址,利用系统调用函数控制图层投递进程;

地址获取子单元,用于获取所述图层投递进程中库加载函数、地址查找函数和库移除函数的函数地址,所述库加载函数用于将所述动态链接库加载到所述图层投递进程的内存中,所述地址查找函数用于查找所述动态链接库中的指定函数在所述内存中的地址,所述库移除函数用于在满足预设条件时将所述动态链接库从所述图层投递进程的内存中移除;

注入子单元,用于根据所述地址获取子单元获取的函数地址,调用所述库加载函数、所述地址查找函数和所述库移除函数将所述动态链接库加入所述图层投递进程。

优选地,所述钩挂单元包括:

记录子单元,用于通过所述图层投递进程调用所述动态链接库,记录所述第一图像渲染函数的函数地址;

位置获取子单元,用于获取所述第一图像渲染函数的函数地址在GOT中的位置信息;

覆盖子单元,用于根据所述位置获取子单元获取的位置信息,用所述第二图像渲染函数的函数地址覆盖GOT中的所述第一图像渲染函数的函数地址,以便在屏幕刷新重画时调用所述第二图像渲染函数而非所述第一图像渲染函数。

优选地,所述钩挂单元包括:

创建子单元,用于通过所述图层投递进程调用所述动态链接库,以便创建共享内存;

替换子单元,用于通过钩挂方法将所述第一图像渲染函数替换为第二图像渲染函数;

所述确定单元包括:

确定子单元,用于在屏幕刷新重画时,通过所述图层投递进程调用所述第二图像渲染函数,以便通过所述第二图像渲染函数统计屏幕刷新次数,根据所述屏幕刷新次数确定屏幕刷新率;

写入子单元,用于将所述确定子单元确定的屏幕刷新率写入所述创建子单元创建的共享内存。

本申请提供了一种屏幕刷新率的确定方法,先采用注入的方式将动态链接库加入图层投递进程,所述图层投递进程为系统进程,所述图层投递进程通过调用第一图像渲染函数完成屏幕刷新操作;通过所述图层投递进程调用所述动态链接库,以便通过钩挂方法将所述第一图像渲染函数替换为第二图像渲染函数;在屏幕刷新重画时,通过所述图层投递进程调用所述第二图像渲染函数,以便通过所述第二图像渲染函数统计屏幕刷新次数,根据所述屏幕刷新次数确定屏幕刷新率。由上可见,本申请实施例中,通过将动态链接库加入图层投递进程的方式来实现确定屏幕刷新率,由于上述方式属于针对系统进程的更改,不会对应用本身产生任何影响,并且能够得到系统在任何应用切换状态下的屏幕刷新率。

附图说明

图1为本申请实施例提供的屏幕刷新率的确定方法流程图;

图2为本申请一个具体实施例提供的注入方法流程图;

图3为本申请一个具体实施例提供的钩挂方法流程图;

图4为本申请一个具体实施例提供的屏幕刷新率数据传递示意图;

图5为本申请实施例提供的屏幕刷新率的确定装置结构图。

具体实施方式

为使本申请实施例的目的、技术方案和优点更加清楚,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。

为便于对本申请实施例的理解,下面将结合附图以具体实施例做进一步的解释说明,实施例并不构成对本申请实施例的限定。

图1为本申请实施例提供的屏幕刷新率的确定方法流程图,该方法的执行主体可以为具有安卓操作系统的智能手机,或者,具有安卓操作系统的其他终端,如图1所示,该方法具体包括:

步骤101,采用注入的方式将动态链接库加入图层投递进程,所述图层投递进程为系统进程,所述图层投递进程通过调用第一图像渲染函数完成屏幕刷新操作。

其中,图层投递进程可以用于转换程序所画内容,并投递给底层硬件进行显示,例如,安卓操作系统的Surfaceflinger进程。第一图像渲染函数可以用于将需要显示的下一帧图像内容交换到屏幕正在显示的图像缓存中,例如,Eglswapbuffers函数。

本申请实施例中,所述采用注入的方式将动态链接库加入图层投递进程,具体可以包括:找到图层投递进程的进程文件目录地址;根据所述目录地址,利用系统调用函数控制图层投递进程;获取所述图层投递进程中库加载函数、地址查找函数和库移除函数的函数地址,所述库加载函数用于将所述动态链接库加载到所述图层投递进程的内存中,所述地址查找函数用于查找所述动 态链接库中的指定函数在所述内存中的地址,所述库移除函数用于在满足预设条件时将所述动态链接库从所述图层投递进程的内存中移除;根据所述函数地址,调用所述库加载函数、所述地址查找函数和所述库移除函数将所述动态链接库加入所述图层投递进程。图2为本申请一个具体实施例提供的注入方法流程图,参照图2,为了将动态链接库加入Surfaceflinger进程,可以先找到Surfaceflinger进程的proc目录地址,然后根据所述目录地址,利用ptrace函数控制Surfaceflinger进程,获取Surfaceflinger进程中dlopen函数、dlsym函数和dlclose函数的函数地址,再根据所述函数地址,调用dlopen函数、dlsym函数和dlclose函数将动态链接库加入Surfaceflinger进程。

步骤102,通过所述图层投递进程调用所述动态链接库,以便通过钩挂方法将所述第一图像渲染函数替换为第二图像渲染函数。

其中,具体可以通过Surfaceflinger进程调用所述动态链接库,以便通过钩挂方法将Eglswapbuffers函数替换为fakeEglswapbuffers函数。

本申请实施例中,所述通过所述图层投递进程调用所述动态链接库,以便通过钩挂方法将所述第一图像渲染函数替换为第二图像渲染函数,可以包括下述处理过程:通过所述图层投递进程调用所述动态链接库,记录所述第一图像渲染函数的函数地址;获取所述第一图像渲染函数的函数地址在全局偏移表(Global Offset Tables,GOT)中的位置信息;根据所述位置信息,用所述第二图像渲染函数的函数地址覆盖GOT中的所述第一图像渲染函数的函数地址,以便在屏幕刷新重画时调用所述第二图像渲染函数而非所述第一图像渲染函数。

此外,在上述钩挂方法中,还可以先创建共享内存,在确定出屏幕刷新率后,将屏幕刷新率写入共享内存,以便应用程序可以从该共享内存中读取屏幕刷新率,从而实现将系统进程中得到的屏幕刷新率的数值传递到应用进程中。

图3为本申请一个具体实施例提供的钩挂方法流程图,参照图3,为了将Eglswapbuffers函数替换为fakeEglswapbuffers函数,可以通过Surfaceflinger进程调用动态链接库,记录Eglswapbuffers函数的函数地址,获取Eglswapbuffers函数的函数地址在GOT表中的位置信息,根据所述位置信息,用fakeEglswapbuffers函数的函数地址覆盖GOT表中的Eglswapbuffers函数的函数地址,以便在屏幕刷新重画时调用fakeEglswapbuffers函数而非Eglswapbuffers函数。

在上述钩挂方法中,还可以先使用mmap函数创建共享内存,在确定出屏幕刷新率后,将屏幕刷新率写入共享内存,以便应用程序可以从该共享内存中读取屏幕刷新率,从而实现将Surfaceflinger进程中得到的屏幕刷新率的数值传递到应用进程中。

图4为本申请一个具体实施例提供的屏幕刷新率数据传递示意图,参照图4,本申请实施例中,可以通过注入程序将动态链接库加入运行中的Surfaceflinger进程,由Surfaceflinger进程调用该动态链接库,从而完成Eglswapbuffers函数钩挂,将Eglswapbuffers函数替换为fakeEglswapbuffers函数,在屏幕刷新重画时,Surfaceflinger进程调用fakeEglswapbuffers函数,fakeEglswapbuffers函数中先调用Eglswapbuffers函数完成屏幕刷新操作,然后通过一个变量累加刷新次数,最后通过该计数值计算得到FPS并写入共享内存。应用程序可以通过JNI接口读取共享内存中的FPS值提供给上层使用。

步骤103,在屏幕刷新重画时,通过所述图层投递进程调用所述第二图像渲染函数,以便通过所述第二图像渲染函数统计屏幕刷新次数,根据所述屏幕刷新次数确定屏幕刷新率。

具体地,在屏幕刷新重画时,可以通过所述图层投递进程调用所述第二图像渲染函数,通过所述第二图像渲染函数调用所述第一图像渲染函数完成屏幕刷新操作,并通过变量累加屏幕刷新次数,根据所述屏幕刷新次数确定屏 幕刷新率。

例如,在屏幕刷新重画时,通过Surfaceflinger进程调用fakeEglswapbuffers函数,以便统计屏幕刷新次数,根据所述屏幕刷新次数确定屏幕刷新率。其中,fakeEglswapbuffers函数可以通过调用Eglswapbuffers函数完成屏幕刷新操作,并通过变量累加屏幕刷新次数,根据屏幕刷新次数确定屏幕刷新率。

本申请实施例提供了一种屏幕刷新率的确定方法,先采用注入的方式将动态链接库加入图层投递进程,所述图层投递进程为系统进程,所述图层投递进程通过调用第一图像渲染函数完成屏幕刷新操作;通过所述图层投递进程调用所述动态链接库,以便通过钩挂方法将所述第一图像渲染函数替换为第二图像渲染函数;在屏幕刷新重画时,通过所述图层投递进程调用所述第二图像渲染函数,以便通过所述第二图像渲染函数统计屏幕刷新次数,根据所述屏幕刷新次数确定屏幕刷新率。由上可见,本申请实施例中,通过将动态链接库加入图层投递进程的方式来实现确定屏幕刷新率,由于上述方式属于针对系统进程的更改,不会对应用本身产生任何影响,并且能够得到系统在任何应用切换状态下的屏幕刷新率。

具体地,由于Android底层使用Surfaceflinger服务完成屏幕的刷新重画,而每次重画都会调用EglSwapBuffers方法,本申请通过注入Surfaceflinger进程,然后将EglSwapBuffers函数映射为自己的fakeEglswapbuffers函数完成每次屏幕更新的计数,并通过该计数计算出屏幕刷新率。整个过程都自己实现,不依赖框架,同时因为注入对象是系统服务,所以对应用程序没有影响而且能够得到系统在任何应用切换状态下的屏幕刷新率。

图5为本申请实施例提供的屏幕刷新率的确定装置结构图,该装置用于执行本申请实施例提供的屏幕刷新率的确定方法,所述装置包括:

注入单元501,用于采用注入的方式将动态链接库加入图层投递进程,所 述图层投递进程为系统进程,所述图层投递进程通过调用第一图像渲染函数完成屏幕刷新操作;

钩挂单元502,用于通过所述图层投递进程调用所述注入单元501注入的动态链接库,以便通过钩挂方法将所述第一图像渲染函数替换为第二图像渲染函数;

确定单元503,用于在屏幕刷新重画时,通过所述图层投递进程调用所述钩挂单元502替换后的所述第二图像渲染函数,以便通过所述第二图像渲染函数统计屏幕刷新次数,根据所述屏幕刷新次数确定屏幕刷新率。

优选地,所述确定单元503包括:

屏幕刷新子单元,用于在屏幕刷新重画时,通过所述图层投递进程调用所述第二图像渲染函数,通过所述第二图像渲染函数调用所述第一图像渲染函数完成屏幕刷新操作;

确定子单元,用于通过变量累加屏幕刷新次数,根据所述屏幕刷新次数确定屏幕刷新率。

优选地,所述注入单元501包括:

查找子单元,用于找到图层投递进程的进程文件目录地址;

控制子单元,用于根据所述查找子单元找到的目录地址,利用系统调用函数控制图层投递进程;

地址获取子单元,用于获取所述图层投递进程中库加载函数、地址查找函数和库移除函数的函数地址,所述库加载函数用于将所述动态链接库加载到所述图层投递进程的内存中,所述地址查找函数用于查找所述动态链接库中的指定函数在所述内存中的地址,所述库移除函数用于在满足预设条件时将所述动态链接库从所述图层投递进程的内存中移除;

注入子单元,用于根据所述地址获取子单元获取的函数地址,调用所述库加载函数、所述地址查找函数和所述库移除函数将所述动态链接库加入所述图层投递进程。

优选地,所述钩挂单元502包括:

记录子单元,用于通过所述图层投递进程调用所述动态链接库,记录所述第一图像渲染函数的函数地址;

位置获取子单元,用于获取所述第一图像渲染函数的函数地址在GOT中的位置信息;

覆盖子单元,用于根据所述位置获取子单元获取的位置信息,用所述第二图像渲染函数的函数地址覆盖GOT中的所述第一图像渲染函数的函数地址,以便在屏幕刷新重画时调用所述第二图像渲染函数而非所述第一图像渲染函数。

优选地,所述钩挂单元502包括:

创建子单元,用于通过所述图层投递进程调用所述动态链接库,以便创建共享内存;

替换子单元,用于通过钩挂方法将所述第一图像渲染函数替换为第二图像渲染函数;

所述确定单元503包括:

确定子单元,用于在屏幕刷新重画时,通过所述图层投递进程调用所述第二图像渲染函数,以便通过所述第二图像渲染函数统计屏幕刷新次数,根据所述屏幕刷新次数确定屏幕刷新率;

写入子单元,用于将所述确定子单元确定的屏幕刷新率写入所述创建子单元创建的共享内存。

本申请实施例提供了一种屏幕刷新率的确定装置,先由注入单元501采用注入的方式将动态链接库加入图层投递进程,所述图层投递进程为系统进程,所述图层投递进程通过调用第一图像渲染函数完成屏幕刷新操作;再由钩挂单元502通过所述图层投递进程调用所述动态链接库,以便通过钩挂方法将所述第一图像渲染函数替换为第二图像渲染函数;最后由确定单元503在屏幕刷新重画时,通过所述图层投递进程调用所述第二图像渲染函数,以 便通过所述第二图像渲染函数统计屏幕刷新次数,根据所述屏幕刷新次数确定屏幕刷新率。由上可见,本申请实施例中,通过将动态链接库加入图层投递进程的方式来实现确定屏幕刷新率,由于上述方式属于针对系统进程的更改,不会对应用本身产生任何影响,并且能够得到系统在任何应用切换状态下的屏幕刷新率。

专业人员应该还可以进一步意识到,结合本文中所公开的实施例描述的各示例的对象及算法步骤,能够以电子硬件、计算机软件或者二者的结合来实现,为了清楚地说明硬件和软件的可互换性,在上述说明中已经按照功能一般性地描述了各示例的组成及步骤。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本申请的范围。

结合本文中所公开的实施例描述的方法或算法的步骤可以用硬件、处理器执行的软件模块,或者二者的结合来实施。软件模块可以置于随机存储器(RAM)、内存、只读存储器(ROM)、电可编程ROM、电可擦除可编程ROM、寄存器、硬盘、可移动磁盘、CD-ROM、或技术领域内所公知的任意其它形式的存储介质中。

以上所述的具体实施方式,对本申请的目的、技术方案和有益效果进行了进一步详细说明,所应理解的是,以上所述仅为本申请的具体实施方式而已,并不用于限定本申请的保护范围,凡在本申请的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本申请的保护范围之内。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1