异常检测处理方法及装置、电子设备及计算机存储介质与流程

文档序号:15492267发布日期:2018-09-21 20:51阅读:113来源:国知局

本发明涉及信息技术领域,尤其涉及一种异常检测处理方法及装置、电子设备及计算机存储介质。



背景技术:

应用程序,在运行时可能会因为某些异常原因导致程序崩溃,为了便于开发者获取程序崩溃原因,会对应用程序的异常进行捕获,例如,安卓应用(application,app)中,主要是通过设置线程的自定义异常捕获处理类,从而通过自定义异常捕获处理类中捕获崩溃异常,在捕获异常之后,才可能对异常进行修复,使得app能够整体上运行良好,确保用户的使用满意度。但是实践发现,在一些情况下,app的异常捕获存在遗漏问题或异常捕获中途中断问题。



技术实现要素:

有鉴于此,本发明实施例期望提供一种异常检测处理方法及装置、电子设备及计算机存储介质,至少部分解决app异常捕获等异常处理遗漏的问题。

本发明的技术方案是这样实现的:

第一方面,本发明实施例提供一种异常检测处理方法,包括:

创建第一线程组;

在所述第一线程组内创建异常处理方法;

利用所述第一线程组替代应用程序的第二线程组进行异常处理。

可选地,所述在所述第一线程组内创建异常处理方法,包括:

在所述第一线程组内创建第二异常处理方法;

将所述应用程序的第一异常处理方法的方法名设置为所述第二异常处理方法的方法名。

可选地,所述第二异常处理方法的异常处理逻辑,至少部分不同于所述第一异常处理方法的异常处理逻辑。

可选地,所述第二异常方法包括:

继承的所述第一异常处理方法;

创建的第三异常处理方法;其中,所述第三异常处理方法的异常处理逻辑不同于所述第一异常处理方法的异常处理逻辑。

可选地,所述在所述第一线程组内创建异常处理方法,包括:

利用覆写机制在所述第一线程组内创建所述异常处理方法。

可选地,所述方法还包括以下至少之一:

根据所述第二线程组的属性设置所述第一线程组的属性;

根据所述第二线程组的引用设置所述第一线程组的引用。

可选地,所述根据所述第二线程组的属性设置所述第一线程组的属性,包括以下至少之一:

根据所述第二线程组的线程组名称设置所述第一线程组的线程组名称;

根据所述第二线程组包括的线程信息设置所述第一线程组包括的线程组信息;

根据所述第二线程组的类型设置所述第一线程组的类型,其中,所述类型包括:前台线程组类型和/或后台线程组类型。

可选地,所述根据所述第二线程组的属性设置所述第一线程组的属性,包括:

利用反射机制根据所述第二线程组的属性设置所述第一线程组的属性。

可选地,所述利用所述第一线程组替代应用程序的第二线程组进行异常处理,包括:

所述第一线程组从操作系统接收异常捕获事件;

所述第一线程组的异常捕获方法基于异常捕获事件执行异常捕获。

第二方面,本发明实施例提供一种异常检测处理装置,包括:

第一创建模块,用于创建第一线程组;

第二创建模块,用于在所述第一线程组内创建异常处理方法;

替代处理模块,用于利用所述第一线程组替代应用程序的第二线程组进行异常处理。

第三方面,本发明实施例提供一种电子设备,包括:

存储器,用于信息存储;

处理器,与所述存储器连接,用于通过执行存储在所述存储器上的计算机可执行指令,实现前述一个或多个技术方案提供的方法。

第四方面,本发明实施例提供一种计算机存储介质,所述计算机存储介质存储有计算机可执行指令;所述计算机可执行指令被执行后,能够前述一个或多个技术方案提供的方法。

本发明实施例提供的异常检测处理方法及装置、电子设备及计算机存储介质,会创建一个第一线程组,通过第一线程组的线程组级别的异常处理方法替代第二线程组进行异常捕获等异常处理,从而减少线程级别的异常捕获事件不相互传递导致异常捕获遗漏的问题,从而实现全面的异常处理,减少异常捕获等异常处理等遗漏现象或中断现象。

附图说明

