掌桥专利:专业的专利平台
掌桥专利
首页

技术领域

本申请涉及终端技术领域,尤其涉及一种线程处理方法及电子设备。

背景技术

随着电子设备(如手机)的发展,电子设备能够安装的应用(application,APP)的数目和类型越来也多。

电子设备中的APP在运行的过程中,由于APP自身代码逻辑等原因,电子设备运行的该APP对应的线程中可能会存在异常线程,影响用户体验。

发明内容

有鉴于此,本申请提供了一种线程处理方法及电子设备,可以提高用户体验。

第一方面,本申请提供一种线程处理方法,电子设备可以接收用户对该电子设备的第一APP的启动操作,并响应于该启动操作,启动该第一APP。

在上述电子设备运行该第一APP的过程中,该电子设备可以判断该第一APP对应的线程是否满足第一预设条件。如果该线程满足第一预设条件,该电子设备可以确定该线程为异常线程。其中,第一预设条件可以包括线程与该第一APP对应的渲染线程不存在依赖关系,和该线程属于所述第一APP对应的线程中的从大到小排名中前M的线程(或称为重载线程)。该M为正整数。

如果该线程不满足第一预设条件,如该线程属于重载线程,且与该第一APP对应的渲染线程存在依赖关系,表明该线程影响画面渲染,因此,该电子设备可以确定该线程为正常线程。

之后,上述电子设备可以停止运行该异常线程,或者,降低该异常线程所占用的运行资源。

本申请中,当第一APP对应的线程属于重载线程,且又与第一APP对应的渲染线程不存在依赖关系时,表明该线程负载较大,且可能与第一APP的画面渲染无关,因此,该线程可能属于异常线程,实现异常线程的确定。并且在确定该第一APP对应的异常线程后,该电子设备可以停止运行该异常线程,或者,降低该异常线程所占用的运行资源(如CPU资源),以减少该电子设备的功耗,即可以减少该电子设备的耗电量,避免该电子设备出现高耗电和发热的问题,提高用户体验。

在一种可能的设计方式中,上述第一预设条件还可以包括所述线程为自唤醒线程;该自唤醒线程指示线程不是由其它线程唤醒的。示例性的,该自唤醒线程可以指示该线程不是在距离当前时间的第二预设时间内由其它线程唤醒的,也就是说该线程被唤醒的时间是处于当前时间之前,且距离当前时间超过预设时间。

本申请中,当线程为重载线程,且与第一APP对应的渲染线程存在依赖关系时,该电子设备可以继续判断该线程是否为自唤醒线程。如果该线程是自唤醒线程,表明该线程影响画面渲染可能性较小,该电子设备可以直接确定该线程为异常线程。

在一种可能的设计方式中,上述第一预设条件还包括第一渲染帧率与第二渲染帧率之间的差值大于预设帧率差值。

其中,该第一渲染帧率表示对降低该线程所占用的运行资源之后的渲染帧率,该第二渲染帧率表示降低该线程所占用的运行资源之前的渲染帧率。

在另一种可能的设计方式中,当第一渲染帧率与第二渲染帧率之间的差值小于或等于预设帧率差值时,表明在对减少对线程的资源供给后,第一APP的渲染帧率变小,也即表明该线程影响画面渲染,因此,该电子设备可以确定该线程为正常线程,并可以恢复对该线程的资源供给。

本申请中,当第一APP对应的线程属于重载线程,且又与第一APP对应的渲染线程不存在依赖关系时,表明该线程可能属于异常线程。因此,该电子设备可以减少对该线程的资源供给,以通过减少资源供给前后的渲染帧率确定该线程是否影响画面渲染。在该差值大于预设帧率差值情况下,表明在减少该线程的资源供给后,该第一APP的渲染帧率未发生变化,即表明该线程不影响画面渲染,因此,该电子设备可以确定该线程为异常线程。在该差值小于或等于预设帧率差值情况下,表明在减少该线程的资源供给后,该第一APP的渲染帧率变小,即表明该线程影响画面渲染,因此,该电子设备可以确定该线程为正常线程。

在一种可能的设计方式中,上述第一预设条件还包括在线程不为自唤醒线程的情况下,第一渲染帧率与第二渲染帧率之间的差值大于预设帧率差值。

本申请中,当第一APP对应的线程属于重载线程,且又与第一APP对应的渲染线程不存在依赖关系时,如果该线程为自唤醒线程,该电子设备可以直接确定该线程为异常线程。如果该线程不为自唤醒线程,该电子设备可以继续通过第一渲染帧率与第二渲染帧率之间的差值确定该线程是否为异常线程。

在一种可能的设计方式中,上述降低异常线程所占用的运行资源包括下述至少一种:将异常线程由第一CPU内核迁移至目标CPU内核,该目标CPU内核的频点小于该第一CPU内核的频点,将异常线程所在的CPU内核的频点由第一频点变为第二频点,该第二频点小于该第一频点,以降低异常线程所占用的运行资源(如CPU资源)。同理,上述降低线程所占用的运行资源包括下述至少一种:将线程由第一CPU内核迁移至目标CPU内核,该目标CPU内核的频点小于该第一CPU内核的频点,将线程所在的CPU内核的频点由第一频点变为第二频点,该第二频点小于该第一频点,以降低线程所占用的运行资源(如CPU资源)。

在一种可能的设计方式中,电子设备确定线程与所述第一APP对应的渲染线程是否存在依赖关系的过程可以包括:

该电子设备确定该第一APP对应的渲染线程。

该电子设备确定该第一APP对应的关键线程;该关键线程包括该渲染线程以及与该渲染线程存在依赖关系的线程,即关键线程表示直接或间接影响画面渲染的线程。

在该线程不属于上述关键线程的情况下,该电子设备确定该线程与该第一APP对应的渲染线程不存在依赖关系,即确定该线程可能不会影响画面渲染。

在该线程属于上述关键线程的情况下,该电子设备确定该线程与该第一APP对应的渲染线程存在依赖关系,即确定该线程会影响画面渲染。

示例性的,上述依赖关系可以指示唤醒关系。相应的,上述关键线程中的与该渲染线程存在依赖关系的线程的过程可以包括:上述电子设备基于该电子设备生成的日志中的预设唤醒字段,确定电子设备运行的线程之间的唤醒关系;

该电子设备基于所述线程之间的唤醒关系,确定与该渲染线程存在唤醒关系,即依赖关系的线程,实现与该第一APP对应的渲染线程存在依赖关系的线程的准确确定,从而可以实现该第一APP对应的关键线程的确定。

示例性的,上述第一APP对应的渲染线程可以通过以下两种实现方式确定。

在一种实现方式中,在所述第一APP的类型为游戏类型的情况下,所述电子设备将所述第一APP对应的线程中的调用预设绘制指令次数最多的线程作为所述第一APP对应的渲染线程。

示例性的,预设绘制指令包括drawcall指令。

在另一种实现方式中,所述电子设备获取渲染的画面图层的名称,并将所述画面图层的名称对应的线程作为所述第一APP对应的渲染线程。

本申请中,电子设备可以图层名称或者调用预设绘制指令次数,确定第一APP对应的渲染线程,实现第一APP对应的渲染线程的准确确定。

第二方面,本申请提供一种电子设备,所述电子设备包括异常线程识别模块和中央处理器CPU频点控制模块;

所述异常线程识别模块,用于在所述电子设备的第一应用程序APP启动后,确定所述第一APP对应的线程中的异常线程;其中,所述异常线程满足第一预设条件,所述第一预设条件包括所述线程与所述第一APP对应的渲染线程不存在依赖关系,和所述线程属于所述第一APP对应的线程中负载从大到小排名中前M的线程;所述M为正整数;

