本发明属于anr监测领域,具体涉及一种android应用anr监控方法、装置、设备及介质。
背景技术:
1、anr:application not responding(应用无响应),表示在主线程关键动作长时间得不到响应,android(安卓)系统设计的兜底措施。比如发送一条广播,如果超过10s没有处理,则会触发系统anr机制。
2、目前解决android anr问题过于依赖系统环境以及特殊问题,很难去解决大部分问题。
3、根本原因在于android系统对于anr机制的设计以及dump机制的滞后性带来的堆栈飘逸,导致很难取到关键耗时消息,甚至是错误的消息。
4、由于主线程每次只能处理一条消息,而系统只会监控关键消息的开始执行时间和执行完成时间,如果超过10s还没有执行完成,系统则认为发生了anr,抓取堆栈信息用于回溯,而anr机制在排查问题时,抓取的堆栈可能是无效的或者错误的,导致anr机制在排查问题时存在着较大难度,并且错误的堆栈甚至会误导开发者。
技术实现思路
1、本发明的目的是提供一种android应用anr监控方法、装置、设备及存储介质,用以解决现有的anr机制在排查问题时,抓取的堆栈可能是无效的或者错误的,导致anr机制在排查问题时存在着较大难度,并且错误的堆栈甚至会误导开发者的问题。
2、为了实现上述目的,本发明采用以下技术方案:
3、第一方面,本发明提供了一种android应用anr监控方法,所述方法包括:
4、监听主线程的消息,利用子线程检测主线程执行各消息的执行耗时,基于主线程执行后的消息和对应的执行耗时构建主线程的缓存队列;
5、子线程判断主线程执行任意消息所用的执行耗时是否超过预设时长,若是,主线程触发执行超时,子线程对主线程的堆栈进行采样,得到至少一个耗时堆栈;
6、监听anr事件,当发生anr时,子线程收集主线程的待分发消息和anr消息,并对主线程的堆栈进行采样,得到anr堆栈,以及将待分发消息和anr消息加入缓存队列;
7、将缓存队列、anr事件、anr堆栈和至少一个耗时堆栈进行打包,得到数据上传包,将数据上传包上传到分析端,以使分析端对数据上传包进行分析,得到关键堆栈。
8、优选地,所述方法还包括:
9、对消息进行分类,得到消息类别,所述消息类别至少包括:anr消息、卡顿消息、重要消息、掉帧消息、一般消息和待分发消息;
10、根据消息类别、各消息的重要程度或各消息执行耗时,确定各消息的优先级。
11、优选地,所述方法还包括:基于预设临界时限值,对缓存队列中的消息进行聚合和拆分,得到耗时消息和普通消息,所述耗时消息用于表征执行耗时消息所需要的执行耗时超过预设临界时限值,所述普通消息用于表征执行普通消息所需要的执行耗时未超过预设临界时限值。
12、优选地,所述方法还包括:基于预设清理规则,对缓存队列中的消息进行清理;
13、其中,所述预设清理规则至少包括:
14、在缓存队列中缓存的消息的容量达到预设容量限值时,清理最低优先级的消息;或
15、在缓存队列中缓存的消息的数量达到预设数量限值时,清理超过的消息;或
16、在缓存队列中的任意消息的缓存时长达到第一预设缓存时限且该消息的优先级不是最高级或高级时,清理该消息;或
17、在缓存队列中的任意消息的缓存时长达到第二预设缓存时限且该消息的优先级不是最高级时,清理该消息;或
18、在缓存队列中的任意消息的缓存时长达到第三预设缓存时限,清理该消息;
19、其中,所述第三预设缓存时限大于第二预设缓存时限,所述第二预设缓存时限大于第一预设缓存时限。
20、优选地,所述方法还包括:
21、构建消息缓冲池,将缓存队列中被清理的消息回收到消息缓冲池内,以回收后的消息作为复用消息。
22、优选地,主线程触发执行超时,子线程对主线程的堆栈进行采样,得到至少一个耗时堆栈,包括:
23、在子线程创建延时检测任务,所述延时检测任务用于在主线程执行任意消息所用的执行耗时达到预设时长时检测主线程是否执行完成该消息;
24、当主线程未执行完成该消息,生成dump任务;
25、所述子线程执行dump任务,以抓取耗时堆栈;
26、以预设时长递减值降低延时检测任务的预设时长,在主线程继续执行该消息的执行耗时达到降低后的预设时长时,再次检测主线程是否执行完成该消息,若主线程未执行完成该消息,再次生成dump任务,以使子线程抓取耗时堆栈,当主线程执行完成该消息后,初始化预设时长,等待下一个消息被主线程执行。
27、优选地,分析端对数据上传包进行分析,得到关键堆栈,包括:
28、将数据上传包中的每个anr事件对应的anr堆栈和耗时堆栈以预设聚合策略进行聚合,得到每个anr事件对应的至少一个关键堆栈;
29、统计每个anr事件对应的关键堆栈的条数,根据关键堆栈的条数对各anr事件进行排序,得到anr事件的解决优先级。
30、第二方面,本发明提供了一种android应用anr监控装置,用于实现上述的android应用anr监控方法,所述装置包括:
31、第一监听模块,用于监听主线程的消息,得到主线程的缓存队列,所述缓存队列中缓存有若干由主线程执行后的消息;
32、堆栈采样模块,用于子线程判断主线程执行任意消息所用的执行耗时是否超过预设时长,若是,主线程触发执行超时,子线程对主线程的堆栈进行采样,得到至少一个耗时堆栈;
33、第二监听模块,用于监听anr事件,当发生anr时,子线程检测主线程执行缓存队列中各消息的执行耗时;
34、数据上传模块,用于将缓存队列、anr事件、anr堆栈和至少一个耗时堆栈进行打包,得到数据上传包,将数据上传包上传到分析端,以使分析端对数据上传包进行分析,得到关键堆栈。
35、第三方面,本发明提供了一种电子设备,包括存储器、处理器以及存储在所述存储器中并可在所述处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现上述的android应用anr监控方法。
36、第四方面,本发明提供了一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现上述的android应用anr监控方法。
37、有益效果:
38、本发明通过缓存队列来实时缓存有若干由主线程执行后的消息和各个消息的执行耗时,同时对各个消息的执行耗时进行超时判断,当任意消息的执行耗时超过预设时长时,进行堆栈采样,可以得到至少一个耗时堆栈,在发生anr时,采集此时的anr堆栈,将缓存队列、anr事件、anr堆栈和至少一个耗时堆栈等数据打包数据上传包上传到分析端,最后利用分析端对数据上传包进行分析,可以得到准确的关键堆栈,关键堆栈有利于对anr事件进行问题排查,提高问题排查的效率和准确率。