图1为本发明实施例提供的第一种异常检测处理方法的流程示意图;

图2为本发明实施例提供的一种电子设备的系统框图;

图3为本发明实施例提供的一种电子设备的结构示意图;

图4为本发明实施例提供的第二种异常检测处理方法的流程示意图。

具体实施方式

以下结合说明书附图及具体实施例对本发明的技术方案做进一步的详细阐述。

研究发现导致异常捕获遗漏问题或中断问题的是:在相关技术都是进行线程级别的异常捕获;操作系统发现异常之后,通知线程组;线程组告知率先建立异常捕获方法的线程进行异常捕获;若一个线程在完成异常捕获之后,不将异常捕获事件传递给其他程序,则会导致捕获的中断,进而导致异常捕获遗漏问题。若一个应用程序中有引入第三软件开发工具(softwaredevelopmentkit,sdk)或第三方插件,由于异常程序中自身开发的异常程序不会知晓第三方提供的sdk或第三方插件,显然就更不可能将异常捕获事件传递给第三方sdk或第三方插件,故导致安装有第三方sdk或第三方插件的应用程序的异常检测总是有遗漏。

如图1所示,本实施例提供一种异常检测处理方法,包括:

步骤s110:创建第一线程组;

步骤s120:在所述第一线程组内创建异常处理方法;

步骤s130:利用所述第一线程组替代应用程序的第二线程组进行异常处理。

本实施例中所述第一线程组可为独立于所述第二线程组。所述第二线程组可为能够接收到操作系统提供的异常捕获事件的任意一个线程组,例如,所述第二线程组可为主函数所在的主线程组,所述主函数可包括:main()函数。再例如,所述第二线程组还可以是其他用于异常捕获等异常处理的线程组,不局限于所述主函数所在的主线程组。

在本实施例中,所述第一线程组可为临时或动态创建的线程组。

在一些实施例中,步骤s110可包括:在应用程序启动时或启动后,创建所述第一线程组。如此,每次应用程序启动时或启动后创建所述第一线程组,即便应用程序有更新(例如,有引入新的插件或补丁等)可以及时的调整第一线程组内包括的异常处理方法,实现异常捕获等异常的全面处理,避免遗漏及异常处理中断的问题。

在一些实施例中,所述步骤s110还可包括:在应用程序有更新时,创建所述第一线程组;否则利用前一次应用程序关闭之前创建的第一线程组进行异常处理,减少第一线程组创建等过程。此处,应用程序有更新可包括:异常程序的代码更新和/或配置信息,例如,应用程序有新增插件和/或新增补丁等。

在一些实施例中,在应用程序中设置有创建第一线程组的执行代码及执行参数,该执行代码被调用后会基于所述执行参数创建所述第一线程组,所述执行参数可包括:所述第一线程组的线程组对象等参数。在另一些实施例中,所述执行代码被调用还可包括:向操作系统申请创建和使用所述第一线程组的资源,所述资源可包括:存储资源和/或计算资源等。

在本实施例中可基于第一线程组的线程组类,创建所述第一线程组;例如,创建与第二线程组相同类型的第一线程组。

在第一线程组内创建异常处理方法,该异常处理方法可为各种程序代码,直接归属于线程组的异常处理方法。

在本实施例中利用创建的第二线程组直接进行异常处理,如此,若操作系统发现了异常会产生异常捕获事件并告知第二线程组;直接利用第二线程组内的异常处理方法进行异常捕获,显然就不存在不同线程之间的异常捕获的传递,就不存在因为异常捕获事件传递中断导致的异常捕获遗漏的问题。操作系统发送的异常捕获事件会触发对应的线程组或线程进行异常处理,例如,所述异常处理可包括:异常捕获、异常定位、异常记录及异常上报中的一个或多个。

可选地,所述步骤s120可包括:

在所述第一线程组内创建第二异常处理方法;

将所述应用程序的第一异常处理方法的方法名设置为所述第二异常处理方法的方法名。

可选地,所述第二异常处理方法的异常处理逻辑,至少部分不同于所述第一异常处理方法的异常处理逻辑。