所述CPU频点控制模块,用于停止运行所述异常线程识别模块确定的所述异常线程,或者,降低所述异常线程所占用的运行资源。

在一种可能的设计方式中,上述电子设备还包括应用类型识别模块和渲染线程识别模块。应用类型识别模块确定该第一APP的类型,并向渲染线程识别模块发送该第一APP的类型。该类型指示该第一APP是否为游戏类APP。

示例性的,该应用类型识别模块可以将该第一APP的应用包名与云端记录的APP类型匹配,以查找该第一APP的类型。

在一种可能的设计方式中,渲染线程识别模块利用第一信息确定该第一APP对应的渲染线程的线程号,并向该关键线程识别模块发送该渲染线程的线程号。

示例性的,一种情况下,当第一APP的类型为游戏类型时,上述渲染线程识别模块可以基于调用预设绘制指令的次数以及APP的应用类型确定渲染线程。相应的,上述第一信息可以包括调用预设绘制指令的各个线程的线程号以及各个线程号对应的调用次数。之后,该渲染线程识别模块可以将调用次数最多的线程号作为该第一APP对应的渲染线程的线程号。

另一种情况下,上述渲染线程识别模块可以基于渲染的画面图层的名称以及画面图层与线程之间的对应关系确定渲染线程。相应的,上述第一信息可以包括当前渲染的画面图层名称。

另一种情况下,上述渲染线程识别模块可以基于画面图层以及画面图层的屏幕显示方式确定渲染线程。相应的,上述第一信息可以包括当前渲染的画面图层名称以及该画面图层的屏幕显示方式。

在一种可能的设计方式中,上述电子设备还包括CPU负载计算模块和线程负载统计模块。

CPU负载计算模块向线程负载统计模块发送负载查询请求。该负载查询请求可以包括该第一APP的应用包名,其可用于获取该第一APP对应的进程中的各个线程的负载。

上述线程负载统计模块在接收上述负载查询请求后,可以响应于该负载查询请求,向上述CPU负载计算模块返回该第一APP的应用包名所对应的各个线程号及各个线程号所对应的负载。

上述CPU负载计算模块在接收上述各个线程号所对应的负载后,可以执行步骤i、按照负载由大到小的顺序,对该各个线程号进行排序,并向该手机中的关键线程识别模块发送排序后的线程号。

在一种可能的设计方式中,上述关键线程识别模块可以从排序后的线程号中选取前M个线程号,并将其作为重载线程的线程号。对于每个重载线程的线程号,如果该重载线程的线程号不属于关键线程的线程号,则向常线程识别模块发送该重载线程的线程号。

其中,上述关键线程包括上述第一APP对应的渲染线程以及与该渲染线程存在唤醒关系的线程。

第三方面,本申请提供一种电子设备,所述电子设备包括显示屏、存储器和一个或多个处理器;所述显示屏、所述存储器和所述处理器耦合;所述显示屏用于显示所述处理器生成的图像,所述存储器用于存储计算机程序代码,所述计算机程序代码包括计算机指令;当所述处理器执行所述计算机指令时,使得所述电子设备执行如上述第一方面中任一项所述的线程处理方法。

第四方面,本申请提供一种计算机可读存储介质,包括计算机指令,当所述计算机指令在电子设备上运行时,使得所述电子设备执行如上述第一方面中任一项所述的线程处理方法。

第五方面,本申请提供一种计算机程序产品,当所述计算机程序产品在电子设备上运行时,使得所述电子设备执行如上述第一方面中任一项所述的线程处理方法。

可以理解地,上述提供的第二方面、第三方面所述的电子设备,第四方面所述的计算机可读存储介质,第五方面所述的计算机程序产品所能达到的有益效果,可参考第一方面及其任一种可能的设计方式中的有益效果,此处不再赘述。

附图说明

图1A为本申请实施例提供的一种应用启动的界面示意图一;

图1B为本申请实施例提供的一种应用启动的界面示意图二;

图1C为本申请实施例提供的一种线程运行的示意图;

图2为本申请实施例提供的一种电子设备的硬件结构示意图;

图3为本申请实施例提供的一种电子设备的软件结构示意图;

图4为本申请实施例提供的一种线程处理方法的流程示意图一;

图5为本申请实施例提供的一种图层名称的示意图;

图6为本申请实施例提供的一种线程处理方法的流程示意图二。

具体实施方式

以下,术语“第一”、“第二”仅用于描述目的,而不能理解为指示或暗示相对重要性或者隐含指明所指示的技术特征的数量。由此,限定有“第一”、“第二”的特征可以明示或者隐含地包括一个或者更多个该特征。在本实施例的描述中,除非另有说明,“多个”的含义是两个或两个以上。

为了更好的理解本申请的方案,以下介绍本申请实施例所涉及的术语。

线程(thread):是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一个进程中可以并发多个线程,并且每条线程并行执行不同的任务。

可运行(runnable)状态:或称为就绪状态。处于可运行状态的线程位于可运行线程池中,等待被线程调度选中,以获取CPU的使用权。也就是说处于可运行状态的线程除CPU资源之外,其它的运行所需资源都已获得。

运行状态(Running):当可运行状态的线程获取了CPU资源时,该线程的状态变为运行状态。处于运行状态的线程可以执行程序代码。

在电子设备(如手机)运行APP的过程中,由于APP的代码逻辑等问题,该电子设备运行的该APP对应的线程中可能会存在异常线程,如长时间运行,且与界面渲染无关的线程。

由于异常线程一般不会自动结束运行,其会长时间运行,电子设备会给长时间运行的线程提供更多的CPU资源,如该电子设备将该长时间运行的线程迁移至性能更强的CPU内核,或者,该电子设备提高该长时间运行的线程所在的CPU内核的频点(即频率)等。这会造成CPU资源的浪费,从而导致电子设备的系统级芯片(system on chip,SOC)耗电量增加,进而造成电子设备的耗电快,并且电子设备可能会出现发热问题。以及由于异常线程对CPU资源的占用,可能会影响其它正常线程的资源的分配,从而导致程序卡顿,影响用户体验。例如,由于异常线程对高性能的CPU内核的占用,电子设备无法将其它正常线程迁移到该高性能的CPU内核上。

举例来说,如图1A所示,用户点击手机桌面上的王者荣耀

因此,针对上述问题,本申请提供一种线程处理方法。在电子设备的某个APP启动后,该电子设备可以判断该APP对应的线程是否满足第一预设条件。该第一预设条件可以包括该APP对应的线程与该APP对应的渲染不存在依赖关系,该APP对应的线程的负载较大,即该APP对应的线程属于该APP对应的线程中负载从大到小排名中前M的线程。如果该APP对应的线程满足第一预设条件,表明该线程与画面渲染无关,则该电子设备可以确定该线程为异常线程。如果该APP对应的线程不满足该第一预设条件,该电子设备可以确定该APP对应的线程为正常线程,那么该电子设备可以继续正常运行该APP对应的线程。之后,该电子设备在确定异常线程后,可以停止运行该异常线程或者对该异常线程执行资源降低操作,减少对该电子设备的运行资源(如CPU资源)的消耗,从而可以减少电子设备的功耗,降低该电子设备的耗电量,并且可以减少该电子设备的发热。以及可以避免由于异常线程对高性能的CPU内核的占用,导致电子设备无法将其它正常线程迁移到该高性能的CPU内核上,从而避免出现程序卡顿的问题,提高用户体验。

