一种应用程序无响应的处理方法及装置的制造方法

文档序号:9672979阅读:857来源:国知局
一种应用程序无响应的处理方法及装置的制造方法【
技术领域
】[0001]本发明涉及计算机
技术领域
,特别是涉及一种应用程序无响应的处理方法及装置。【
背景技术
】[0002]随着智能终端的广泛普及,安装在终端上的应用程序所实现的功能越来越完善,相应的,这些应用程序本身的结构也越来越复杂,因此运行起来也更加耗费系统资源。以安卓(Android)操作系统系统为例,经常会出现应用程序无响应(Applicat1nNotResponding,简称ANR)的情况。由于Android应用程序通常是运行在一个单独的线程例如main线程里,如果应用程序所执行的操作占用了主线程的太多资源,主线程就没有能力再处理用户的1/0操作或接收Intent广播,应用程序经过预定的一段时间后仍未响应,系统就会默认该应用程序已经挂起,这时终端通常就会显示一个ANR对话框提供给用户,由用户选择结束该应用程序或继续等待系统响应。[0003]现有技术中,系统会在ANR发生时向引起ANR的应用程序所在进程的signalcatcher线程发送一个P0SIX(PortableOperatingSystemInterfaceofUnix)标准信号,用于唤醒signalcatcher线程,该线程主要用于处理ANR事件,并打印ANR日志,以供用户后续查阅ANR发生时系统的相关信息。然而,这一系列操作通常是由系统在后台执行,对于应用程序的开发者来说,并不能获知ANR的发生,更没有权限读取ANR日志,因此,就不能对ANR事件做出处理,例如中断耗时的线程,停止1/0操作,记录ANR的详细信息以对应用程序做出改进等。因此,现有的处理ANR的方法只能依赖用户处理,稳定性差,影响用户体验。【
发明内容】[0004]本发明实施例中提供了一种应用程序无响应ANR的处理方法及装置,以解决现有技术处理ANR的方法只能依赖用户处理,稳定性差,影响用户体验的问题。[0005]为了解决上述技术问题,本发明实施例公开了如下技术方案:[0006]一方面,提供一种应用程序无响应ANR的处理方法,所述方法包括:[0007]设置应用程序所在的当前进程的可跟踪属性,以使所述当前进程能够被非root权限的进程跟踪;[0008]建立一个新进程,使所述新进程跟踪所述当前进程的signalcatcher线程;[0009]在所述新进程中,修改所述当前进程的signalcatcher线程的内存代码,以使所述应用程序出现ANR时,所述应用程序所在的当前进程的signalcatcher线程在执行过程中跳转至预设的处理函数,由所述处理函数对ANR进行处理。[0010]可选的,修改所述当前进程的signalcatcher线程的内存代码可包括如下步骤:[0011]保存目标地址,所述目标地址为signalcatcher线程的pc寄存器的值索引的地址;[0012]将所述目标地址开始的第一地址长度范围内的指令复制到位于所述当前进程内存中的模板函数的第一指定位置;[0013]将所述处理函数的地址写入到所述模板函数的第二指定位置;将所述模板函数的返回地址指向所述目标地址加上所述第一地址长度的地址;[0014]在所述目标地址的位置写入跳转代码,以使出现ANR时,所述signalcatcher线程的代码执行至所述目标地址时跳转至所述模板函数。[0015]可选的,使所述新进程跟踪所述当前进程包括:查找所述当前进程的signalcatcher线程ID;根据所述signalcatcher线程ID跟踪所述当前进程的signalcatcher线程。[0016]可选的,所述方法还可以包括,判断所述signalcatcher线程是否处于非唤醒状态;当所述signalcatcher线程处于非唤醒状态时,执行所述修改所述当前进程的signalcatcher线程的内存代码的步骤。[0017]优选的,判断所述signalcatcher线程是否处于非唤醒状态之前,还可以包括:等待所述signalcatcher线程被暂停。[0018]另一方面,提供一种应用程序无响应的处理装置,所述装置包括:[0019]设置单元,用于设置应用程序所在的当前进程的可跟踪属性,以使所述当前进程能够被非root权限的进程跟踪;[0020]跟踪单元,用于建立一个新进程,使所述新进程跟踪所述当前进程的signalcatcher线程;[0021]修改单元,用于在所述新进程中,修改所述当前进程的signalcatcher线程的内存代码,以使所述应用程序出现ANR时,所述应用程序所在的当前进程的signalcatcher线程在执行过程中跳转至预设的处理函数,由所述处理函数对ANR进行处理。[0022]可选的,所述修改单元包括:[0023]保存子单元,用于保存目标地址,所述目标地址为signalcatcher线程的pc寄存器的值索引的地址;[0024]复制子单元,用于将所述目标地址开始的第一地址长度范围内的指令复制到位于所述当前进程内存中的模板函数的第一指定位置;[0025]第一写入子单元,用于将处理函数的地址写入到所述模板函数的第二指定位置;[0026]返回地址子单元,用于将所述模板函数的返回地址指向所述目标地址加上所述第一地址长度的地址;[0027]第二写入子单元,用于在所述目标地址的位置写入跳转代码,以使出现ANR时,所述signalcatcher线程的代码执行至所述目标地址时跳转至所述模板函数。[0028]可选的,所述跟踪单元包括:查找子单元,用于查找所述当前进程的signalcatcher线程ID;跟踪子单元,用于根据所述查找子单元查找的所述signalcatcher线程ID跟踪所述当前进程的signalcatcher线程。[0029]可选的,所述装置还包括:判断单元,用于判断所述signalcatcher线程是否处于非唤醒状态,如果所述signalcatcher线程处于非唤醒状态时,执行所述修改所述当前进程的signalcatcher线程的内存代码的步骤。[0030]可选的,所述装置还包括:等待单元,用于在所述判断单元判断所述signalcatcher线程是否处于非唤醒状态之前,等待所述signalcatcher线程被暂停。[0031]由以上技术方案可知,本发明实施例提供的一种应用程序无响应ANR的处理方法及装置,通过建立一个新的进程,使其跟踪应用程序所在的当前进程的signalcatcher进程,并在该新进程中修改signalcatcher线程的内存代码,以使在出现ANR时,signalcatcher线程能够跳转至应用程序的开发人员预先编写的处理函数,由所述处理函数对ANR进行处理,从而使应用程序有机会中断耗时的线程,停止I/O操作,以及记录ANR的详细信息以对应用程序做出改进。【附图说明】[0032]为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,对于本领域普通技术人员而言,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。[0033]图1为本发明实施例提供的一种应用程序无响应的处理方法的流程示意图;[0034]图2为本发明另一个实施例提供的一种应用程序无响应的处理方法的流程示意图;[0035]图3为对signalcatcher线程的内存代码进行修改的具体流程图;[0036]图4为本发明实施例提供的一种应用程序无响应的处理装置的流程示意图;[0037]图5为修改单元的结构示意图;[0038]图6为本发明另一个实施例提供的一种应用程序无响应的处理装置的流程示意图。【具体实施方式】[0039]首先对本发明应用程序无响应的处理方法的第一个实施例进行说明,参见图1,本实施例包括如下步骤:[0040]步骤101:设置应用程序所在的当前进程的可跟踪属性,以使所述当前进程能够被非root权限的进程跟踪;[0041]本申请以ARM架构为例进行描述,其他架构只需要修改为对应的指令即可。[0042]首先设置当前进程的dumpableflag,将其值设置为true,使得应用程序的当前进程能够被非root权限的进程跟踪,以便为步骤102中跟踪signalcatcher线程及步骤103中修改signalcatcher线程的内存代码做好准备。[0043]signalcatcher线程是用来捕获linux信号和做一些后续处理的。其源代码在dalvik/vm/SignalCatcher.*部分。在ANR发生时,signalcatcher线程会收到一个其所在进程退出信号SIGQUIT,并将当前进程的所有线程中的函数堆栈信息输出到trace,txt文件中,即打印ANR日志。[0044]root权限为根用户权限,也是系统中权限最高的用户权限。将当前进程的dumpableflag的值设置为true后,可以使非root权限的进程(即步骤102中新建的进程)跟踪并修改当前应用程序的内存代码。这里“跟踪”进程使用ptraceattach命令,相应的ARM代码为:[0045]prctl(PR_SET_DUMPABLE,1,0,0,0);[0046]步骤102:建立一个新进程,使所述新进程跟踪所述当前进程的signalcatcher线程;[0047]可选择使用fork或者clone命令建立一个新进程,用ptraceattach跟踪signalcatcher线程,使该新进程成为signalcatcher的子进程,从而可以对父进程的signalcatcher进行访问及修改其内存代码。即本实施例中,当前进程为父进程,新建的进程为当前进程的子进程。[0048]这里需要预先查找当前进程的signalcatcher的线程ID,并使用该线程ID来跟踪sign当前第1页1 2 3 
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1