在本实施例中为了实现异常捕获的处理,能够顺利将捕获的异常告知服务器平台。在本实施例中会创建第二异常处理方法,该第二异常处理方法可为:应用程序的线程组级别的异常处理逻辑和/或线程级别的异常处理逻辑继承过来。例如,继承第二线程组的线程组级别的异常处理逻辑、继承应用程序中不同线程的异常处理逻辑,如此,不管该线程级别的异常处理逻辑是应用程序自身默认设置的,还是第三sdk或第三插件的线程级别的异常处理逻辑都会被继承到。

为了避免出现异常,在本实施例中,所述第二异常处理方法的方法名与应用程序的第一异常处理方法的方法名相同的

在本实施例中,第二异常处理方法的至少部分异常处理逻辑是不同于第一异常处理逻辑的。这种不同可以体现在,不用在进行线程级别之间的异常捕获事件的传递等。

可选地,所述第二异常方法包括:

继承的所述第一异常处理方法;

创建的第三异常处理方法;其中,所述第三异常处理方法的异常处理逻辑不同于所述第一异常处理方法的异常处理逻辑。

在本实施例中所述第三异常处理方法的异常处理逻辑与所述第一异常处理方法的异常处理逻辑不同。例如,所述第三异常处理逻辑可为异常代码删除逻辑。例如,在通过补丁进行故障(bug)修复的热修复技术中,当前下载的补丁被安装后可能应用程序的其他故障,例如,应用程序无法执行。此时的第三异常处理方法可包括:删除导致异常补丁的异常处理逻辑;如此,就实现了基于补丁的热修复回退功能,应用程序该补丁被删除或被卸载之后,至少能够恢复到应用程序的原始运行状态,减少因热修复技术导致的更大应用程序异常的问题。

所述第三异常处理方法可为预先设置在所述应用程序中的线程组级别的异常处理方法,也可以是从网络侧的服务器下载的异常处理方法,创建所述第三异常处理方法的方式有多种,不局限于上述方法。

在一些实施例中,所述第二异常方法的异常处理逻辑可以完全不同于所述第一异常处理方法的异常处理逻辑,则此时,所述第二异常处理方法可以是完全重新创建的异常处理逻辑。

可选地,所述步骤s120可包括:利用覆写机制在所述第一线程组内创建所述异常处理方法。

例如,针对java等程序语言,可以采用覆写机制继承应用程序的原始异常处理方法(即所述第一异常处理方法,例如,归属第二线程组内各线程的异常处理方法)等。采用这种覆写机制创建了第一线程组内的异常处理方法,在java程序语言中,就同时存在了子类和父类;第一线程组内创建的异常处理方法,相当于第二线程组内的异常处理方法的子类,子类继承父类的功能或属性之后,父类就不再不执行了,如此就实现了父类的覆盖,从而一方面简便的实现了第一类线程组内异常处理方法的构建,另一方面同时自动屏蔽了第二线程组内的异常处理方法的执行。

可选地,所述方法还可包括:

根据所述第二线程组的属性设置所述第一线程组的属性;

根据所述第二线程组的引用设置所述第一线程组的引用。

在本实施例中,由于是利用第一线程组替代所述第二线程组进行异常捕获,故在本实施例中对于操作系统而言,所述第一线程组需要继承第二线程组的属性,才能异常捕获事件从上一级别顺利传递第一线程组,并确保异常捕获的正常进行,故在本实施例中会将第二线程组的属性设置为第一线程组的属性。

所述根据所述第二线程组的引用设置所述第一线程组的引用,可包括:将对第二线程组的引用替换为对第一线程组的引用。例如,将对第二线程组的引用替换为对第一线程组的引用,可包括:

将操作系统对第二线程组的引用,替换为第一线程组的引用,如此,可以使得操作系统在发现异常时,将异常捕获事件告知该引用告知第一线程组。

例如,所述将对第二线程组的引用替换为对第一线程组的引用,具体可包括:

在一方式中,删除操作系统中对第二线程组的引用关系,并将该应用关系添加第一线程组的线程组标识等参数,从而实现将操作系统对第二线程组的引用修改为对第一线程组的引用关系,如此,操作系统会基于该应用关系在发现异常时,将异常捕获事件告知第一线程组;