示例性的,本申请实施例中的电子设备可以是手机、平板电脑、桌面型、膝上型、手持计算机、笔记本电脑、超级移动个人计算机(ultra-mobile personal computer,UMPC)、上网本,以及可穿戴设备、个人数字助理(personal digital assistant,PDA)、增强现实(augmented reality,AR)虚拟现实(virtual reality,VR)设备等能够运行APP的电子设备,本申请实施例对该电子设备的具体形态不作特殊限制。

示例性的,图2示出了电子设备200的结构示意图。如图2所示,电子设备200可以包括处理器210,外部存储器接口220,内部存储器221,通用串行总线(universal serialbus,USB)接口230,充电管理模块211,电源管理模块212,电池213,天线1,天线2,移动通信模块240,无线通信模块250,音频模块270,扬声器270A,受话器270B,麦克风270C,耳机接口270D,传感器模块280,按键290,马达291,指示器292,摄像头293,显示屏294,以及用户标识模块(subscriber identification module,SIM)卡接口295等。

可以理解的是,本发明实施例示意的结构并不构成对电子设备200的具体限定。在本申请另一些实施例中,电子设备200可以包括比图示更多或更少的部件,或者组合某些部件,或者拆分某些部件,或者不同的部件布置。图示的部件可以以硬件,软件或软件和硬件的组合实现。

处理器210可以包括一个或多个处理单元,例如:处理器210可以包括应用处理器(applicationprocessor,AP),调制解调处理器,图形处理器(graphics processing unit,GPU),图像信号处理器(image signalprocessor,ISP),控制器,存储器,视频编解码器,数字信号处理器(digital signal processor,DSP),基带处理器,和/或神经网络处理器(neural-network processingunit,NPU)等。其中,不同的处理单元可以是独立的器件,也可以集成在一个或多个处理器中。

在一些实施例中,上述处理器210可以包括CPU。该CPU可以包括至少一个CPU内核。CPU内核的类型可以分为大核、小核和中核,不同类型的CPU内核的性能不同,如不同类型的CPU内核对应的频点不同。例如,该CPU内核的数量为8,其包括1个大核、3个中核和4个小核。大核对应的频点高于中核对应的频点,中核对应的频点高于小核对应的频点。其中,同一类型的CPU内核对应的频点可以相同,如该3个中核对应的频点可以相同。当然,同一类型的CPU内核所对应的频点也可能不同。

其中,控制器可以是电子设备200的神经中枢和指挥中心。控制器可以根据指令操作码和时序信号,产生操作控制信号,完成取指令和执行指令的控制。

处理器210中还可以设置存储器,用于存储指令和数据。在一些实施例中,处理器210中的存储器为高速缓冲存储器。该存储器可以保存处理器210刚用过或循环使用的指令或数据。如果处理器210需要再次使用该指令或数据,可从所述存储器中直接调用。避免了重复存取,减少了处理器210的等待时间,因而提高了系统的效率。

在一些实施例中,处理器210可以包括一个或多个接口。接口可以包括集成电路(inter-integrated circuit,I2C)接口,集成电路内置音频(inter-integrated circuitsound,I2S)接口,脉冲编码调制(pulse code modulation,PCM)接口,通用异步收发传输器(universal asynchronous receiver/transmitter,UART)接口,移动产业处理器接口(mobile industry processor interface,MIPI),通用输入输出(general-purposeinput/output,GPIO)接口,用户标识模块(subscriber identitymodule,SIM)接口,和/或通用串行总线(universal serial bus,USB)接口等。

可以理解的是,本发明实施例示意的各模块间的接口连接关系,只是示意性说明,并不构成对电子设备200的结构限定。在本申请另一些实施例中,电子设备200也可以采用上述实施例中不同的接口连接方式,或多种接口连接方式的组合。

充电管理模块211用于从充电器接收充电输入。其中,充电器可以是无线充电器,也可以是有线充电器。在一些有线充电的实施例中,充电管理模块211可以通过USB接口230接收有线充电器的充电输入。在一些无线充电的实施例中,充电管理模块211可以通过电子设备200的无线充电线圈接收无线充电输入。充电管理模块211为电池213充电的同时,还可以通过电源管理模块212为电子设备供电。

电子设备200的无线通信功能可以通过天线1,天线2,移动通信模块240,无线通信模块250,调制解调处理器以及基带处理器等实现。

天线1和天线2用于发射和接收电磁波信号。电子设备200中的每个天线可用于覆盖单个或多个通信频带。不同的天线还可以复用,以提高天线的利用率。例如:可以将天线1复用为无线局域网的分集天线。在另外一些实施例中,天线可以和调谐开关结合使用。

移动通信模块240可以提供应用在电子设备200上的包括2G/3G/4G/5G等无线通信的解决方案。移动通信模块240可以包括至少一个滤波器,开关,功率放大器,低噪声放大器(low noise amplifier,LNA)等。移动通信模块240可以由天线1接收电磁波,并对接收的电磁波进行滤波,放大等处理,传送至调制解调处理器进行解调。移动通信模块240还可以对经调制解调处理器调制后的信号放大,经天线1转为电磁波辐射出去。在一些实施例中,移动通信模块240的至少部分功能模块可以被设置于处理器210中。在一些实施例中,移动通信模块240的至少部分功能模块可以与处理器210的至少部分模块被设置在同一个器件中。

调制解调处理器可以包括调制器和解调器。其中,调制器用于将待发送的低频基带信号调制成中高频信号。解调器用于将接收的电磁波信号解调为低频基带信号。随后解调器将解调得到的低频基带信号传送至基带处理器处理。低频基带信号经基带处理器处理后,被传递给应用处理器。应用处理器通过音频设备(不限于扬声器270A,受话器270B等)输出声音信号,或通过显示屏294显示图像或视频。在一些实施例中,调制解调处理器可以是独立的器件。在另一些实施例中,调制解调处理器可以独立于处理器210,与移动通信模块240或其他功能模块设置在同一个器件中。

无线通信模块250可以提供应用在电子设备200上的包括无线局域网(wirelesslocal area networks,WLAN)(如无线保真(wireless fidelity,Wi-Fi)网络),蓝牙(bluetooth,BT),全球导航卫星系统(global navigation satellite system,GNSS),调频(frequency modulation,FM),近距离无线通信技术(near field communication,NFC),红外技术(infrared,IR)等无线通信的解决方案。无线通信模块250可以是集成至少一个通信处理模块的一个或多个器件。无线通信模块250经由天线2接收电磁波,将电磁波信号调频以及滤波处理,将处理后的信号发送到处理器210。无线通信模块250还可以从处理器210接收待发送的信号,对其进行调频,放大,经天线2转为电磁波辐射出去。

电子设备200通过GPU,显示屏294,以及应用处理器等实现显示功能。GPU为图像处理的微处理器,连接显示屏294和应用处理器。GPU用于执行数学和几何计算,用于图形渲染。处理器210可包括一个或多个GPU,其执行程序指令以生成或改变显示信息。

显示屏(或称为屏幕)294用于显示图像,视频等。显示屏294包括显示面板。显示面板可以采用液晶显示屏(liquid crystal display,LCD),有机发光二极管(organiclight-emitting diode,OLED),有源矩阵有机发光二极体或主动矩阵有机发光二极体(active-matrix organic light emitting diode的,AMOLED),柔性发光二极管(flexlight-emitting diode,FLED),Miniled,MicroLed,Micro-oLed,量子点发光二极管(quantum dot light emitting diodes,QLED)等。在一些实施例中,电子设备200可以包括1个或N个显示屏294,N为大于1的正整数。

电子设备200可以通过ISP,摄像头293,视频编解码器,GPU,显示屏294以及应用处理器等实现拍摄功能。

外部存储器接口220可以用于连接外部存储卡,例如Micro SD卡,实现扩展电子设备200的存储能力。

