一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

卡顿分析方法、装置、电子设备及计算机可读存储介质与流程

2022-03-16 00:47:30 来源:中国专利 TAG:


1.本公开涉及终端技术领域,具体而言,本公开涉及一种卡顿分析方法、装置、电子设备及计算机可读存储介质。


背景技术:

2.卡顿是指用户在使用应用程序的过程中,界面卡住不动的现象,一般是主线程的耗时超过卡顿阈值导致界面刷新卡住。用户在使用该应用程序的时候,会感觉到明显的停顿感,极大的影响了用户体验。
3.现有技术中通过looper的printer来检测主线程looper消息的耗时,如果超过卡顿阈值,就触发抓取主线程的调用栈,从而可以分析卡顿时的函数耗时情况。但是在现有技术中,只能抓取到超过卡顿阈值时的瞬时调用栈,无法清晰的知道,整个消息处理过程中,还有哪些函数耗时,也很难发现业务代码中主动发送的耗时消息的发起点。


技术实现要素:

4.本公开提供了一种卡顿分析的方法、装置、电子设备及计算机可读存储介质,可以分析整个消息处理过程中的卡顿原因。技术方案如下:
5.第一方面,提供了一种卡顿分析的方法,该方法包括:
6.发送目标消息至消息队列,记录目标消息的发送时刻、开始处理时刻与处理完成时刻;
7.若目标消息发生卡顿现象,确定目标消息发生卡顿现象的时段,其中,目标消息发生卡顿的时段包括消息等待时段或消息处理时段,消息等待时段为发送时刻与开始处理时刻之间的时段,消息处理时段为开始处理时刻与处理完成时刻之间的时段;
8.基于目标消息发生卡顿现象的时段,确定目标消息的卡顿分析结果。
9.第二方面,提供了一种卡顿分析的装置,该装置包括:
10.记录模块,用于发送目标消息至消息队列,记录目标消息的发送时刻、开始处理时刻与处理完成时刻;
11.第一确定模块,用于若目标消息发生卡顿现象,确定目标消息发生卡顿现象的时段,其中,目标消息发生卡顿的时段包括消息等待时段或消息处理时段,消息等待时段为发送时刻与开始处理时刻之间的时段,消息处理时段为开始处理时刻与处理完成时刻之间的时段;
12.第二确定模块,用于基于目标消息发生卡顿现象的时段,确定目标消息的卡顿分析结果。
13.第三方面,提供了一种电子设备,该电子设备包括:
14.一个或多个处理器;
15.存储器;
16.一个或多个应用程序,其中一个或多个应用程序被存储在存储器中并被配置为由
一个或多个处理器执行,一个或多个程序配置用于:执行如本公开的第一方面所示的卡顿分析的方法对应的操作。
17.第四方面,提供了一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现本公开第一方面所示的卡顿分析的方法。
18.本公开提供的技术方案带来的有益效果是:
19.本公开在发送目标消息至消息队列时,记录目标消息的发送时刻、开始处理时刻与处理完成时刻,可以将对目标消息的整体处理过程进行分段,进而方便统计每一时段的情况,在目标消息发生卡顿现象时,先锁定目标消息发生卡顿的时段,然后基于目标消息发生卡顿现象的时段,确定目消息的卡顿分析结果,提高分析目标消息发生卡顿原因的效率,并且通过分析不同时段卡顿的原因,使得得到的卡顿现象分析结果更加全面。
附图说明
20.结合附图并参考以下具体实施方式,本公开各实施例的上述和其他特征、优点及方面将变得更加明显。贯穿附图中,相同或相似的附图标记表示相同或相似的元素。应当理解附图是示意性的,原件和元素不一定按照比例绘制。
21.图1为本公开实施例提供的一种卡顿分析方法的流程示意图;
22.图2为本公开实施例提供的一种消息处理工具创建方法的流程示意图;
23.图3为本公开实施例提供的一种卡顿分析装置的结构示意图;
24.图4为本公开实施例提供的一种消息处理工具创建模块结构示意图;
25.图5为本公开实施例提供的一种的电子设备的结构示意图。
具体实施方式
26.下面将参照附图更详细地描述本公开的实施例。虽然附图中显示了本公开的某些实施例,然而应当理解的是,本公开可以通过各种形式来实现,而且不应该被解释为限于这里阐述的实施例,相反提供这些实施例是为了更加透彻和完整地理解本公开。应当理解的是,本公开的附图及实施例仅用于示例性作用,并非用于限制本公开的保护范围。
27.应当理解,本公开的方法实施方式中记载的各个步骤可以按照不同的顺序执行,和/或并行执行。此外,方法实施方式可以包括附加的步骤和/或省略执行示出的步骤。本公开的范围在此方面不受限制。
28.本文使用的术语“包括”及其变形是开放性包括,即“包括但不限于”。术语“基于”是“至少部分地基于”。术语“一个实施例”表示“至少一个实施例”;术语“另一实施例”表示“至少一个另外的实施例”;术语“一些实施例”表示“至少一些实施例”。其他术语的相关定义将在下文描述中给出。
29.需要注意,本公开中提及的“第一”、“第二”等概念仅用于对装置、模块或单元进行区分,并非用于限定这些装置、模块或单元一定为不同的装置、模块或单元,也并非用于限定这些装置、模块或单元所执行的功能的顺序或者相互依存关系。
30.需要注意,本公开中提及的“一个”、“多个”的修饰是示意性而非限制性的,本领域技术人员应当理解,除非在上下文另有明确指出,否则应该理解为“一个或多个”。
31.本公开实施方式中的多个装置之间所交互的消息或者信息的名称仅用于说明性
的目的,而并不是用于对这些消息或信息的范围进行限制。
32.为使本公开的目的、技术方案和优点更加清楚,下面将结合附图对本公开实施方式作进一步地详细描述。
33.本公开提供的卡顿分析方法、装置、电子设备和计算机存储介质,旨在解决现有技术的如上技术问题。
34.下面以具体地实施例对本公开的技术方案以及本公开的技术方案如何解决上述技术问题进行详细说明。下面这几个具体的实施例可以相互结合,对于相同或相似的概念或过程可能在某些实施例中不再赘述。下面将结合附图,对本公开的实施例进行描述。
35.本公开实施例中提供了一种卡顿分析的方法,如图1所示,该方法包括:
36.步骤s101:发送目标消息至消息队列,记录目标消息的发送时刻、开始处理时刻与处理完成时刻。
37.其中,目标消息可以是子线程发送给主线程的关于界面更新的消息,可以理解的是,由于主线程无法进行长时间比较繁长的任务,故有些任务需要在子线程中进行处理,但是子线程中无法进行界面更新,因此需要将通过子线程发送消息至主线程,以完成更新,但是由于主线程和子线程一般进行不同的时间工作,因此可以将消息先发送至消息队列,然后主线程可以依据消息队列中消息的发送顺序进行依次处理。
38.由于将目标消息进行发送后可能不会及时处理,因此可以记录记录目标消息的发送时刻、开始处理时刻与处理完成时刻,从而统计目标消息完整被处理的整个过程。
39.在本公开的一个实施例中,步骤s101,包括,步骤s101a~s101d,
40.步骤s101a,利用预设的消息处理工具发送目标消息至消息队列。
41.可以理解的是,将目标消息发送至消息队列可以采用预设的消息处理工具,在本公开的一个实施例中,消息处理工具可以是创建的handler工具,通过创建的handler工具不仅可以将目标消息从子线程发送至主线程,还可以通过创建的handler工具记录目标消息在整个处理过程中的各个时间节点。
42.步骤s101b,利用消息处理工具的第一预设函数记录目标消息的发送时刻。
43.其中,在消息由子线程发送至主线程的过程中,可以记录消息的发送时刻。具体的,可以利用创建的handler工具的第一预设函数记录目标消息的发送时刻,并且第一预设函数可以是sendmessageattime函数。
44.步骤s101c,当接收到目标消息的处理请求时,记录目标消息的开始处理时刻。
45.当主线程依次处理消息队列中消息时,可以记录开始处理目标消息的时刻,在本公开的一个实施例中,可以在目标消息中增添目标消息的消息标识,在主线程处理该目标消息时,根据该目标消息的消息标识,记录该目标消息的开始处理时刻。
46.步骤s101d,利用消息处理工具的第二预设函数记录目标消息的处理完成时刻。
47.其中,当消息在主线程中被处理完成时,可以记录消息的处理完成时刻。具体的,可以利用创建的handler工具的第二预设函数记录目标消息的处理完成时刻,并且第一预设函数可以是dispatchmessage函数。
48.在本公开的一个实施例中,消息处理工具按照下述方式构建:
49.步骤s201:创建包括第一预设函数及第二预设函数的消息处理类。
50.其中,在记录目标消息在整个处理过程中的各个时间节点时,可以利用创建的
handler工具的预设函数进行记录。因此在创建handler工具时,可以首先创建一个包括第一预设函数及第二预设函数的消息处理类,即handler类。该handler类中的第一预设函数及第二预设函数可以实现记录目标消息在整个处理过程中的各个时间节点的功能。
51.步骤s202:利用创建的消息处理类,确定消息处理工具中的消息处理父类。
52.其中,可以将创建的handler类,作为创建的handler工具中的消息处理父类,即handler父类,以实现全局变量的统一。
53.在本公开的一个实施例中,步骤s202“利用创建的消息处理类,确定消息处理工具中的消息处理父类”,包括步骤s202a~s202b。
54.步骤s202a:确定第一消息处理父类,第一消息处理父类为原始消息处理工具的源代码中直接使用消息处理的代码点的消息处理父类。
55.可以理解的是,可以在原始消息处理工具,即原始handler工具中的源代码中检测直接使用消息处理的代码点,即直接使用handler的代码点,其中,直接使用handler的代码点可以是第一消息处理父类,即第一handler父类,其子类会通过类继承方式沿用其父类的功能。
56.步骤s202b:利用创建的消息处理类替换第一消息处理父类,得到消息处理工具中的消息处理父类。
57.然后利用创建的handler类替换原始handler工具中的第一handler父类,即原始handler工具的源代码中直接使用handler代码点的类,便得到创建的handler工具。并且创建的handler类为创建的handler工具中的父类。
58.在本公开的一个实施例中,利用创建的handler类替换原始handler工具中的第一handler父类的替换工具可以是字节码操控框架asm,asm可以直接通过字节码修改类文件。因此可以将原始handler工具中的第一handler父类替换为创建的handler类。
59.或者,步骤s202“利用创建的消息处理类,确定消息处理工具中的消息处理父类”,还可以包括步骤s202c~s202d。
60.步骤s202c:确定第二消息处理父类,第二消息处理父类为原始消息处理工具的源代码中的消息处理使用子类对应的消息处理父类。
61.其中,在确定第二消息处理父类,即第二handler父类时,可以先在原始handler工具中的源代码中检测消息处理使用子类,即handler使用子类,需要说明的是,由于原始handler工具中的源代码中handler使用子类是类文件的信息,因此可以使用自研的字节码工具获得,并且在检测到handler使用子类时,可以直接查找到该handler使用子类的父类,然后将该handler使用子类的父类确定为第二handler父类。
62.步骤s202d:利用创建的消息处理类替换第二消息处理父类,得到消息处理工具中的消息处理父类。
63.然后可以利用创建的handler类替换原始handler工具中的第二handler父类,即原始handler工具的源代码中handler使用子类对应的handler父类,便得到创建的handler工具。并且创建的handler类为创建的handler工具中的父类。
64.在本公开的一个实施例中,利用创建的handler类替换原始handler工具中的第二handler父类的替换工具也可以是字节码操控框架asm,asm可以直接通过字节码修改类文件。因此可以将原始handler工具中的第二handler父类替换为创建的handler类。
65.步骤s203:通过类继承方式复写第一预设函数及第二预设函数,得到消息处理工具中的消息处理子类。
66.可以理解的是,当确定了创建的handler类为创建的handler工具中的handler父类时,在整个创建的handler工具中,消息处理子类,即handler子类会通过类继承的方式从handler父类中复写第一预设函数及第二预设函数。即,整个创建的handler工具中的类都具备创建的handler类的功能。
67.步骤s102:若目标消息发生卡顿现象,确定目标消息发生卡顿现象的时段,其中,目标消息发生卡顿的时段包括消息等待时段或消息处理时段,消息等待时段为发送时刻与开始处理时刻之间的时段,消息处理时段为开始处理时刻与处理完成时刻之间的时段。
68.可以理解的是,由于目标消息被发送到了消息队列中,因此在一般情况下,主线程会依照消息的发送顺序依次处理消息,因此目标消息一般有一段等待时间,即目标消息的等待时段。
69.在本公开的一个实施例中,目标消息的整个执行过程中可以包括两个时段,即目标消息的等待时段与目标消息的处理时段,其中,目标消息的等待时段可以从目标消息发送至消息队列的时刻开始,直至该目标消息被开始处理的时刻结束;目标消息的处理时段可以从目标消息开始处理的时刻开始,直至该目标消息被处理完成的时刻结束。
70.当用户在使用应用程序的过程中,界面卡住不动时,此时即发生了卡顿现象。卡顿现象可以发生在目标消息的等待时段,比如当消息队列中的消息过多,主线程不能及时地处理消息队列中的消息时,可能会造成界面卡顿;此外,卡顿现象也可以发生在消息处理时段,比如处理消息的过程中,由于使用函数中的参数出现问题,也会导致卡顿现象。
71.在本公开的一个实施例中,当出现卡顿现象时,可以先确定发生卡顿现象的时段,便于分析卡顿原因。
72.在本公开的一个实施例中,步骤s102“若目标消息发生卡顿现象,确定目标消息发生卡顿现象的时段”,包括:
73.步骤s1021:获取目标消息在消息等待时段和消息处理时段内的函数调用关系,基于函数调用关系确定目标消息发生卡顿的时段。
74.可以理解的是,目标消息在消息等待时段和消息处理时段内的函数调用关系,即目标消息的方法快照,目标消息的方法快照可以反映该目标消息在整个执行过程中的各种细节信息,比如执行过程中各个时间节点的具体信息。
75.在本公开的一个实施例中,可以在目标消息被处理完成时,获取目标消息的方法快照,可以理解的是,相比于现有技术中的在发生卡顿现象当时调用卡顿时的瞬时调用栈,在目标消息被处理完成时获取目标消息的方法快照可以获得目标消息在整个执行过程中的完整执行信息,并且可以更全面地去分析卡顿原因。
76.在本公开的一个实施例中,步骤s1021“基于函数调用关系确定目标消息发生卡顿的时段”,包括:
77.步骤s1021a:若发送时刻与开始处理时刻的时间差大于第一预设时间阈值,则确定目标消息在消息等待时段发生卡顿现象;
78.其中,第一预设时间阈值可以是界面卡顿阈值,界面卡顿阈值一般由终端设备的中央处理器和内存的性能指标确定,即不同的终端设备的界面卡顿阈值可能不同。本公开
的一个实施例中,可以选择比如几款终端设备界面卡顿阈值的平均阈值作为预设时间阈值。
79.当目标消息发送时刻与目标消息开始处理时刻的时间差大于预设时间阈值时,并且还可以确定该目标消息在消息等待时段发生了卡顿现象。
80.步骤s1021b:若开始处理时刻与处理完成时刻的时间差大于第二预设时间阈值,则确定目标消息在消息处理时段发生卡顿现象。
81.其中,第二预设时间阈值可以是预计处理时间阈值,针对每一消息,都可以根据历史经验为目标消息设置预计处理时间阈值,当实际的处理时间大于预置的预计处理时间时,即当目标消息发送时刻与目标消息开始处理时刻的时间差大于预计处理时间时,可以确定该目标消息在消息处理时段发生了卡顿现象。
82.步骤s103:基于目标消息发生卡顿现象的时段,确定目标消息的卡顿分析结果。
83.可以理解的是,目标消息在每一时段发生卡顿时的卡顿原因不同,因此通过先获取目标消息的卡顿时段,不仅可以全面地分析目标消息的卡顿原因,还可以提高分析目标消息的卡顿原因的效率。
84.本公开在发送目标消息至消息队列时,记录目标消息的发送时刻、开始处理时刻与处理完成时刻,可以将对目标消息的整体处理过程进行分段,进而方便统计每一时段的情况,在目标消息发生卡顿现象时,先锁定目标消息发生卡顿的时段,然后基于目标消息发生卡顿现象的时段,确定目消息的卡顿分析结果,提高分析目标消息发生卡顿原因的效率,并且通过分析不同时段卡顿的原因,使得得到的卡顿现象分析结果更加全面。
85.在本公开的一个实施例中,步骤s103“基于目标消息发生卡顿现象的时段,确定目标消息的卡顿分析结果”包括:
86.步骤s103a:若目标消息在消息等待时段发生卡顿现象,基于第一预设函数确定目标消息的消息来源。
87.其中,目标消息的消息来源可以理解为目标消息是由哪个子线程发送的,在本公开的一个实施例中,可以在创建的handler工具中利用第一预设函数获取目标消息的发送时刻时获取该时刻目标消息的堆栈,然后在堆栈中查看该目标消息是由哪个子线程发送的。
88.步骤s103b:分析消息来源,确定造成卡顿现象的耗时消息名称。
89.其中,当获取发送目标消息的子线程后,还可以进一步获取该子线程发送至消息队列的其他消息,可以理解的是,针对每一消息,都有其预计处理时间,当主线程在处理消息队列中的消息时,如果某一消息的实际处理时间超过其预计处理时间,将会导致其后续的消息的等待时间过长,因而可能会导致后续消息出现卡顿问题。
90.因此,我们可以获取每一消息的消息来源,并分析每一消息的实际处理时间与预计处理时间,进而确定目标消息发生卡顿现象的卡顿分析结果。比如,当消息b、c为消息a的后续连续消息时,消息a的实际处理时间大于其预计处理时间,可以获取耗时消息a的具体消息名称作为消息b、c发生卡顿现象的卡顿原因。
91.通过消息来源进行分析,确定的卡顿现象的卡顿分析结果更加全面,便于更好地解决卡顿问题。
92.在本公开的一个实施例中,步骤s103“基于目标消息发生卡顿现象的时段,确定目
标消息的卡顿分析结果”包括:
93.步骤s103c:若目标消息在消息处理时段发生卡顿现象,基于函数调用关系,确定造成卡顿现象的耗时函数名称。
94.可以理解的是,函数调用关系可以是该目标消息的方法快照,其反映了目标消息在整个执行过程中的执行具体信息,比如调用函数的名称、调用函数的时间等。检测人员可以根据方法快照中的函数关系获取导致卡顿的耗时函数,进而将耗时函数的函数名称确定为目标消息发生卡顿的卡顿原因。
95.此外,还可以将方法快照直接上传至服务器,由服务器检测方法快照中的耗时函数,进而得到导致目标消息发生卡顿现象的耗时函数名称。
96.在本公开的一个实施例中,卡顿分析方法还包括:
97.显示卡顿分析结果,卡顿分析结果包括造成卡顿现象的耗时消息名称或造成卡顿现象的耗时函数名称。
98.可以理解的是,在确定造成卡顿现象的卡顿原因后,还可以显示卡顿原因,即造成卡顿现象的耗时消息名称及耗时函数名称,以便维修人员全面且快速地处理卡顿问题,提高卡顿的维修效率。
99.本公开实施例提供了一种卡顿分析装置,如图3所示,该卡顿分析装置30可以包括:记录模块301、第一确定模块302以及第二确定模块303,其中,
100.记录模块301,用于发送目标消息至消息队列,记录目标消息的发送时刻、开始处理时刻与处理完成时刻。
101.其中,目标消息可以是子线程发送给主线程的关于界面更新的消息,可以理解的是,由于主线程无法进行长时间比较繁长的任务,故有些任务需要在子线程中进行处理,但是子线程中无法进行界面更新,因此需要将通过子线程发送消息至主线程,以完成更新,但是由于主线程和子线程一般进行不同的时间工作,因此可以将消息先发送至消息队列,然后主线程可以依据消息队列中消息的发送顺序进行依次处理。
102.由于将目标消息进行发送后可能不会及时处理,因此可以记录记录目标消息的发送时刻、开始处理时刻与处理完成时刻,从而统计目标消息完整被处理的整个过程。
103.在本公开的一个实施例中,记录模块,包括:
104.发送子模块,用于利用预设的消息处理工具发送目标消息至消息队列。
105.可以理解的是,将目标消息发送至消息队列可以采用预设的消息处理工具,在本公开的一个实施例中,消息处理工具可以是创建的handle工具,通过创建的handler工具不仅可以将目标消息从子线程发送至主线程,还可以通过创建的handler工具记录目标消息在整个处理过程中的各个时间节点。
106.第一记录子模块,用于利用消息处理工具的第一预设函数记录目标消息的发送时刻。
107.其中,在消息由子线程发送至主线程的过程中,可以记录消息的发送时刻。具体的,可以利用创建的handler工具的第一预设函数记录目标消息的发送时刻,并且第一预设函数可以是sendmessageattime函数。
108.第二记录子模块,用于当接收到目标消息的处理请求时,记录目标消息的开始处理时刻。
109.当主线程依次处理消息队列中消息时,可以记录开始处理目标消息的时刻,在本公开的一个实施例中,可以在目标消息中增添目标消息的消息标识,在主线程处理该目标消息时,根据该目标消息的消息标识,记录该目标消息的开始处理时刻。
110.第三记录子模块,用于利用消息处理工具的第二预设函数记录目标消息的处理完成时刻。
111.其中,当消息在主线程中被处理完成时,可以记录消息的处理完成时刻。具体的,可以利用创建的handler工具的第二预设函数记录目标消息的处理完成时刻,并且第一预设函数可以是dispatchmessage函数。
112.在本公开的一个实施例中,消息处理工具的构建模块40包括创建子模块401、第一确定子模块402及第二确定子模块403。
113.创建子模块401,用于创建包括第一预设函数及第二预设函数的消息处理类。
114.其中,在记录目标消息在整个处理过程中的各个时间节点时,可以利用创建的handler工具的预设函数进行记录。因此在创建handler工具时,可以首先创建一个包括第一预设函数及第二预设函数的消息处理类,即handler类。该handler类中的第一预设函数及第二预设函数可以实现记录目标消息在整个处理过程中的各个时间节点的功能。
115.第一确定子模块402,用于利用创建的消息处理类,确定创建的消息处理工具中的消息处理父类。
116.其中,可以将创建的handler类,作为创建的handler工具中的消息处理父类,即handler父类,实现全局变量的统一。
117.在本公开的一个实施例中,第一确定子模块402,包括:
118.第一确定单元,用于确定第一消息处理父类,第一消息处理父类为原始消息处理工具的源代码中直接使用消息处理的代码点的消息处理父类。
119.可以理解的是,可以在原始消息处理工具,即原始handler工具中的源代码中检测直接使用消息处理的代码点,即直接使用handler的代码点,其中,直接使用handler的代码点可以是第一消息处理父类,即handle父类r,其子类会通过类继承方式沿用其父类的功能。
120.第一替换单元,用于利用创建的消息处理类替换第一消息处理父类,得到创建的消息处理工具中的消息处理父类。
121.然后利用创建的handler类替换原始handler工具中的第一handler父类,即原始handler工具的源代码中直接使用handler代码点的类,便得到创建的handler工具。并且创建的handler类为创建的handler工具中的父类。
122.在本公开的一个实施例中,利用创建的handler类替换原始handler工具中的第一handler父类的替换工具可以是字节码操控框架asm,asm可以直接通过字节码修改类文件。因此可以将原始handler工具中的第一handler父类替换为创建的handler类。
123.或者,第一确定子模块402,还可以包括:
124.第二确定单元,用于确定第二消息处理父类,第二消息处理父类为原始消息处理工具的源代码中的消息处理使用子类对应的消息处理父类。
125.其中,在确定第二消息处理父类,即第二handler父类时,可以先在原始handler工具中的源代码中检测消息处理使用子类,即handler使用子类,需要说明的是,由于原始
handler工具中的源代码中handler使用子类是类文件的信息,因此可以使用自研的字节码工具获得,并且在检测到消息处理使用子类时,可以直接查找到该消息处理使用子类的父类,然后将该消息处理使用子类的父类确定为第二消息处理父类。
126.第二替换单元,用于利用创建的消息处理类替换第二消息处理父类,得到创建的消息处理工具中的消息处理父类。
127.然后可以利用创建的handler类替换原始handler工具中的第二handler父类,即原始handler工具的源代码中handler使用子类对应的handler父类,便得到创建的handler工具。并且创建的handler类为创建的handler工具中的父类。
128.在本公开的一个实施例中,利用创建的handler类替换原始handler工具中的第二handler父类的替换工具也可以是字节码操控框架asm,asm可以直接通过字节码修改类文件。因此可以将原始handler工具中的第二handler父类替换为创建的handler类。
129.第二确定子模块403,用于通过类继承方式复写第一预设函数及第二预设函数,得到创建的消息处理工具中的消息处理子类。
130.可以理解的是,当确定了创建的handler类为创建的handler工具中的handler父类时,在整个创建的handler工具中,消息处理子类,即handler的子类会通过类继承的方式从handler父类中复写第一预设函数及第二预设函数。即,整个创建的handler工具中的类都具备创建的handler类的功能。
131.第一确定模块302,用于若目标消息发生卡顿现象,确定目标消息发生卡顿现象的时段,其中,目标消息发生卡顿的时段包括消息等待时段或消息处理时段,消息等待时段为发送时刻与开始处理时刻之间的时段,消息处理时段为开始处理时刻与处理完成时刻之间的时段。
132.可以理解的是,由于目标消息被发送到了消息队列中,因此在一般情况下,主线程会依照消息的发送顺序依次处理消息,因此目标消息一般有一段等待时间,即目标消息的等待时段。
133.在本公开的一个实施例中,目标消息的整个执行过程中可以包括两个时段,即目标消息的等待时段与目标消息的处理时段,其中,目标消息的等待时段可以从目标消息发送至消息队列的时刻开始,直至该目标消息被开始处理的时刻结束;目标消息的处理时段可以从目标消息开始处理的时刻开始,直至该目标消息被处理完成的时刻结束。
134.当用户在使用应用程序的过程中,界面卡住不动时,此时即发生了卡顿现象,一般情况下,卡顿现象可以在目标消息的等待时段,比如当消息队列中的消息过多,主线程不能及时地处理消息队列中的消息时,可能会造成界面卡顿;此外,卡顿现象也可以发生在消息处理时段,比如处理消息的过程中,由于使用函数中的参数出现问题,也会导致卡顿现象。
135.当出现卡顿现象时,可以获取目标消息在消息等待时段和消息处理时段内的函数调用关系,即目标消息的方法快照,目标消息的方法快照可以反映该目标消息在执行过程中的信息。
136.在本公开的一个实施例中,当出现卡顿现象时,可以先确定发生卡顿现象的时段,便于分析卡顿原因。
137.在本公开的一个实施例中,第一确定模块302,包括:
138.第三确定子模块,用于获取目标消息在消息等待时段和消息处理时段内的函数调
用关系,基于函数调用关系确定目标消息发生卡顿的时段。
139.可以理解的是,目标消息在消息等待时段和消息处理时段内的函数调用关系,即目标消息的方法快照,目标消息的方法快照可以反映该目标消息在整个执行过程中的各种细节信息,比如执行过程中各个时间节点的具体信息。
140.在本公开的一个实施例中,可以在目标消息被处理完成时刻,获取目标消息的方法快照,可以理解的是,相比于现有技术中的在发生卡顿现象当时调用卡顿时的瞬时调用栈,在目标消息被处理完成时刻,获取目标消息的方法快照可以获得目标消息在整个执行过程中的完整执行信息,并且可以更全面地去分析卡顿原因。
141.在本公开的一个实施例中,第三确定子模块,包括:
142.第一确定单元,用于若发送时刻与开始处理时刻的时间差大于第一预设时间阈值,则确定目标消息在消息等待时段发生卡顿现象;
143.其中,第一预设时间阈值可以是界面卡顿阈值,界面卡顿阈值一般由终端设备的中央处理器和内存的性能指标确定,即不同的终端设备的界面卡顿阈值可能不同。本公开的一个实施例中,可以选择比如几款终端设备界面卡顿阈值的平均阈值作为预设时间阈值。
144.当目标消息发送时刻与目标消息开始处理时刻的时间差大于预设时间阈值时,确定目标消息发生了卡顿现象,并且还可以确定该目标消息在消息等待时段发生了卡顿现象。
145.第二确定单元,用于若开始处理时刻与处理完成时刻的时间差大于第二预设时间阈值,则确定目标消息在消息处理时段发生卡顿现象。
146.其中,第二预设时间阈值可以是预计处理时间阈值,针对每一消息,都可以根据历史经验为目标消息设置预计处理时间阈值,当实际的处理时间大于预置的预计处理时间时,即当目标消息发送时刻与目标消息开始处理时刻的时间差大于预计处理时间时,可以确定该目标消息在消息处理时段发生了卡顿现象。
147.第二确定模块303,用于基于目标消息发生卡顿现象的时段,确定目标消息的卡顿分析结果。
148.可以理解的是,目标消息在每一时段发生卡顿时的卡顿原因不同,因此通过先获取目标消息的卡顿时段,不仅可以全面地分析目标消息的卡顿原因,还可以提高分析目标消息的卡顿原因的效率。
149.本公开在发送目标消息至消息队列时,记录目标消息的发送时刻、开始处理时刻与处理完成时刻,可以将对目标消息的整体处理过程进行分段,进而方便统计每一时段的情况,在目标消息发生卡顿现象时,先锁定目标消息发生卡顿的时段,然后基于目标消息发生卡顿现象的时段,确定目消息的卡顿分析结果,提高分析目标消息发生卡顿原因的效率,并且通过分析不同时段卡顿的原因,使得得到的卡顿现象分析结果更加全面。
150.在本公开的一个实施例中,第二确定模块303,包括:
151.第四确定子模块,用于若目标消息在消息等待时段发生卡顿现象,基于第一预设函数确定目标消息的消息来源。
152.其中,目标消息的消息来源可以理解为目标消息是由哪个子线程发送的,在本公开的一个实施例中,可以在创建的handler工具中利用第一预设函数获取目标消息的发送
时刻时获取该时刻目标消息的堆栈,然后在堆栈中查看该目标消息是由哪个子线程发送的。
153.分析子模块,用于分析消息来源,确定造成卡顿现象的耗时消息名称。
154.其中,当获取发送目标消息的子线程后,还可以进一步获取该子线程发送至消息队列的其他消息,可以理解的是,针对每一消息,都有其预计处理时间,当主线程在处理消息队列中的消息时,如果某一消息的实际处理时间超过其预计处理时间,将会导致其后续的消息的等待时间过长,因而可能会导致后续消息出现卡顿问题。
155.因此,我们可以获取每一消息的消息来源,并分析每一消息的实际处理时间与预计处理时间,进而确定目标消息发生卡顿现象的卡顿分析结果。比如,当消息b、c为消息a的后续连续消息时,消息a的实际处理时间大于其预计处理时间,可以获取耗时消息a的具体消息名称作为消息b、c发生卡顿现象的卡顿原因。
156.通过对消息来源进行分析,确定的卡顿现象的卡顿分析结果更加全面,便于更好地解决卡顿问题。
157.在本公开的一个实施例中,第二确定模块303,包括:
158.第五确定子模块,用于若目标消息在消息处理时段发生卡顿现象,基于函数调用关系,确定造成卡顿现象的耗时函数名称。
159.可以理解的是,函数调用关系可以是该目标消息的方法快照,其反映了目标消息在整个执行过程中的执行具体信息,比如调用函数的名称、调用函数的时间等。检测人员可以根据方法快照中的函数关系获取导致卡顿的耗时函数,进而将耗时函数的函数名称确定为目标消息发生卡顿的卡顿原因。
160.此外,还可以将方法快照直接上传至服务器,由服务器检测方法快照中的耗时函数,进而得到导致目标消息发生卡顿现象的耗时函数名称。
161.在本公开的一个实施例中,卡顿分析装置30,还包括:
162.显示模块,用于显示卡顿分析结果,卡顿分析结果包括造成卡顿现象的耗时消息名称或造成卡顿现象的耗时函数名称。
163.可以理解的是,在确定造成卡顿现象的卡顿原因后,还可以显示卡顿原因,即造成卡顿现象的耗时消息名称及耗时函数名称,以便维修人员全面且快速地处理卡顿问题,提高卡顿的维修效率。
164.下面参考图5,其示出了适于用来实现本公开实施例的电子设备500的结构示意图。本公开实施例中的电子设备可以包括但不限于诸如移动电话、笔记本电脑、数字广播接收器、pda(个人数字助理)、pad(平板电脑)、pmp(便携式多媒体播放器)、车载终端(例如车载导航终端)等等的移动终端以及诸如数字tv、台式计算机等等的固定终端。图5示出的电子设备仅仅是一个示例,不应对本公开实施例的功能和使用范围带来任何限制。
165.电子设备包括:存储器以及处理器,其中,这里的处理器可以称为下文所述的处理装置501,存储器可以包括下文中的只读存储器(rom)502、随机访问存储器(ram)503以及存储装置508中的至少一项,具体如下所示:
166.如图5所示,电子设备500可以包括处理装置(例如中央处理器、图形处理器等)501,其可以根据存储在只读存储器(rom)502中的程序或者从存储装置508加载到随机访问存储器(ram)503中的程序而执行各种适当的动作和处理。在ram 503中,还存储有电子设备
500操作所需的各种程序和数据。处理装置501、rom 502以及ram 503通过总线504彼此相连。输入/输出(i/o)接口505也连接至总线504。
167.通常,以下装置可以连接至i/o接口505:包括例如触摸屏、触摸板、键盘、鼠标、摄像头、麦克风、加速度计、陀螺仪等的输入装置506;包括例如液晶显示器(lcd)、扬声器、振动器等的输出装置507;包括例如磁带、硬盘等的存储装置508;以及通信装置509。通信装置509可以允许电子设备500与其他设备进行无线或有线通信以交换数据。虽然图5示出了具有各种装置的电子设备500,但是应理解的是,并不要求实施或具备所有示出的装置。可以替代地实施或具备更多或更少的装置。
168.特别地,根据本公开的实施例,上文参考流程图描述的过程可以被实现为计算机软件程序。例如,本公开的实施例包括一种计算机程序产品,其包括承载在非暂态计算机可读介质上的计算机程序,该计算机程序包含用于执行流程图所示的方法的程序代码。在这样的实施例中,该计算机程序可以通过通信装置509从网络上被下载和安装,或者从存储装置508被安装,或者从rom 502被安装。在该计算机程序被处理装置501执行时,执行本公开实施例的方法中限定的上述功能。
169.需要说明的是,本公开上述的计算机可读介质可以是计算机可读信号介质或者计算机可读存储介质或者是上述两者的任意组合。计算机可读存储介质例如可以是——但不限于——电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。计算机可读存储介质的更具体的例子可以包括但不限于:具有一个或多个导线的电连接、便携式计算机磁盘、硬盘、随机访问存储器(ram)、只读存储器(rom)、可擦式可编程只读存储器(eprom或闪存)、光纤、便携式紧凑磁盘只读存储器(cd-rom)、光存储器件、磁存储器件、或者上述的任意合适的组合。在本公开中,计算机可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。而在本公开中,计算机可读信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了计算机可读的程序代码。这种传播的数据信号可以采用多种形式,包括但不限于电磁信号、光信号或上述的任意合适的组合。计算机可读信号介质还可以是计算机可读存储介质以外的任何计算机可读介质,该计算机可读信号介质可以发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序。计算机可读介质上包含的程序代码可以用任何适当的介质传输,包括但不限于:电线、光缆、rf(射频)等等,或者上述的任意合适的组合。
170.在一些实施方式中,客户端、服务器可以利用诸如http(hypertext transfer protocol,超文本传输协议)之类的任何当前已知或未来研发的网络协议进行通信,并且可以与任意形式或介质的数字数据通信(例如,通信网络)互连。通信网络的示例包括局域网(“lan”),广域网(“wan”),网际网(例如,互联网)以及端对端网络(例如,ad hoc端对端网络),以及任何当前已知或未来研发的网络。
171.上述计算机可读介质可以是上述电子设备中所包含的;也可以是单独存在,而未装配入该电子设备中。
172.上述计算机可读介质承载有一个或者多个程序,当上述一个或者多个程序被该电子设备执行时,使得该电子设备:
173.发送目标消息至消息队列,记录目标消息的发送时刻、开始处理时刻与处理完成
时刻;
174.若目标消息发生卡顿现象,确定目标消息发生卡顿现象的时段,其中,目标消息发生卡顿的时段包括消息等待时段或消息处理时段,消息等待时段为发送时刻与开始处理时刻之间的时段,消息处理时段为开始处理时刻与处理完成时刻之间的时段;
175.基于目标消息发生卡顿现象的时段,确定目标消息的卡顿分析结果。
176.可以以一种或多种程序设计语言或其组合来编写用于执行本公开的操作的计算机程序代码,上述程序设计语言包括但不限于面向对象的程序设计语言—诸如java、smalltalk、c ,还包括常规的过程式程序设计语言—诸如“c”语言或类似的程序设计语言。程序代码可以完全地在用户计算机上执行、部分地在用户计算机上执行、作为一个独立的软件包执行、部分在用户计算机上部分在远程计算机上执行、或者完全在远程计算机或服务器上执行。在涉及远程计算机的情形中,远程计算机可以通过任意种类的网络——包括局域网(lan)或广域网(wan)—连接到用户计算机,或者,可以连接到外部计算机(例如利用因特网服务提供商来通过因特网连接)。
177.附图中的流程图和框图,图示了按照本公开各种实施例的系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段、或代码的一部分,该模块、程序段、或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个接连地表示的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或操作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。
178.描述于本公开实施例中所涉及到的模块或单元可以通过软件的方式实现,也可以通过硬件的方式来实现。其中,模块或单元的名称在某种情况下并不构成对该单元本身的限定。
179.本文中以上描述的功能可以至少部分地由一个或多个硬件逻辑部件来执行。例如,非限制性地,可以使用的示范类型的硬件逻辑部件包括:现场可编程门阵列(fpga)、专用集成电路(asic)、专用标准产品(assp)、片上系统(soc)、复杂可编程逻辑设备(cpld)等等。
180.在本公开的上下文中,机器可读介质可以是有形的介质,其可以包含或存储以供指令执行系统、装置或设备使用或与指令执行系统、装置或设备结合地使用的程序。机器可读介质可以是机器可读信号介质或机器可读储存介质。机器可读介质可以包括但不限于电子的、磁性的、光学的、电磁的、红外的、或半导体系统、装置或设备,或者上述内容的任何合适组合。机器可读存储介质的更具体示例会包括基于一个或多个线的电气连接、便携式计算机盘、硬盘、随机存取存储器(ram)、只读存储器(rom)、可擦除可编程只读存储器(eprom或快闪存储器)、光纤、便捷式紧凑盘只读存储器(cd-rom)、光学储存设备、磁储存设备、或上述内容的任何合适组合。
181.根据本公开的一个或多个实施例,提供了一种卡顿分析方法,包括:
182.发送目标消息至消息队列,记录目标消息的发送时刻、开始处理时刻与处理完成
时刻;
183.若目标消息发生卡顿现象,确定目标消息发生卡顿现象的时段,其中,目标消息发生卡顿的时段包括消息等待时段或消息处理时段,消息等待时段为发送时刻与开始处理时刻之间的时段,消息处理时段为开始处理时刻与处理完成时刻之间的时段;
184.基于目标消息发生卡顿现象的时段,确定目标消息的卡顿分析结果。
185.在本公开的一个实施例中,发送目标消息至消息队列,记录目标消息的发送时刻、开始处理时刻与处理完成时刻,包括:
186.利用预设的消息处理工具发送目标消息至消息队列;
187.利用消息处理工具的第一预设函数记录目标消息的发送时刻;
188.当接收到目标消息的处理请求时,记录目标消息的开始处理时刻;
189.利用消息处理工具的第二预设函数记录目标消息的处理完成时刻。
190.在本公开的一个实施例中,消息处理工具按照下述方式构建:
191.创建包括第一预设函数及第二预设函数的消息处理类;
192.利用创建的消息处理类,确定消息处理工具中的消息处理父类;
193.通过类继承方式复写第一预设函数及第二预设函数,确定消息处理工具中的消息处理子类。
194.在本公开的一个实施例中,利用创建的消息处理类,确定消息处理工具中的消息处理父类,包括:
195.确定第一消息处理父类,第一消息处理父类为原始消息处理工具的源代码中直接使用消息处理的代码点的消息处理父类;
196.利用创建的消息处理类替换第一消息处理父类,得到消息处理工具中的消息处理父类;
197.或者,
198.确定第二消息处理父类,第二消息处理父类为原始消息处理工具的源代码中的消息处理使用子类对应的消息处理父类;
199.利用创建的消息处理类替换第二消息处理父类,得到消息处理工具中的消息处理父类。
200.在本公开的一个实施例中,若目标消息发生卡顿现象,确定目标消息发生卡顿现象的时段,包括:
201.获取目标消息在消息等待时段和消息处理时段内的函数调用关系,并基于函数调用关系确定目标消息发生卡顿的时段。
202.在本公开的一个实施例中,基于函数调用关系确定目标消息发生卡顿的时段,包括:
203.若发送时刻与开始处理时刻的时间差大于第一预设时间阈值,则确定目标消息在消息等待时段发生卡顿现象;
204.若开始处理时刻与处理完成时刻的时间差大于第二预设时间阈值,则确定目标消息在消息处理时段发生卡顿现象。
205.在本公开的一个实施例中,基于目标消息发生卡顿现象的时段,确定目标消息的卡顿分析结果,包括:
206.若目标消息在消息等待时段发生卡顿现象,基于第一预设函数确定目标消息的消息来源;
207.分析消息来源,确定造成卡顿现象的耗时消息名称。
208.在本公开的一个实施例中,基于目标消息发生卡顿现象的时段,确定目标消息的卡顿分析结果,包括:
209.若目标消息在消息处理时段发生卡顿现象,基于函数调用关系,确定造成卡顿现象的耗时函数名称。
210.在本公开的一个实施例中,卡顿分析方法还包括:
211.显示卡顿分析结果,卡顿分析结果包括造成卡顿现象的耗时消息名称或造成卡顿现象的耗时函数名称。
212.根据本公开的一个或多个实施例,提供了一种卡顿分析装置,包括:
213.记录模块,用于发送目标消息至消息队列,记录目标消息的发送时刻、开始处理时刻与处理完成时刻;
214.第一确定模块,用于若目标消息发生卡顿现象,确定目标消息发生卡顿现象的时段,其中,目标消息发生卡顿的时段包括消息等待时段或消息处理时段,消息等待时段为发送时刻与开始处理时刻之间的时段,消息处理时段为开始处理时刻与处理完成时刻之间的时段;
215.第二确定模块,用于基于目标消息发生卡顿现象的时段,确定目标消息的卡顿分析结果。
216.在本公开的一个实施例中,记录模块包括:
217.发送子模块,用于利用预设的消息处理工具发送目标消息至消息队列;
218.第一记录子模块,用于利用消息处理工具的第一预设函数记录目标消息的发送时刻;
219.第二记录子模块,用于当接收到目标消息的处理请求时,记录目标消息的开始处理时刻;
220.第三记录子模块,用于利用消息处理工具的第二预设函数记录目标消息的处理完成时刻。
221.在本公开的一个实施例中,消息处理工具的构建模块可以包块:
222.创建子模块,用于创建包括第一预设函数及第二预设函数的消息处理类;
223.第一确定子模块,用于利用创建的消息处理类,确定消息处理工具中的消息处理父类;
224.第二确定子模块,通过类继承方式复写第一预设函数及第二预设函数,确定消息处理工具中的消息处理子类。
225.在本公开的一个实施例中,第一确定子模块,包括:
226.第一确定单元,用于确定第一消息处理父类,第一消息处理父类为原始消息处理工具的源代码中直接使用消息处理的代码点的消息处理父类;
227.第一替换单元,用于利用创建的消息处理类替换第一消息处理父类,得到消息处理工具中的消息处理父类;
228.或者包括:
229.第二确定单元,用于确定第二消息处理父类,第二消息处理父类为原始消息处理工具的源代码中的消息处理使用子类对应的消息处理父类;
230.第二替换单元,用于利用创建的消息处理类替换第二消息处理父类,得到消息处理工具中的消息处理父类。
231.在本公开的一个实施例中,第一确定模块,包括:
232.第三确定子模块,用于获取目标消息在消息等待时段和消息处理时段内的函数调用关系,并基于函数调用关系确定目标消息发生卡顿的时段。
233.在本公开的一个实施例中,第三确定子模块,包括:
234.第一确定单元,用于若发送时刻与开始处理时刻的时间差大于第一预设时间阈值,则确定目标消息在消息等待时段发生卡顿现象;
235.第二确定单元,用于若开始处理时刻与处理完成时刻的时间差大于第二预设时间阈值,则确定目标消息在消息处理时段发生卡顿现象。
236.在本公开的一个实施例中,第二确定模块,包括:
237.第四确定子模块,用于若目标消息在消息等待时段发生卡顿现象,基于第一预设函数确定目标消息的消息来源;
238.分析子模块,用于分析消息来源,确定造成卡顿现象的耗时消息名称。
239.在本公开的一个实施例中,第二确定模块,包括:
240.第五确定子模块,用于若目标消息在消息处理时段发生卡顿现象,基于函数调用关系,确定造成卡顿现象的耗时函数名称。
241.在本公开的一个实施例中,卡顿分析装置还包括:
242.显示模块,用于显示卡顿分析结果,卡顿分析结果包括造成卡顿现象的耗时消息名称或造成卡顿现象的耗时函数名称。
243.根据本公开的一个或多个实施例,提供了一种电子设备,包括:
244.一个或多个处理器;
245.存储器;
246.一个或多个应用程序,其中一个或多个应用程序被存储在存储器中并被配置为由一个或多个处理器执行,一个或多个程序配置用于:执行根据卡顿分析的方法对应的操作。
247.根据本公开的一个或多个实施例,提供了一种计算机可读存储介质,包括:
248.其上存储有计算机程序,该程序被处理器执行时实现卡顿分析方法。
249.以上描述仅为本公开的较佳实施例以及对所运用技术原理的说明。本领域技术人员应当理解,本公开中所涉及的公开范围,并不限于上述技术特征的特定组合而成的技术方案,同时也应涵盖在不脱离上述公开构思的情况下,由上述技术特征或其等同特征进行任意组合而形成的其它技术方案。例如上述特征与本公开中公开的(但不限于)具有类似功能的技术特征进行互相替换而形成的技术方案。
250.此外,虽然采用特定次序描绘了各操作,但是这不应当理解为要求这些操作以所示出的特定次序或以顺序次序执行来执行。在一定环境下,多任务和并行处理可能是有利的。同样地,虽然在上面论述中包含了若干具体实现细节,但是这些不应当被解释为对本公开的范围的限制。在单独的实施例的上下文中描述的某些特征还可以组合地实现在单个实施例中。相反地,在单个实施例的上下文中描述的各种特征也可以单独地或以任何合适的
子组合的方式实现在多个实施例中。
251.尽管已经采用特定于结构特征和/或方法逻辑动作的语言描述了本主题,但是应当理解所附权利要求书中所限定的主题未必局限于上面描述的特定特征或动作。相反,上面所描述的特定特征和动作仅仅是实现权利要求书的示例形式。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献