在另一些方式中,维持操作系统对第一线程组的应用关系,同时建立操作系统对第一线程组的引用关系,如此也可以确保第一线程组接收到操作系统传输给线程组的异常捕获事件。

在一些实施例中,对第二线程组的引用可根据引用的强弱分为:软引用、强引用及弱引用;软引用的引用强度大于强引用的引用强度,强引用的引用强度大于弱引用的引用强度。

在一些实施例中,若是软引用或者强引用,则在步骤s120根据第二线程组创建第一线程组时,就会将软引用和/或强引用作为第一线程组的类被创建到第一线程组中。

在另一些实施例中,若第二线程组的引用还包括:若引用,则可能需要进行引用替换,将第二线程组的引用替换为对第一线程组的引用。

例如,若当前操作系统对第二线程组的引用为弱引用,则还需要将操作系统对第二线程组的引用替换为第一线程组的引用。

所述第一线程组的异常处理方法可包括:

异常记录方法,该异常记录方法被执行后,会生成异常日志等信息,该异常日志被应用程序的开发商或服务平台,可以通过分析该异常日志定位异常代码,并提供热修复等修复技术;

异常报告方法,该异常报告方法被执行后,可向服务平台发送异常信息,例如,前述异常日志。通过所述异常报告方法的执行可定期或不定期的向所述服务平台发送所述异常信息。

在一些实施例中,所述异常处理方法还可包括:

异常诊断方法,可以用于自动诊断异常的类型、

异常定位方法,可以用于定位导致异常的线程和/或代码等。

以上仅是异常处理方法的举例,具体实现时不局限于上述任意一种。

可选地,所述根据所述第二线程组的属性设置所述第一线程组的属性,包括以下至少之一:

根据所述第二线程组的线程组名称设置所述第一线程组的线程组名称;

根据所述第二线程组包括的线程信息设置所述第一线程组包括的线程组信息;

根据所述第二线程组的类型设置所述第一线程组的类型,其中,所述类型包括:前台线程组类型和/或后台线程组类型。

在本实施例中前台线程组类型:若该类型的线程组运行则设备的前台其运行状态和/或运行结果的线程组,而后台线程组类型的线程组运行,是在设备后台执行的,在前台是看不到其运行状态和/或运行结果的。在前台看到线程组的运行状态和/或运行结果,可显示界面上看到其运行状态和/或运行结果。

可选地,所述根据所述第二线程组的属性设置所述第一线程组的属性,包括:

利用反射机制根据所述第二线程组的属性设置所述第一线程组的属性。

在本实施例中利用反射机制将第二线程组的属性设置为第一线程组的属性,如此可以不用更改第二线程组的功能。例如,通过反射机制读取到所述第二线程组的属性,并将其赋值给步骤s110中创建的第一线程组,从而使得第一线程组的属相与第二线程组的属性相同。

例如,java的反射机制可如下:

java程序在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。

故在本实施例中,若第二线程组的属性设置为私有,则获取第二线程组的属性时,可选择在第二线程组在运行过程中去读取其属性,例如,到第二线程组的缓存中读取第二线程组的其属性,从而简便的实现了将第二线程组的属性赋值给第一线程组的目的。

可选地,参考图2,所述步骤s130可包括:

所述第一线程组从操作系统接收异常捕获事件;

所述第一线程组的异常捕获方法基于异常捕获事件执行异常捕获。

在本实施例中,会利用第一线程组直接替代第二线程组从操作系统接收异常捕获事件,如此,第一线程组的异常处理功能被激活,在本实施例中第一线程组直接进行线程组级别的异常处理,不再需要在线程级别的线程之间传递异常捕获事件,从而避免因为不同线程之间不传递异常捕获事件导致的异常检测不全面或记录不全面等问题。

如图3所示,本实施例提供一种异常检测处理装置,包括:

第一创建模块110,用于创建第一线程组;

第二创建模块120,用于在所述第一线程组内创建异常处理方法;

替代处理模块130,用于利用所述第一线程组替代应用程序的第二线程组进行异常处理。