内部存储器221可以用于存储计算机可执行程序代码,所述可执行程序代码包括指令。处理器210通过运行存储在内部存储器221的指令,从而执行电子设备200的各种功能应用以及数据处理。内部存储器221可以包括存储程序区和存储数据区。其中,存储程序区可存储操作系统,至少一个功能所需的应用程序(比如声音播放功能,图像播放功能等)等。存储数据区可存储电子设备200使用过程中所创建的数据(比如音频数据,电话本等)等。此外,内部存储器221可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件,闪存器件,通用闪存存储器(universal flash storage,UFS)等。

电子设备200可以通过音频模块270,扬声器270A,受话器270B,麦克风270C,耳机接口270D,以及应用处理器等实现音频功能。例如音乐播放,录音等。

按键290包括开机键,音量键等。按键290可以是机械按键。也可以是触摸式按键。

指示器292可以是指示灯,可以用于指示充电状态,电量变化,也可以用于指示消息,未接来电,通知等。

传感器模块280可以包括压力传感器,陀螺仪传感器,气压传感器,磁传感器,加速度传感器,距离传感器,接近光传感器,指纹传感器,温度传感器,触摸传感器,环境光传感器,骨传导传感器等。

上述电子设备200的软件系统可以采用分层架构,事件驱动架构,微核架构,微服务架构,或云架构。本发明实施例以分层架构的Android系统为例,示例性说明电子设备200的软件结构。

图3是本发明实施例的电子设备200的结构框图。

分层架构将软件分成若干个层,每一层都有清晰的角色和分工。层与层之间通过软件接口通信。在一些实施例中,将Android系统分为四层,从上至下分别为应用程序层,应用程序框架层,原生(native)层以及内核层。

应用程序层可以包括一系列应用程序包。

如图3所示,应用程序包可以包括相机,游戏,日历,通话,地图,导航,WLAN,蓝牙,音乐,视频,短信息等应用程序。

在一些实施例中,应用程序层中的应用程序可以分为游戏类APP和非游戏类APP。

应用程序框架层为应用程序层的应用程序提供应用编程接口(applicationprogramming interface,API)和编程框架。应用程序框架层包括一些预先定义的函数。

如图3所示,应用程序框架层可以包括窗口管理器,内容提供器,视图系统,资源管理器,通知管理器、应用类型识别模块等。

应用类型识别模块可用于识别应用程序的类型。

窗口管理器用于管理窗口程序。窗口管理器可以获取显示屏大小,判断是否有状态栏,锁定屏幕,截取屏幕等。

内容提供器用来存放和获取数据,并使这些数据可以被应用程序访问。所述数据可以包括视频,图像,音频,拨打和接听的电话,浏览历史和书签,电话簿等。

视图系统包括可视控件,例如显示文字的控件,显示图片的控件等。视图系统可用于构建应用程序。显示界面可以由一个或多个视图组成的。例如,包括短信通知图标的显示界面,可以包括显示文字的视图以及显示图片的视图。

电话管理器用于提供电子设备200的通信功能。例如通话状态的管理(包括接通,挂断等)。

资源管理器为应用程序提供各种资源,比如本地化字符串,图标,图片,布局文件,视频文件等等。

通知管理器使应用程序可以在状态栏中显示通知信息,可以用于传达告知类型的消息,可以短暂停留后自动消失,无需用户交互。比如通知管理器被用于告知下载完成,消息提醒等。通知管理器还可以是以图表或者滚动条文本形式出现在系统顶部状态栏的通知,例如后台运行的应用程序的通知,还可以是以对话窗口形式出现在屏幕上的通知。例如在状态栏提示文本信息,发出提示音,电子设备振动,指示灯闪烁等。

原生层包括SurfaceFlinger、libhwui、libEGL、CPU负载计算模块、帧率检测模块、异常线程识别模块、CPU频点控制模块、渲染线程识别模块和关键线程识别模块。

上述CPU负载计算模块可用于按照负载大小,对APP对应的线程进行排序。该CPU计算模块还可以将排序后的线程提供给关键线程识别模块。

上述帧率检测模块可用于确定渲染帧率。

上述异常线程识别模块可用于接收关键线程识别模块发送的线程号,并可以判断该线程号对应的线程是否为异常线程。

上述CPU频点控制模块可用于降低线程的资源供给,如降低线程所占用的CPU资源。

上述渲染线程识别模块可用于识别上述电子设备200运行的APP所对应的渲染线程。

上述关键线程识别模块可用于确定关键线程,该关键线程可以包括上述渲染线程以及与该渲染线程存在唤醒关系的线程。以及该关键线程识别模块还可以用于判断上述排序后的线程中的前M个线程是否属于关键线程。

上述libhwui可以包括2D图形库,如skia图形库。

上述libEGL可以包括标准图形库,即3D图形库,如Vulkan、OpenGL图形库。

上述SurfaceFlinger可用于接收图形显示数据,即渲染后的图像数据,并将它们合成,得到画面数据。然后,可以向显示屏发送该画面数据。

在一些实施例中,原生层可以包括硬件抽象层。硬件抽象层为位于操作系统内核与硬件电路之间的接口层。

内核层是硬件和软件之间的层。内核层至少包含显示驱动,摄像头驱动,音频驱动,传感器驱动,CPU频点决策模块,线程负载统计模块。

上述线程负载统计模块可用于量化得到线程的负载。

上述CPU频点决策模块可用于控制CPU降低对线程的资源供给。

可以理解的是,图3示出的结构中的层以及各层中包含的部件,并不构成对电子设备200的具体限定。在本申请另一些实施例中,结构可以包括比图示更多或更少的层,以及每个层中可以包括更多或更少的部件,本申请不做限定。

本申请提供一种线程处理方法。电子设备在APP运行的过程中,可以确定该APP对应的负载较大的线程以及关键线程,该关键线程包括渲染线程以及与该渲染线程存在依赖关系的线程。该关键线程直接或间接地影响应用的界面渲染。如果负载较大的线程是关键线程,表明该负载较大的线程与界面渲染相关,该线程负载较大是正常的,因此,该电子设备可以确定该负载较大的线程是正常线程。而如果该负载较大的线程不是关键线程,表明该负载较大的线程可能与界面渲染无关,该负载较大的线程可能是异常的。因此,该电子设备可以进一步确定该负载较大的线程是否属于异常线程,实现异常线程的准确确定。并且该电子设备在确定异常线程后,可以停止运行异常线程,从而可以减少CPU资源的消耗,进而可以减少电子设备的耗电量,提高用户使用满意度。

下面将以上述电子设备是手机为例,结合附图对本申请实施例提供的线程处理方法进行详细介绍。如图4所示,该方法可以包括步骤S301-S311。

S301、在第一APP启动后,手机确定该第一APP所对应的渲染线程。

其中,渲染线程可以是负责该第一APP的画面渲染的线程。示例性的,上述第一APP对应的渲染线程可以通过以下几种可能的实现方式确定:

在一种实现方式中,手机可以获取渲染的画面图层的名称,基于画面图层的名称以及画面图层与线程之间的对应关系确定渲染线程。

其中,该画面图层属于上述手机运行的第一APP中的画面所包括的图层,一个画面可以包括一个或多个图层。该手机可以获取与该画面图层的名称对应的线程的线程号,与画面图层的名称对应的线程便为该第一APP的渲染线程。其中画面图层的名称可以用于标识该画面图层所属的APP。线程的线程号可以用于标识线程,一个线程对应一个线程号,每个线程存在对应的任务,如渲染画面。示例性的,当线程执行渲染任务时,手机可以记录该线程所负责渲染的画面图层的名称。因此,当手机得到渲染的画面图层的名称后,可以通过该画面图层的名称查找对应线程。