在本实施例中,所述第一创建模块110、第二创建模块120、替代模块及处理模块均可为程序模块,可以用于创建所述第一线程组、创建异常处理方法、并替代第二线程组进行异常处理等。

可选地,所述第二创建模块120,具体用于在所述第一线程组内创建第二异常处理方法;将所述应用程序的第一异常处理方法的方法名设置为所述第二异常处理方法的方法名;其中,所述第二异常处理方法的异常处理逻辑,至少部分不同于所述第一异常处理方法的异常处理逻辑。

可选地,所述第二异常方法包括:继承的所述第一异常处理方法;和/或,创建的第三异常处理方法;其中,所述第三异常处理方法的异常处理逻辑不同于所述第一异常处理方法的异常处理逻辑。

可选地,所述第二创建模块120,具体用于利用覆写机制在所述第一线程组内创建所述异常处理方法。

可选地,所述装置还包括:

属性模块,具体用于根据所述第二线程组的属性设置所述第一线程组的属性;

引用替换模块,用于根据所述第二线程组的引用设置所述第一线程组的引用。

可选地,所述第二创建模块120,具体可用于执行以下至少之一:

根据所述第二线程组的线程组名称设置所述第一线程组的线程组名称;

根据所述第二线程组包括的线程信息设置所述第一线程组包括的线程组信息;

根据所述第二线程组的类型设置所述第一线程组的类型,其中,所述类型包括:前台线程组类型和/或后台线程组类型。

在另一些实施例中,所述第二创建模块120,具体可用于利用反射机制根据所述第二线程组的属性设置所述第一线程组的属性。

在一些实施例中,所述替代处理模块130,具体可用于所述第一线程组从操作系统接收异常捕获事件;所述第一线程组的异常捕获方法基于异常捕获事件执行异常捕获。

本实施例提供一种电子设备,包括:

存储器,用于信息存储;

处理器,与所述存储器连接,用于通过执行存储在所述存储器上的计算机可执行指令,实现前述一个或多个技术方案提供的方法。

存储器可以是易失性存储器或非易失性存储器,也可包括易失性和非易失性存储器两者。其中,非易失性存储器可以是只读存储器(readonlymemory,rom)、可编程只读存储器(programmableread-onlymemory,prom)、可擦除可编程只读存储器(erasableprogrammableread-onlymemory,eprom)、电可擦除可编程只读存储器(electricallyerasableprogrammableread-onlymemory,eeprom)、磁性随机存取存储器(ferromagneticrandomaccessmemory,fram)、快闪存储器(flashmemory)、磁表面存储器、光盘、或只读光盘(cd-rom,compactdiscread-onlymemory);磁表面存储器可以是磁盘存储器或磁带存储器。易失性存储器可以是随机存取存储器(randomaccessmemory,ram),其用作外部高速缓存。通过示例性但不是限制性说明,许多形式的ram可用,例如静态随机存取存储器(staticrandomaccessmemory,sram)、同步静态随机存取存储器(synchronousstaticrandomaccessmemory,ssram)、动态随机存取存储器(dynamicrandomaccessmemory,dram)、同步动态随机存取存储器(synchronousdynamicrandomaccessmemory,sdram)、双倍数据速率同步动态随机存取存储器(doubledataratesynchronousdynamicrandomaccessmemory,ddrsdram)、增强型同步动态随机存取存储器(enhancedsynchronousdynamicrandomaccessmemory,esdram)、同步连接动态随机存取存储器(synclinkdynamicrandomaccessmemory,sldram)、直接内存总线随机存取存储器(directrambusrandomaccessmemory,drram)。本发明实施例描述的存储器旨在包括但不限于这些和任意其它适合类型的存储器。

所述处理器可为中央处理器、微处理器、数字信号处理器、可编程阵列或专用集成电路等。

在一些实施例中,所述电子设备还可包括通信接口,该通信接口可与处理器连接,该通信接口可包括:与外围设备连接外设设备接口或网络进行连接的网络接口。通信接口为处理器与外围接口模块之间的信息交互提供接口,上述外围接口模块可以是键盘、鼠标、轨迹球、点击轮、按键、按钮等。这些按钮可包括但不限于:主页按钮、音量按钮、启动按钮和锁定按钮。