如图5所示,手机获取的画面图层的名称为SurfaceView[com.tencent.tmgp.sgame/com.tencent.tmgp.sgame.SGameActivity]#5(BLASTConsumer)。其中,com.tencent.tmgp.sgame指示这个图层属于王者荣耀

具体的,手机的APP所对应的渲染线程可以将渲染的画面数据存放到手机的SurfaceFlinger模块中的queueBuffer中。因此,手机可以从该queueBuffer中获取渲染的画面数据(如画面图层的名称)。

在另一种实现方式中,基于画面图层以及画面图层的屏幕显示方式确定渲染线程。

由于手机可以同时显示多个应用的界面。例如,手机在显示王者荣耀

需要说明的是,对于上述基于画面图层的名称以及画面图层与线程之间的对应关系确定渲染线程,以及上述基于画面图层以及画面图层的屏幕显示方式确定渲染线程这两种实现方式不限制第一APP的类型。换言之,无论上述第一APP的类型是游戏类型或者非游戏类型,该手机均可以基于这两种实现方式确定该第一APP对应的渲染线程。

在另一种实现方式中,基于调用预设绘制指令的次数以及APP的应用类型确定渲染线程。

当手机运行的APP的类型为游戏类型时,该APP对应的线程渲染游戏画面时,可以调用预设绘制指令,将在距离当前时间的第一预设时间内调用预设绘制指令最多的线程作为上述第一APP对应的渲染线程。

示例性的,该预设绘制指令可以包括drawcall指令。具体的,手机可以通过hook图形库接口,确定在距离当前时间的第一预设时间内调用该图像库的drawcall指令的线程的线程号,并统计各个线程号对应的调用次数。之后,该手机可以将调用次数最多的线程号作为上述第一APP所对应的渲染线程的线程号。

在一些实施例中,上述第一APP的类型可以是手机在启动该第一APP时确定的。示例性的,当用户启动该第一APP时,该手机可以将该第一APP的应用包名与云端记录的APP类型进行匹配,以查找该第一APP的类型。例如,第一APP的应用包名为王者荣耀

S302、该手机基于第一APP所对应的渲染线程确定关键线程。其中,该关键线程包括渲染线程以及与该渲染线程存在依赖关系的线程。

其中,与渲染线程存在依赖关系的线程(或者称为与渲染线程关联的线程)可能会直接或间接影响该第一APP画面的渲染。依赖关系可以替换描述为关联关系,即本申请中的依赖关系和关联关系具备等同意思。示例性的,依赖关系又可以被替换描述为唤醒关系,即本申请中的依赖关系和唤醒关系具备等同意思。两个线程之间存在唤醒关系可以表示两个线程中的一个线程被另一线程直接或间接唤醒。当一个线程被另一个线程间接唤醒时,表明该一个线程是通过其它线程被该另一个线程唤醒的。例如,线程A是被线程B唤醒的,线程B是被线程C唤醒的,那么该线程A是被该线程B直接唤醒的,该线程A是被线程C间接唤醒的。

可以理解的是,当线程被唤醒后,该线程开始执行相应的任务。当一个线程需要调用另一个线程时,该一个线程可以先唤醒该另一个线程。

可选的,唤醒关系可以包括在线程日志中,或者关联树,或者可以包括在线程调度表中。下面介绍确定上述关键线程的可能的几种实现方式。

在一种实现方式中,依赖关系可以通过查询线程日志得到。比如手机可以从线程日志中查询与上述第一APP对应的渲染线程存在依赖关系的线程。示例性的,手机可以通过线程日志中的唤醒(wakeup)字段确定线程之间的唤醒关系,这里的唤醒关系实际为直接唤醒。例如,线程日志包括线程Awakeup by线程B。这条线程日志表示线程A是被线程B直接唤醒的,线程A和线程B均是指线程号。

由于线程间调用关系比较复杂,APP对应的所有线程之间可能都有唤醒关系。因此,该手机可以按照关联关系由大到小的顺序,选取N个与上述第一APP对应的渲染线程存在唤醒关系的线程。N为正整数。

其中,线程与渲染线程之间的关联关系大小可以根据该线程对应的中间线程的数量确定。线程对应的中间线程可以实现该线程借助该中间线程与渲染线程之间产生关联关系。应理解,若线程与渲染线程直接关联,则该线程没有对应的中间线程或者理解为该线程对应的中间线程的数量为零。若间接关联,则该线程对应有中间线程,该中间线程的数量非零。示例性的,线程对应的中间线程的数量与该线程与渲染线程之间的关联关系成反比,比如该其它线程越少,该线程与该渲染线程之间的关联关系越大,反之,中间线程的数量越多,该线程与渲染线程之间的关联关系越小。

例如,以渲染线程被线程A唤醒,线程A被线程B唤醒为例,该渲染线程是被线程A直接唤醒,而被线程B间接唤醒。换言之,线程A与渲染线程之间是直接关联,而线程B通过线程A与渲染线程之间是间接关联,即线程A和线程B均与该渲染线程存在关联关系。其中,线程A与渲染线程之间不存在中间线程,二者之间的关联关系较大,线程B则是通过线程A与渲染线程关联,二者之间存在中间线程,且中间线程的数量为1,因此线程B与渲染线程之间的关联关系较小。

在又一种实现方式中,依赖关系可以通过查询关联树得到。手机可以基于线程之间的唤醒关系,生成上述渲染线程对应的关联树,该关联树的根节点为渲染线程。该根节点的子节点为与该渲染线程存在直接关联的线程。之后,该手机可以按照从上到下的顺序,从该关联树中选取N个线程,并将选取的N个线程作为与该渲染线程存在依赖关系的线程。

应理解,当线程与渲染线程之间的关联关系越大,该线程越有可能影响画面渲染,因此,该手机在确定与第一APP对应的渲染线程存在依赖关系(或称为唤醒关系)的线程时,可以按照关联关系由大到小的顺序,选取N个与上述第一APP对应的渲染线程存在唤醒关系的线程。

在另一种实现方式中,依赖关系可以用线程调度表中得到。比如手机可以从缓存中获取线程调度表。该线程调度表记录有线程之间的唤醒关系,这里的唤醒关系实际为直接唤醒。当某个线程被唤醒时,该手机可以记录该线程是被哪个线程直接唤醒的。之后,该手机可以从线程调度表中确定与上述第一APP的渲染线程存在依赖关系的线程。示例性的,该手机可以按照关联关系由大到小的顺序,从该线程调度表中选取N个与该第一APP对应的渲染线程存在唤醒关系的线程。

本申请实施例中,当第一APP在手机的前台运行时,该手机上的该第一APP对应的进程中的渲染线程可以渲染该APP所需显示的画面。由于手机显示的画面是不断刷新的,相应的,该渲染线程需要不断地执行渲染工作,使得渲染线程的负载比较大。并且与该渲染线程存在依赖关系的线程可能也会直接或间接地影响画面渲染,因此,与渲染线程存在依赖关系的线程的负载也会较大。为了减少由于异常线程所消耗的手机功耗,该手机可以确定第一APP对应的关键线程,以供利用该关键线程识别出该手机运行的该第一APP对应的线程中的异常线程,也就是说如果该第一APP对应的线程如果不属于关键线程,表明该第一APP对应的线程可能与画面渲染无关,该第一APP对应的线程可能为异常线程,实现异常线程的识别。

S303、上述手机确定上述第一APP对应的线程中的重载线程。其中重载线程表示该第一APP对应的线程中的负载从大到小排名在前M个的线程。

示例性的,手机可以从该手机的Linux内核中获取上述第一APP对应的进程中的各个线程的负载。之后,按照负载由大到小的顺序,该手机可以对该进程对应的所有线程排序,得到排序后的线程。之后,该手机可以将该排序后的线程中的前M个线程作为该第一APP对应的重载线程,从而得到该第一APP对应的负载较大的线程。其中,该M为正整数。

在一些实施例中,上述线程的负载可以是基于WALT(windows-assistloadtracing)算法量化出的线程实际消耗的计算量。其中,线程的负载大小的影响因素可以包括该线程所在的CPU内核对应的实时算力和运行时间,该运行时间表示该线程在该CPU内核上运行的时间。示例性的,该实时算力是基于该CPU内核的频点量化得到的。应理解,CPU内核的频点越高,该CPU内核的实时算力越大。CPU大核的实时算力大于CPU中核的实时算力,CPU中核的实时算力大于CPU小核的实时算力。例如,假设CPU5的频点为1.8G,其对应的算力为900,线程1在CPU5上运行了10秒,则该线程1的负载可以为900*10。

S304、对于每个上述重载线程,该手机判断该重载线程是否属于关键线程。

本申请实施例中,该手机可以分别判断该手机的每个重载线程是否属于关键线程。当重载线程属于关键线程时,表明该重载线程会影响上述第一APP的画面渲染,则该手机可以执行S305。当该重载线程不属于关键线程时,表明该重载线程可能不会影响该手机的渲染,即表明该重载线程可能是异常线程,则该手机可以执行S306,以进一步判断该重载线程是否为异常线程。

S305、上述手机确定该重载线程是正常线程。

示例性的,当手机确定重载线程是正常线程时,该手机可以继续正常运行该重载线程,如将该重载线程由该重载线程当前所处的CPU内核迁移到性能更高的CPU内核上。

S306、上述手机判断该重载线程是否是自唤醒线程。

其中,上述自唤醒线程表示在距离当前时间的第二预设时间内,不是由其它线程唤醒的线程,换言之,在距离当前时间的第二预设时间内,如果查找不到与某个线程存在唤醒关系的其它线程,那么该某个线程便为自唤醒线程。例如,第二预设时间可以为1分钟,重载线程为线程1。当在距离当前时间的1分钟内,该手机未从上述线程日志、上述关联树或者上述线程调度表中查找到与该线程1存在唤醒关系的线程,那么该手机可以确定该线程1是自唤醒线程。

本申请实施例中,在确定重载线程不属于关键线程的情况下,该手机可以判断在距离当前时间的第二预设时间内,该重载线程是否由其它线程唤醒的。如果不是由其它线程唤醒的,表明该重载线程是自唤醒线程,那么该手机可以认为该重载线程与上述第一APP的界面渲染无关,换言之,该手机可以确定该重载线程是非必要线程,因此,该手机可以执行S307。如果该重载线程是由其它线程唤醒的,表明该重载线程不是自唤醒线程,那么该手机可以将该重载线程标记为疑似异常线程,并可以执行S308,以进一步判断该重载线程是否属于异常线程,实现异常线程的准确判断。

S307、该手机确定该重载线程为异常线程,并停止运行该异常线程。

在一些实施例中,手机在确定重载线程为异常线程后,该手机可以对该重载线程进行资源降低操作,换言之,该手机可以降低该异常线程所占用的运行资源(如CPU资源、网络资源、存储资源等),而不停止运行该异常线程,从而可以避免结束该异常线程的运行导致第一APP的运行受到影响,保证用户可以正常使用该第一APP,并且由于减少该异常线程对手机资源的消耗,可以改善手机的高耗电以及发热问题。

示例性的,上述资源降低操作可以是指手机将线程(如上述异常线程)由第一CPU内核迁移至目标CPU内核,该第一CPU内核表示该线程当前所在的CPU内核,该目标CPU内核的频点小于该第一CPU内核的频点。或者,上述资源降低操作可以是指手机将该线程所在的CPU内核的频点由第一频点变为第二频点。该第一频点表示该CPU内核的当前频点,该第二频点小于该第一频点。

S308、该手机对该重载线程进行资源降低操作,该资源降低操作用于指示降低该重载线程所占用的运行资源。

S309、在对上述重载线程执行资源降低操作后,该手机确定上述第一APP的第一渲染帧率以及第二渲染帧率。

其中,上述第一渲染帧率表示该手机的当前渲染帧率,该第二渲染帧率表示手机在对上述重载线程(这里的重载线程实际表示疑似异常线程)执行该资源降低操作之前的渲染帧率。渲染帧率表示手机显示上述第一APP的画面的速率(或称为频率)。

本申请实施例中,当上述重载线程不是自唤醒线程时,该手机可以将该重载线程作为疑似异常线程。之后,该手机可以对该疑似异常线程进行资源降低操作,以降低对该疑似异常线程的资源供给。应理解,当该疑似异常线程的资源降低后,如果该疑似异常线程影响上述第一APP的画面渲染,那么该第一APP的渲染帧率将会变低。如果该疑似异常线程与画面渲染无关,那么该第一APP的渲染帧率一般不会发生变化或者变化程度很小。如此,在对疑似异常线程进行资源降低操作后,该手机可以获取该手机的当前渲染帧率(或称为第一渲染帧率),并可以将当前渲染帧率与在对该疑似异常线程执行资源降低操作之前的渲染帧率(或称为第二渲染帧率)进行比较,以确定该疑似异常线程对画面渲染是否有影响,从而确定该疑似异常线程是否为异常线程。

S310、在该第一渲染帧率与该第二渲染帧率之间的差值小于或等于预设帧率差值的情况下,该手机确定上述重载线程为正常线程。其中,该预设帧率差值小于0。

S311、在该第一渲染帧率与该第二渲染帧率之间的差值大于预设帧率差值的情况下,该手机确定上述重载线程为异常线程。

在本申请实施例中,该手机可以计算上述第一渲染帧率与上述第二渲染帧率之间的差值。当该差值小于或等于预设帧率差值时,表明当前渲染帧率变小程度较大,也即表明上述疑似异常线程对画面渲染存在影响,因此,该手机可以确定该疑似异常线程为正常线程。且为了保证第一APP的画面正常渲染,该手机可以对该疑似异常线程进行资源恢复操作,以恢复对该疑似异常线程的资源供给。

在上述第一渲染帧率与第二渲染帧率之间的差值大于预设帧率差值的情况下,表明在减少对疑似异常线程的资源供给后,该第一APP的渲染帧率未受到影响或影响程度较小,也即表明该疑似异常线程与该第一APP的画面渲染无关,因此,该手机可以确定该疑似异常线程为异常线程。且为了减少异常线程对手机资源的占用,该手机可以停止运行该异常线程,从而减少手机的功耗。

示例性的,上述资源恢复操作与上述资源降低操作相对应。例如,上述资源降低操作指示将疑似异常线程由第一CPU内核迁移至目标CPU内核,那么该资源恢复操作可以指示将该疑似异常线程由该目标CPU内核迁回至该第一CPU内核。又例如,上述资源降低操作指示将该疑似异常线程所在的CPU内核的频点由第一频点变为第二频点,那么该资源恢复操作可以指示将该疑似异常线程所在的CPU内核的频点由第二频点变为第一频点。

在一些实施例中,在确定疑似异常线程为异常线程后,该手机可以不停止运行该异常线程,且由于该疑似异常线程已经对手机资源的占用较小,因此,该手机可以不对该异常线程进行操作,从而在降低资源浪费的基础上,可以保证第一APP的正常运行。

在一些实施例中,在确定上述疑似异常线程为正常线程后,该手机可以在一定时间内停止判断该疑似异常线程是否为异常线程。换言之,该手机在该一定时间内确定的重载线程可以不包括该疑似异常线程,从而避免线程的重复判断。而在经过一定时间后,该手机可以继续正常判断该疑似异常线程是否为异常线程,避免由于丢帧等原因导致线程的误判。