处理器可以通过集成电路总线等电子设备内的总线接口与存储器或通信接口等连接。

本实施例提供的电子设备可为手机、平板电脑、可穿戴式设备、虚拟现实设备或增强现实设备等各种移动设备或固定设备。

本实施例还提供一种计算机存储介质,所述计算机存储介质存储有计算机可执行指令;所述计算机可执行指令被执行后能够前述任意一个实施例提供的方法,例如,图1和/或图4所示的方法。

该计算机存储介质可为光盘、移动硬盘、软盘、u盘、随机存储器、只读存储器等各种存储介质,可选为非瞬间存储介质。

以下结合上述任意实施例提供几个具体示例:

示例1:

如图4所示,本示例提供一种应用程序的异常检测方法,可包括:

应用程序启动时,创建第一线程组,该新建立的第一线程组可与应用程序的主函数所在的主线程组的类型相同等;

利用覆写机制在第一线程组内创建第一异常处理方法;例如,覆写主线程组的异常处理方法,获得所述第一异常处理方法;

在第一线程组内添加预先设定的第三异常处理方法,或从网络服务器下载第三异常处理方法;

利用反射机制根据第二线程组的属性设置第一线程组的属性;

利用第二线程组监控操作系统(例如,系统线程组)提供的异常捕获事件,并在监控到异常捕获事件时,进行线程组级别的异常捕获等异常处理。

示例2:

本示例先提供几个相关术语的描述,具体如下:

线程组包括:多个线程,可以统一对其中的线程进行统一管理。

在java的多线程处理中有线程组(threadgroup)的概念,threadgroup是为了方便线程管理,可以统一设定线程组的一些属性,比如,属性(setdaemon),设置未处理异常的处理方法,设置统一的安全策略等等;也可以通过线程组方便的获得线程的一些信息。

每一个threadgroup都可以包含一组的子线程和一组子线程组,在一个进程中线程组是以树形的方式存在,通常情况下根线程组是system线程组。系统(system)线程组下是主(main)线程组,默认情况下第一级应用自己的线程组是通过main线程组创建出来的。系统线程组可以将异常捕获事件告知主线程组,此处的主线程组可为前述的第二线程组。

java反射机制:

java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。

java反射机制可为:在程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言。反射机制,可为用在java身上指的是我们可以于运行时加载、探知、使用编译期间完全未知的类(classes)。换句话说,java程序可以加载一个运行时才得知名称的类(class),获悉其完整构造(但不包括方法定义),并生成其对象实体、或对其域(fields)设值、或唤起其方法。

1、创建新的线程组,即前述的第一线程组;

在应用程序启动后,创建一个新的线程组(threadgroup)对象,并覆写该对象所属类中的默认异常捕获方法,在异常捕获方法中实现具体的异常处理逻辑。

java提供了threadgroup类来控制一个线程组。一个线程组可以通过线程对象来创建,也可以由其他线程组来创建,生成一个树形结构的线程。

在创建新的线程组后,通过java的覆写机制(override),将原异常捕获方法覆写为具有自定义逻辑的方法。在进行覆写时,java应用程序会新建一个类,去继承默认异常捕获方法(对应于前述第一异常处理方法)的类,然后在新建的类中实现自定义逻辑方法(对应于前述第三异常处理方法),方法名字跟原来的默认异常捕获方法相同。

在安卓系统中,会根据方法名来调用方法,在原有的处理逻辑中,当线程出现异常后,会通过方法名调用线程组中的异常捕获方法来进行异常处理,本提案中,由于将默认异常捕获方法覆写为自定义逻辑的方法,因此在出现异常逻辑后,会根据方法名,调用自定义逻辑的方法,来进行异常处理。

此处,以热修复回退为例:对热修复功能的回退处理方法(在对应用程序进行热修复后,如果修复后的程序在运行时会崩溃,那么通过本方法,在应用程序异常后,会调用对热修复功能的回退处理方法,对热修复补丁进行卸载,以保证应用程序的正常运行。这样可以在线程组捕获热修复过程中出现的异常后,对热修复功能进行回退处理)。