在一些实施例中,在上述第一APP启动后,上述手机可以周期性识别该第一APP对应的线程中的异常线程。或者,在执行一次异常线程的识别后,该手机可以经过第三预设时间后,重新执行一次异常线程的识别,避免由于丢帧等原因导致线程的误判,从而减少异常线程对手机的功耗的消耗。

需要说明的是,由于第一APP对应的负载较大的线程(或称为重载线程)对手机功耗的消耗较大,而负载较小的线程(即第一APP对应的除该重载线程以外的线程)对手机功耗消耗较小,因此,手机可以判断第一APP对应的重载线程是否为异常线程,而不判断该第一APP对应的负载较小的线程是否为异常线程。当然,该手机也可以判断第一APP对应的各个线程是否为异常线程,判断第一APP对应的各个线程是否为异常线程的过程与上述判断第一APP对应的重载线程是否为异常线程的过程类似。

本申请中,手机在运行第一APP的过程中,可以先确定该第一APP对应的负载较大的线程。之后,该手机可以继续判断该负载较大的线程是否属于关键线程,该关键线程包括该第一APP对应的渲染线程以及与该渲染线程存在依赖关系的线程,也就是说,该关键线程表示影响该第一APP的画面渲染的线程。在该负载较大的线程属于关键线程的情况下,表明该线程影响第一APP的画面渲染,也即表明该线程负载较大是正常现象,因此,该手机可以确定该负载较大的线程为正常线程。

在该负载较大的线程不属于关键线程的情况下,表明该线程可能与画面渲染无关,该手机可以判断该负载较大的线程是否为自唤醒线程,以进一步验证该负载较大的线程是否属于异常线程。如果该负载较大的线程为自唤醒线程,表明该负载较大的线程与画面渲染无关,则该手机可以直接确定该负载较大的线程为异常线程。如果不是自唤醒线程,表明该负载较大的线程可能与画面渲染有关,则该手机可以减少对该负载较大的线程的资源供给,并基于资源供给减少前后的渲染帧率,确定该负载较大的线程对手机的画面渲染是否有影响。

如果相较于资源供给减少前的渲染帧率,资源供给减少后的渲染帧率变小程度较大,表明该负载较大的线程影响画面渲染,那么该手机可以确定该负载较大的线程为正常线程,且该手机可以恢复对该负载较大的线程的资源供给,以保证第一APP的正常渲染。如果资源供给减少后的渲染帧率没有发生变化或变化程度较小,表明该负载线程对画面渲染基本没有影响,那么该手机可以确定该负载较大的线程是异常线程,实现异常线程的准确识别。

在一些实施例中,在执行上述S304后,如果重载线程属于关键线程,该手机可以确定该重载线程为正常线程。如果重载线程不属于关键线程,该手机可以直接确定该重载线程为异常线程,而无需继续利用其它条件(如该重载线程是否为自唤醒线程)判断该重载线程是否为异常线程。也就是说,手机在确定第一APP对应的线程满足第一预设条件的情况下,该手机可以确定该线程为异常线程,否则,该手机可以确定该线程可以为正常线程。其中,该第一预设条件可以包括该线程属于重载线程,且该线程不属于关键线程。

在一些实施例中,在执行上述S304后,如果重载线程属于关键线程,该手机可以确定该重载线程为正常线程。如果重载线程不属于关键线程,该手机可以直接对该重载线程进行资源降低操作。之后,在执行资源降低操作后,该手机确定上述第一APP的第一渲染帧率以及第二渲染帧率,以供该手机利用该第一渲染帧率和该第二渲染帧率之间的差值判断该重载线程是否为异常线程。也就是说,在确定第一APP对应的线程满足第一预设条件的情况下,该手机可以确定该线程为异常线程,否则,该手机可以确定该线程可以为正常线程。其中,该第一预设条件可以包括该线程属于重载线程,该线程不属于关键线程,且该第一渲染帧率与第二渲染帧率之间的差值大于预设帧率差值。

应理解,上述手机在确定线程时,实际是确定线程的线程号。例如,手机在确定第一APP对应的渲染线程时,确定的是该渲染线程的线程号。又例如,手机在确定上述第一APP对应的重载线程时,确定的是重载线程的线程号。又例如,手机在确定与第一APP对应的渲染线程存在依赖关系的线程时,也是确定的存在依赖关系的线程的线程号。

本申请提供了一种线程处理方法。在手机中的第一APP启动后,也就是在该第一APP运行的过程中,手机可以基于影响画面渲染的线程(如该第一APP对应的渲染线程以及与该渲染线程存在唤醒关系的线程),判断该APP对应的线程是否属于影响画面渲染的线程,实现异常线程的确定。并且在确定异常线程后,该手机可以结束该异常线程的运行或者降低该异常线程所占用的运行资源(如CPU资源),从而减少线程对手机资源的不必要的消耗,进而可以减少手机的耗电量。下面将结合上述图3所示的软件结构,举例说明一种可能的线程处理过程。示例性的,如图6所示,该线程处理过程可以包括以下步骤。

首先,当用户通过手机显示的桌面启动第一APP时,该手机中的应用类型识别模块可以执行步骤a、确定该第一APP的类型,并向该手机中的渲染线程识别模块发送该第一APP的类型。该类型指示该第一APP是否为游戏类APP。

示例性的,该应用类型识别模块可以将该第一APP的应用包名与云端记录的APP类型匹配,以查找该第一APP的类型。

当然,上述应用类型识别模块基于云端记录确定第一APP的类型仅为一种示例方式,该应用类型识别模块也可以采用其它方式确定第一APP的类型,如基于该第一APP的画面的图层类型确定该第一APP的类型。本申请不限制确定第一APP的类型的方式。

上述手机在运行该第一APP的过程中,该手机需要渲染该第一APP的画面。应理解,游戏类型的APP和非游戏类型的APP的渲染流程(或称为绘制流程)不同。当该第一APP的类型为游戏类型时,在绘制得到该第一APP的图像数据后,该手机中的libEGL可以执行步骤b、利用GPU对该第一APP的图像数据进行渲染,并向该手机中的SurfaceFlinger模块发送渲染后的图像数据。这里的第一APP的图像数据可以理解成该第一APP的画面上的图像数据。

当该第一APP的类型为非游戏类型时,在绘制得到该第一APP的图像数据后,该手机中libwui可以执行步骤c、对该第一APP的图像数据进行渲染,并向该手机中的SurfaceFlinger模块发送渲染后的图像数据。

之后,该SurfaceFlinger模块可以执行步骤d:对渲染后的图像数据进行合成,得到画面数据,并向该手机的显示屏发送该画面数据,以显示相应的画面。

在渲染该第一APP的画面的过程中,上述SurfaceFlinger模块可以执行步骤e、向上述渲染线程识别模块发送第一信息,以供该渲染线程识别模块利用该第一信息识别该第一APP对应渲染线程的线程号。

之后,该渲染线程识别模块在接收上述第一信息后,可以执行步骤f、利用该第一信息确定该第一APP对应的渲染线程的线程号,并向该手机中的关键线程识别模块发送该渲染线程的线程号。

示例性的,一种情况下,当第一APP的类型为游戏类型时,上述渲染线程识别模块可以基于调用预设绘制指令的次数以及APP的应用类型确定渲染线程。相应的,上述第一信息可以包括调用预设绘制指令的各个线程的线程号以及各个线程号对应的调用次数。之后,该渲染线程识别模块可以将调用次数最多的线程号作为该第一APP对应的渲染线程的线程号。

另一种情况下,上述渲染线程识别模块可以基于渲染的画面图层的名称以及画面图层与线程之间的对应关系确定渲染线程。相应的,上述第一信息可以包括当前渲染的画面图层名称。

另一种情况下,上述渲染线程识别模块可以基于画面图层以及画面图层的屏幕显示方式确定渲染线程。相应的,上述第一信息可以包括当前渲染的画面图层名称以及该画面图层的屏幕显示方式。

以及在上述第一APP运行的过程中,该手机中CPU负载计算模块可以执行步骤g、向手机中的线程负载统计模块发送负载查询请求。该负载查询请求可以包括该第一APP的应用包名,其可用于获取该第一APP对应的进程中的各个线程的负载。

之后,上述线程负载统计模块在接收上述负载查询请求后,可以执行步骤h、响应于该负载查询请求,向上述CPU负载计算模块返回该第一APP的应用包名所对应的各个线程号及各个线程号所对应的负载。

之后,上述CPU负载计算模块在接收上述各个线程号所对应的负载后,可以执行步骤i、按照负载由大到小的顺序,对该各个线程号进行排序,并向该手机中的关键线程识别模块发送排序后的线程号。

之后,上述关键线程识别模块可以执行步骤j、从排序后的线程号中选取前M个线程号,并将其作为重载线程的线程号。对于每个重载线程的线程号,如果该重载线程的线程号不属于关键线程的线程号,则向上述手机中的异常线程识别模块发送该重载线程的线程号。

其中,上述关键线程包括上述第一APP对应的渲染线程以及与该渲染线程存在唤醒关系的线程。

之后,上述异常线程识别模块在接收上述关键线程识别模块发送的重载线程的线程号后,表明需要验证该重载线程是否为异常线程,则该异常线程识别模块可以执行步骤k、判断该重载线程是否是自唤醒线程,并得到该线程号及其对应的判断结果。以及在线程号对应的判断结果指示该线程号对应的重载线程不是自唤醒线程的情况下,向该手机中的CPU频点控制模块发送该线程号及其对应的判断结果。

在一些实施例中,在上述线程号对应的判断结果指示该线程号对应的重载线程是自唤醒线程的情况下,表明该线程号对应的重载线程影响画面渲染的可能性较小。因此,该异常线程识别模块可以直接确定线程号对应的重载线程为异常线程。

在一些实施例中,上述异常线程识别模块也可以直接将上述线程号及其对应的判断结果发送至CPU频点控制模块,而无需在线程号对应的判断结果指示该线程号对应的重载线程不是自唤醒线程的情况下才发送。

之后,上述CPU频点控制模块在接收该线程号及其对应的判断结果后,可以执行步骤l、在该线程号对应的判断结果指示该线程号对应的重载线程不是自唤醒线程时,向该手机中的CPU频点决策模块发送资源降低请求,该资源降低请求可以包括该线程号,其用于触发对该线程号对应的线程进行资源降低操作。

之后,该CPU频点决策模块在接收到上述资源降低请求,可以控制CPU对该资源降低请求中的线程号所对应的线程进行资源降低操作。

以及上述手机中的帧率检测模块可以执行步骤m、监测该第一APP对应的渲染帧率,并向上述CPU频点控制模块发送监测到的渲染帧率。示例性的,由于SurfaceFlinger模块合成每一帧画面时,可以记录每一帧画面的合成时间。因此,该帧率检测模块在计算渲染帧率时,可以基于每一帧画面的合成时间,统计预设时长内合成的画面的帧数,并计算该帧数与该预设时长的比值,得到渲染帧率。例如,在5秒内合成了10帧画面,即渲染了10帧画面。则渲染帧率可以为2帧/s。

之后,该CPU频点控制模块在发送资源降低请求后,可以从上述帧率检测模块发送的渲染帧率中确定第一渲染帧率和第二渲染帧率。该第一渲染帧率表示对上述线程号对应的线程进行资源降低操作后的渲染帧率,该第二渲染帧率可以表示对上述线程号对应的线程进行资源降低操作前的渲染帧率。换言之,该第二渲染帧率可以表示该CPU频点控制模块发送该资源降低请求前的渲染帧率,该第一渲染帧率可以表示该CPU频点控制模块在发送该资源降低请求后的一定时间时的渲染帧率,如发送资源降低请求后的第2秒时的渲染帧率。

在得到上述第一渲染帧率和第二渲染帧率后,上述CPU频点控制模块可以执行步骤n、计算第一渲染帧率与第二渲染帧率之间的差值。在该差值小于或等于预设帧率差值的情况下,确定上述线程号对应的线程为正常线程,并向上述CPU频点决策模块发送资源恢复请求。其中,该预设帧率差值小于0。该资源恢复请求用于触发恢复该线程号对应的线程的运行资源(如CPU资源)。

之后,该CPU频点决策模块在接收到上述资源恢复请求,可以控制CPU对该资源恢复请求中的线程号对应的线程进行资源恢复操作。

在一些实施例中,在上述差值大于预设帧率差值的情况下,表明上述第一APP的渲染帧率未受到影响或受到影响很小,换言之,该线程号对应的线程对画面渲染影响较小,手机仍可以正常渲染上述第一APP的画面,因此,上述CPU频点控制模块确定该线程号对应的线程为异常线程。

在一些实施例中,在确定上述线程号对应的线程为正常线程的情况下,在经过一段时间后,手机可以重新开始识别异常线程,而在该一段时间内,该手机可以不识别异常线程,避免线程的重复判断,同时也避免由于丢帧导致的误判,保证异常线程识别的准确性。

可以理解的是,上述图6所示的虚线框中的模块如应用类型识别模块、渲染线程识别模块、关键线程识别模块、异常线程识别模块、帧率检测模块、CPU负载计算模块、CPU频点控制模块为本申请新增模块,而剩余模块或器件为原生模块或器件。

在一些实施例中,本申请提供一种计算机可读存储介质,包括计算机指令,当所述计算机指令在电子设备上运行时,使得所述电子设备执行如上所述的界面显示方法。

在一些实施例中,本申请提供一种计算机程序产品,当所述计算机程序产品在电子设备上运行时,使得所述电子设备执行如上所述的界面显示方法。

通过以上实施方式的描述,所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,仅以上述各功能模块的划分进行举例说明,实际应用中,可以根据需要而将上述功能分配由不同的功能模块完成,即将装置的内部结构划分成不同的功能模块,以完成以上描述的全部或者部分功能。

在本申请所提供的几个实施例中,应该理解到,所揭露的装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述模块或单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个装置,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。

所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是一个物理单元或多个物理单元,即可以位于一个地方,或者也可以分布到多个不同地方。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。

另外,在本申请各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。

所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个可读取存储介质中。基于这样的理解,本申请实施例的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该软件产品存储在一个存储介质中,包括若干指令用以使得一个设备(可以是单片机,芯片等)或处理器(processor)执行本申请各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(read only memory,ROM)、随机存取存储器(random access memory,RAM)、磁碟或者光盘等各种可以存储程序代码的介质。

以上内容,仅为本申请的具体实施方式,但本申请的保护范围并不局限于此,任何在本申请揭露的技术范围内的变化或替换,都应涵盖在本申请的保护范围之内。因此,本申请的保护范围应以所述权利要求的保护范围为准。

相关技术
  • 一种应用线程处理方法、终端及计算机可读存储介质
  • 一种任务执行线程的处理方法、装置、设备及存储介质
  • 一种基于多线程的分布式数据处理方法及服务器
  • 一种异步线程处理方法、装置、电子设备及存储介质
  • 一种线程处理方法、装置、电子设备及存储介质
技术分类

06120116484150