在一些情况下,所述异常处理方法还可包括:将异常信息以日志的形式保存的方法;和/或,将异常信息上传至服务器平台的方法。

线程组属性的复用

通过java反射机制来获取app主线程所在的主线程组对象,为了不影响主线程所在线程组的原有功能(在java中,线程组和现场之间的交互是根据线程组属性来进行的,如果不复用原有线程组属性,将导致主线程所属线程组的名称发生变化,以及原有线程组包含的其他线程丢失等等,导致应用程序运行异常),通过安卓反射功能,获取主线程所属线程组的所有属性,并将获取的属性赋值给新建的线程组对象,从而实现复用主线程的线程组信息。该线程组信息比如可以是:线程组名称、线程组包含的线程信息、是否为后台程序线程组等。

线程组替换,包括:以安卓系统为例进行说明,由于安卓将线程的线程组属性设置为私有,因此无法通过正常途径获取主线程的线程组对象,将app主线程的线程组,通过安卓反射功能,获取主线程的线程组引用后,将其指向为已复用原线程组信息的新线程组,从而实现主线程的线程组替换,从而使新线程组中具备自定义逻辑的方法(比如,处理热修复异常回退逻辑的异常处理方法),实现异常捕获能力。

崩溃异常捕获及处理,包括:当app发生崩溃事件后,异常信息首先会

传递至发生崩溃的线程所在的线程组,本方案通过将主线程原来只有默

认异常处理逻辑的线程组对象,替换为具有实际需要的异常处理逻辑的

线程组对象,进行异常事件捕获,并将异常信息上报至异常管理平台。

通过本提案的方法,除了能捕获主线程的异常外,能否通过类似的方法捕获应用程序其它线程的异常,只要通过本方法替换待捕获异常的线程所属的线程组即可。

异常捕获事件传递第一层级是线程组级别的异常捕获,第二层级是线程级别的异常捕获,异常的传递是从第一层传递至第二层。目前通用的异常捕获方案都是针对第二层级,如果有一个异常捕获程序在第二层级进行异常捕获,且捕获异常后,不将异常传递给其他异常捕获程序,那其他异常处理程序将无法捕获异常,而本方案的异常捕获机制是第一层级,在第一层级即可完成异常捕获,并且也可将异常捕获传递给第二层级,此时如果有异常程序在第二层级进行异常捕获且不进行异常传递,也不影响本方案的异常捕获。

通过将线程的线程组替换为自定义的具有异常捕获及处理逻辑的线程组,来实现异常捕获。不存在相关异常捕获方案中存在的异常捕获被互相覆盖的情况。

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

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

另外,在本发明各实施例中的各功能单元可以全部集成在一个处理模块中,也可以是各单元分别单独作为一个单元,也可以两个或两个以上单元集成在一个单元中;上述集成的单元既可以采用硬件的形式实现,也可以采用硬件加软件功能单元的形式实现。

本领域普通技术人员可以理解:实现上述方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成,前述的程序可以存储于一计算机可读取存储介质中,该程序在执行时,执行包括上述方法实施例的步骤;而前述的存储介质包括:移动存储设备、只读存储器(read-onlymemory,rom)、随机存取存储器(randomaccessmemory,ram)、磁碟或者光盘等各种可以存储程序代码的介质。

以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应以所述权利要求的保护范围为准。

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

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

另外,在本发明各实施例中的各功能单元可以全部集成在一个处理模块中,也可以是各单元分别单独作为一个单元,也可以两个或两个以上单元集成在一个单元中;上述集成的单元既可以采用硬件的形式实现,也可以采用硬件加软件功能单元的形式实现。

本领域普通技术人员可以理解:实现上述方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成,前述的程序可以存储于一计算机可读取存储介质中,该程序在执行时,执行包括上述方法实施例的步骤;而前述的存储介质包括:移动存储设备、只读存储器(read-onlymemory,rom)、随机存取存储器(randomaccessmemory,ram)、磁碟或者光盘等各种可以存储程序代码的介质。

以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应以所述权利要求的保护范围为准。

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