CN113986622A - Sdk异常的自检方法、装置、介质和计算设备 - Google Patents
Sdk异常的自检方法、装置、介质和计算设备 Download PDFInfo
- Publication number
- CN113986622A CN113986622A CN202111183908.7A CN202111183908A CN113986622A CN 113986622 A CN113986622 A CN 113986622A CN 202111183908 A CN202111183908 A CN 202111183908A CN 113986622 A CN113986622 A CN 113986622A
- Authority
- CN
- China
- Prior art keywords
- exception
- sdk
- local
- function
- host program
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/07—Responding to the occurrence of a fault, e.g. fault tolerance
- G06F11/16—Error detection or correction of the data by redundancy in hardware
- G06F11/1658—Data re-synchronization of a redundant component, or initial sync of replacement, additional or spare unit
Abstract
本公开的实施方式提供了一种SDK异常的自检方法、装置、介质和计算设备。该方法应用于SDK,包括:响应于宿主程序的调用,在SDK初始化成功后,记录宿主程序当前使用的对应于宿主程序的全局异常处理器;将宿主程序当前使用的异常处理器设置为对应于SDK的局部异常处理器;局部异常处理器配置有用于进行异常处理的局部异常处理策略;在SDK被宿主程序调用而运行的过程中,响应于宿主程序运行异常,调用局部异常处理器的局部异常处理策略进行异常处理。本公开可以使得SDK无需依赖宿主程序而自行异常处理,从而增强SDK异常检测及处理的时效性和全面性。
Description
技术领域
本公开的实施方式涉及计算机技术领域,更具体地,本公开的实施方式涉及SDK异常的自检方法、装置、介质和计算设备。
背景技术
本部分旨在为权利要求书中陈述的本公开的实施方式提供背景或上下文。此处的描述不因为包括在本部分中就承认是现有技术。
SDK(Software Development Kit,软件开发工具包)是进行各类应用程序和小程序开发的常用工具,它能够向调用SDK的宿主程序提供已封装完成的功能模块。
在SDK被宿主程序调用而运行的过程中,所述SDK可能出现崩溃、无响应等异常状况,获取由SDK造成的宿主程序运行异常时的异常信息可以帮助SDK的提供方对SDK进行修正和完善。
发明内容
但是,相关技术中,SDK提供方对于与SDK相关的异常信息的获取大多依赖于宿主程序提供方的中转,存在着时效性差且信息不全面的问题。
为此,非常需要一种改进的SDK异常的自检方法,可以使SDK不依赖于宿主程序而自行异常处理,从而增强SDK异常检测及处理的时效性和全面性。
在本上下文中,本公开的实施方式期望提供一种SDK异常的自检方法、装置、介质和计算设备。
在本公开实施方式的第一方面中,提供了一种SDK异常的自检方法,应用于SDK,所述SDK安装于宿主程序中并受所述宿主程序调用;所述方法包括:
响应于宿主程序的调用,在SDK初始化成功后,记录所述宿主程序当前使用的对应于所述宿主程序的全局异常处理器;
将所述宿主程序当前使用的异常处理器设置为对应于所述SDK的局部异常处理器;所述局部异常处理器配置有用于进行异常处理的局部异常处理策略;
在所述SDK被所述宿主程序调用而运行的过程中,响应于所述宿主程序运行异常,调用所述局部异常处理器的所述局部异常处理策略进行异常处理。
可选地,所述方法还包括:
在所述宿主程序运行无异常的情况下,响应于所述宿主程序对所述SDK调用的结束,将当前使用的异常处理器还原为已记录的所述全局异常处理器。
可选地,所述调用所述局部异常处理器的所述局部异常处理策略进行异常处理,包括:
采集所述宿主程序运行异常时的异常信息并对所述异常信息进行分析;
响应于分析结果为所述宿主程序运行异常由所述SDK造成,将所述异常信息以及所述分析结果上报至所述SDK的提供方。
可选地,所述全局异常处理器配置有用于进行异常处理的全局异常处理策略;
所述调用所述局部异常处理器的所述局部异常处理策略进行异常处理,还包括:
在将所述异常信息以及所述分析结果上报至所述SDK的提供方后,确定已记录的所述全局异常处理器是否为空;
响应于已记录的所述全局异常处理器非空,调用所述全局异常处理器的全局异常处理策略再次进行异常处理。
可选地,所述宿主程序为Android应用程序;
所述记录所述宿主程序当前使用的对应于所述宿主程序的全局异常处理器,包括:
调用Java层的getDefaultUncaughtExceptionHandler函数获取所述Android应用程序当前使用的全局未捕获异常处理器,并记录所述全局未捕获异常处理器;所述全局未捕获异常处理器对应于所述Android应用程序,为UncaughtExceptionHandler接口的一个实现类;
所述将所述宿主程序当前使用的异常处理器设置为对应于所述SDK的局部异常处理器,包括:
调用Java层的setDefaultUncaughtExceptionHandler函数将所述Android应用程序当前使用的未捕获异常处理器设置为局部未捕获异常处理器;所述局部未捕获异常处理器对应于所述SDK,为所述UncaughtExceptionHandler接口的另一实现类且配置有用于进行Java层异常处理的uncaughtException函数;
所述响应于所述宿主程序运行异常,调用所述局部异常处理器的所述局部异常处理策略进行异常处理,包括:
响应于所述Android应用程序在Java层运行异常,调用所述局部未捕获异常处理器的uncaughtException函数进行Java层异常处理。
可选地,所述方法还包括:
在所述Android应用程序运行无异常的情况下,响应于所述Android应用程序对所述SDK调用的结束,调用Java层的setDefaultUncaughtExceptionHandler函数将当前使用的未捕获异常处理器还原为已记录的对应于所述Android应用程序的全局未捕获异常处理器。
可选地,所述调用所述局部未捕获异常处理器的uncaughtException函数进行Java层异常处理,包括:
基于所述Android应用程序运行异常时抛出的Java层异常参数,采集所述Android应用程序的Java层异常堆栈信息;
将所述Java层异常堆栈信息中包含的Java层异常标识符和预先设置的与所述SDK相关的Java层标识符进行匹配;所述Java层异常标识符为所述Android应用程序在Java层运行异常时执行的标识符;
响应于所述Java层异常标识符和任一与所述SDK相关的Java层标识符匹配,确定所述Android应用程序在Java层运行异常由所述SDK造成,将所述Java层异常堆栈信息以及匹配结果上报至所述SDK的提供方。
可选地,所述全局未捕获异常处理器配置有用于进行Java层异常处理的uncaughtException函数;
所述调用所述局部未捕获异常处理器的uncaughtException函数进行Java层异常处理,还包括:
将所述Java层异常堆栈信息以及匹配结果上报至所述SDK的提供方后,确定所述全局未捕获异常处理器是否为空;
响应于所述全局未捕获异常处理器非空,基于所述Java层异常参数调用所述全局未捕获异常处理器的uncaughtException函数再次进行Java层异常处理。
可选地,所述调用所述全局未捕获异常处理器的uncaughtException函数再次进行Java层异常处理,包括:
基于所述Java层异常参数,采集所述Android应用程序的Java层异常堆栈信息,并将所述Java层异常堆栈信息上报至所述Android应用程序的提供方。
可选地,所述Android应用程序在Java层运行异常,包括:
所述Android应用程序在运行的过程中,在Java层发生ArrayIndexOutOfBoundsException数组下标越界异常、NullPointerException空指针异常、ClassCastException强制类型转换异常、FileNotFoundException文件查询异常以及OutOfMemoryError内存移除异常中的任一项;
或,所述Android应用程序调用的任一SDK在运行的过程中,在Java层发生ArrayIndexOutOfBoundsException数组下标越界异常、NullPointerException空指针异常、ClassCastException强制类型转换异常、FileNotFoundException文件查询异常以及OutOfMemoryError内存移除异常中的任一项。
可选地,响应于宿主程序的调用,在SDK初始化成功后,所述方法还包括:
针对预先设置的异常信号集合中的每个异常信号,调用Native层的sigaction函数将当前用于处理所述异常信号的信号处理函数设置为所述SDK用于处理所述异常信号的局部信号处理函数act,并记录所述Android应用程序用于处理所述异常信号的全局信号处理函数old act;
在所述SDK被所述宿主程序调用而运行的过程中,所述方法还包括:
响应于所述Android应用程序在Native层运行异常并触发异常信号集合中的任一异常信号,调用所述SDK用于处理所述异常信号的局部信号处理函数act对所述异常信号进行Native层异常处理,并调用所述Android应用程序用于处理所述异常信号的全局信号处理函数old act对所述异常信号再次进行Native层异常处理。
可选地,所述方法还包括:
在所述Android应用程序运行无异常的情况下,响应于所述Android应用程序对所述SDK调用的结束,针对所述异常信号集合中的每个异常信号,调用Native层的sigaction函数将当前用于处理所述异常信号的信号处理函数还原为已记录的所述Android应用程序用于处理所述异常信号的全局信号处理函数old act。
可选地,所述调用所述SDK用于处理所述异常信号的局部信号处理函数act对所述异常信号进行Native层异常处理,包括:
基于所述宿主程序运行异常时传入的Native层异常参数,采集所述Android应用程序的Native层异常堆栈信息;
将所述Native层异常堆栈信息中包含的Native层异常标识符和预先设置的与所述SDK相关的Native层标识符进行匹配;所述Native层异常标识符为所述Android应用程序在Native层运行异常时执行的标识符;
响应于所述Native层异常标识符和任一与所述SDK相关的Native层标识符匹配,确定所述Android应用程序在Native层运行异常由所述SDK造成,将所述Native层异常堆栈信息以及匹配结果上报至所述SDK的提供方。
可选地,所述Android应用程序在Native层运行异常并触发异常信号集合中的异常信号,包括:
所述Android应用程序在运行的过程中,在Native层发生执行无效的内存引用指令触发SIGSEGV信号、执行非法的硬件调用指令触发SIGBUS信号、执行非法的系统调用指令触发SIGSYS信号、执行断点指令或陷阱指令触发SIGTRAP信号、执行致命的算术运算触发SIGFPE信号以及调用Abort函数触发SIGABRT信号中的任一情况;
或,所述Android应用程序调用的任一SDK在运行的过程中,在Native层发生执行无效的内存引用指令触发SIGSEGV信号、执行非法的硬件调用指令触发SIGBUS信号、执行非法的系统调用指令触发SIGSYS信号、执行断点指令或陷阱指令触发SIGTRAP信号、执行致命的算术运算触发SIGFPE信号以及调用Abort函数触发SIGABRT信号中的任一情况。
可选地,所述宿主程序为IOS应用程序;
所述记录所述宿主程序当前使用的对应于所述宿主程序的全局异常处理器,包括:
调用NSGetUncaughtExceptionHandler函数获取所述IOS应用程序当前使用的全局未捕获异常处理函数,并记录所述全局未捕获异常处理函数;所述全局未捕获异常处理函数对应于所述IOS应用程序;
所述将所述宿主程序当前使用的异常处理器设置为对应于所述SDK的局部异常处理器,包括:
调用NSSetUncaughtExceptionHandler函数将所述IOS应用程序当前使用的未捕获异常处理函数设置为局部未捕获异常处理函数;所述局部未捕获异常处理函数对应于所述SDK;
所述调用所述局部异常处理器的所述局部异常处理策略进行异常处理,包括:
调用对应于所述SDK的局部未捕获异常处理函数进行异常处理。
可选地,所述方法还包括:
在所述IOS应用程序运行无异常的情况下,响应于所述IOS应用程序对所述SDK调用的结束,调用NSSetUncaughtExceptionHandler函数将当前使用的未捕获异常处理函数还原为已记录的对应于所述IOS应用程序的全局未捕获异常处理函数。
可选地,所述调用对应于所述SDK的局部未捕获异常处理函数进行异常处理,包括:
基于所述IOS应用程序运行异常时抛出的异常参数,采集所述IOS应用程序的异常堆栈信息;
将所述异常堆栈信息中包含的异常标识符与预先设置的与所述SDK相关的标识符进行匹配;所述异常标识符为所述IOS应用程序在运行异常时执行的标识符;
响应于所述异常标识符和任一与所述SDK相关的标识符匹配,确定所述IOS应用程序运行异常由所述SDK造成,将所述异常堆栈信息以及匹配结果上报至所述SDK的提供方。
可选地,所述宿主程序为小程序;
所述记录所述宿主程序当前使用的对应于所述宿主程序的全局异常处理器,包括:
调用GetApp函数获取所述小程序当前使用的对应于所述小程序的OnError函数,并记录对应于所述小程序的OnError函数;
所述将所述宿主程序当前使用的异常处理器设置为对应于所述SDK的局部异常处理器,包括:
将所述小程序当前使用的OnError函数设置为对应于所述SDK的OnError函数;
所述调用所述局部异常处理器的所述局部异常处理策略进行异常处理,包括:
调用对应于所述SDK的OnError函数进行异常处理。
可选地,所述方法还包括:
在所述小程序运行无异常的情况下,响应于所述小程序对所述SDK调用的结束,将当前使用的OnError函数还原为已记录的对应于所述小程序的OnError函数。
可选地,所述调用对应于所述SDK的OnError函数进行异常处理,包括:
采集所述小程序的异常堆栈信息;
将所述异常堆栈信息中包含的异常标识符和预先设置的与所述SDK相关的标识符进行匹配;所述异常标识符为所述小程序在运行异常时执行的标识符;
响应于所述异常标识符和任一与所述SDK相关的标识符匹配,确定所述小程序运行异常由所述SDK造成,将所述异常堆栈信息以及匹配结果上报至所述SDK的提供方。
在本公开实施方式的第二方面中,提供了一种SDK异常的自检装置,应用于SDK,所述SDK安装于宿主程序中并受所述宿主程序调用;所述装置包括:
记录单元,响应于宿主程序的调用,在SDK初始化成功后,记录所述宿主程序当前使用的对应于所述宿主程序的全局异常处理器;
设置单元,将所述宿主程序当前使用的异常处理器设置为对应于所述SDK的局部异常处理器;所述局部异常处理器配置有用于进行异常处理的局部异常处理策略;
处理单元,在所述SDK被所述宿主程序调用而运行的过程中,响应于所述宿主程序运行异常,调用所述局部异常处理器的所述局部异常处理策略进行异常处理。
可选地,所述装置还包括:
还原单元,在所述宿主程序运行无异常的情况下,响应于所述宿主程序对所述SDK调用的结束,将当前使用的异常处理器还原为已记录的所述全局异常处理器。
可选地,所述处理单元,在调用所述局部异常处理器的所述局部异常处理策略进行异常处理时,具体用于:
采集所述宿主程序运行异常时的异常信息并对所述异常信息进行分析;
响应于分析结果为所述宿主程序运行异常由所述SDK造成,将所述异常信息以及所述分析结果上报至所述SDK的提供方。
可选地,所述全局异常处理器配置有用于进行异常处理的全局异常处理策略;
所述处理单元,在调用所述局部异常处理器的所述局部异常处理策略进行异常处理时,还用于:
在将所述异常信息以及所述分析结果上报至所述SDK的提供方后,确定已记录的所述全局异常处理器是否为空;
响应于已记录的所述全局异常处理器非空,调用所述全局异常处理器的全局异常处理策略再次进行异常处理。
可选地,所述宿主程序为Android应用程序;
所述记录单元,在记录所述宿主程序当前使用的对应于所述宿主程序的全局异常处理器时,具体用于:
调用Java层的getDefaultUncaughtExceptionHandler函数获取所述Android应用程序当前使用的全局未捕获异常处理器,并记录所述全局未捕获异常处理器;所述全局未捕获异常处理器对应于所述Android应用程序,为UncaughtExceptionHandler接口的一个实现类;
所述设置单元,在将所述宿主程序当前使用的异常处理器设置为对应于所述SDK的局部异常处理器时,具体用于:
调用Java层的setDefaultUncaughtExceptionHandler函数将所述Android应用程序当前使用的未捕获异常处理器设置为局部未捕获异常处理器;所述局部未捕获异常处理器对应于所述SDK,为所述UncaughtExceptionHandler接口的另一实现类且配置有用于进行Java层异常处理的uncaughtException函数;
所述处理单元,在响应于所述宿主程序运行异常,调用所述局部异常处理器的所述局部异常处理策略进行异常处理时,具体用于:
响应于所述Android应用程序在Java层运行异常,调用所述局部未捕获异常处理器的uncaughtException函数进行Java层异常处理。
可选地,所述装置还包括:
还原单元,在所述Android应用程序运行无异常的情况下,响应于所述Android应用程序对所述SDK调用的结束,调用Java层的setDefaultUncaughtExceptionHandler函数将当前使用的未捕获异常处理器还原为已记录的对应于所述Android应用程序的全局未捕获异常处理器。
可选地,所述处理单元,在调用所述局部未捕获异常处理器的uncaughtException函数进行Java层异常处理时,具体用于:
基于所述Android应用程序运行异常时抛出的Java层异常参数,采集所述Android应用程序的Java层异常堆栈信息;
将所述Java层异常堆栈信息中包含的Java层异常标识符和预先设置的与所述SDK相关的Java层标识符进行匹配;所述Java层异常标识符为所述Android应用程序在Java层运行异常时执行的标识符;
响应于所述Java层异常标识符和任一与所述SDK相关的Java层标识符匹配,确定所述Android应用程序在Java层运行异常由所述SDK造成,将所述Java层异常堆栈信息以及匹配结果上报至所述SDK的提供方。
可选地,所述全局未捕获异常处理器配置有用于进行Java层异常处理的uncaughtException函数;
所述处理单元,在调用所述局部未捕获异常处理器的uncaughtException函数进行Java层异常处理时,还用于:
将所述Java层异常堆栈信息以及匹配结果上报至所述SDK的提供方后,确定所述全局未捕获异常处理器是否为空;
响应于所述全局未捕获异常处理器非空,基于所述Java层异常参数调用所述全局未捕获异常处理器的uncaughtException函数再次进行Java层异常处理。
可选地,所述处理单元,在调用所述全局未捕获异常处理器的uncaughtException函数再次进行Java层异常处理,具体用于:
基于所述Java层异常参数,采集所述Android应用程序的Java层异常堆栈信息,并将所述Java层异常堆栈信息上报至所述Android应用程序的提供方。
可选地,所述Android应用程序在Java层运行异常,包括:
所述Android应用程序在运行的过程中,在Java层发生ArrayIndexOutOfBoundsException数组下标越界异常、NullPointerException空指针异常、ClassCastException强制类型转换异常、FileNotFoundException文件查询异常以及OutOfMemoryError内存移除异常中的任一项;
或,所述Android应用程序调用的任一SDK在运行的过程中,在Java层发生ArrayIndexOutOfBoundsException数组下标越界异常、NullPointerException空指针异常、ClassCastException强制类型转换异常、FileNotFoundException文件查询异常以及OutOfMemoryError内存移除异常中的任一项。
可选地,所述设置单元,响应于宿主程序的调用,在SDK初始化成功后,还用于:
针对预先设置的异常信号集合中的每个异常信号,调用Native层的sigaction函数将当前用于处理所述异常信号的信号处理函数设置为所述SDK用于处理所述异常信号的局部信号处理函数act;
所述记录单元,响应于宿主程序的调用,在SDK初始化成功后,还用于:
记录所述Android应用程序用于处理所述异常信号的全局信号处理函数old act;
所述处理单元,在所述SDK被所述宿主程序调用而运行的过程中,还用于:
响应于所述Android应用程序在Native层运行异常并触发异常信号集合中的任一异常信号,调用所述SDK用于处理所述异常信号的局部信号处理函数act对所述异常信号进行Native层异常处理,并调用所述Android应用程序用于处理所述异常信号的全局信号处理函数old act对所述异常信号再次进行Native层异常处理。
可选地,所述装置还包括:
还原单元,在所述Android应用程序运行无异常的情况下,响应于所述Android应用程序对所述SDK调用的结束,针对所述异常信号集合中的每个异常信号,调用Native层的sigaction函数将当前用于处理所述异常信号的信号处理函数还原为已记录的所述Android应用程序用于处理所述异常信号的全局信号处理函数old act。
可选地,所述处理单元,在调用所述SDK用于处理所述异常信号的局部信号处理函数act对所述异常信号进行Native层异常处理时,具体用于:
基于所述宿主程序运行异常时传入的Native层异常参数,采集所述Android应用程序的Native层异常堆栈信息;
将所述Native层异常堆栈信息中包含的Native层异常标识符和预先设置的与所述SDK相关的Native层标识符进行匹配;所述Native层异常标识符为所述Android应用程序在Native层运行异常时执行的标识符;
响应于所述Native层异常标识符和任一与所述SDK相关的Native层标识符匹配,确定所述Android应用程序在Native层运行异常由所述SDK造成,将所述Native层异常堆栈信息以及匹配结果上报至所述SDK的提供方。
可选地,所述Android应用程序在Native层运行异常并触发异常信号集合中的异常信号,包括:
所述Android应用程序在运行的过程中,在Native层发生执行无效的内存引用指令触发SIGSEGV信号、执行非法的硬件调用指令触发SIGBUS信号、执行非法的系统调用指令触发SIGSYS信号、执行断点指令或陷阱指令触发SIGTRAP信号、执行致命的算术运算触发SIGFPE信号以及调用Abort函数触发SIGABRT信号中的任一情况;
或,所述Android应用程序调用的任一SDK在运行的过程中,在Native层发生执行无效的内存引用指令触发SIGSEGV信号、执行非法的硬件调用指令触发SIGBUS信号、执行非法的系统调用指令触发SIGSYS信号、执行断点指令或陷阱指令触发SIGTRAP信号、执行致命的算术运算触发SIGFPE信号以及调用Abort函数触发SIGABRT信号中的任一情况。
可选地,所述宿主程序为IOS应用程序;
所述记录单元,在记录所述宿主程序当前使用的对应于所述宿主程序的全局异常处理器时,具体用于:
调用NSGetUncaughtExceptionHandler函数获取所述IOS应用程序当前使用的全局未捕获异常处理函数,并记录所述全局未捕获异常处理函数;所述全局未捕获异常处理函数对应于所述IOS应用程序;
所述设置单元,在将所述宿主程序当前使用的异常处理器设置为对应于所述SDK的局部异常处理器,具体用于:
调用NSSetUncaughtExceptionHandler函数将所述IOS应用程序当前使用的未捕获异常处理函数设置为局部未捕获异常处理函数;所述局部未捕获异常处理函数对应于所述SDK;
所述处理单元,在调用所述局部异常处理器的所述局部异常处理策略进行异常处理时,具体用于:
调用对应于所述SDK的局部未捕获异常处理函数进行异常处理。
可选地,所述装置还包括:
还原单元,在所述IOS应用程序运行无异常的情况下,响应于所述IOS应用程序对所述SDK调用的结束,调用NSSetUncaughtExceptionHandler函数将当前使用的未捕获异常处理函数还原为已记录的对应于所述IOS应用程序的全局未捕获异常处理函数。
可选地,所述处理单元,在调用对应于所述SDK的局部未捕获异常处理函数进行异常处理时,具体用于:
基于所述IOS应用程序运行异常时抛出的异常参数,采集所述IOS应用程序的异常堆栈信息;
将所述异常堆栈信息中包含的异常标识符与预先设置的与所述SDK相关的标识符进行匹配;所述异常标识符为所述IOS应用程序在运行异常时执行的标识符;
响应于所述异常标识符和任一与所述SDK相关的标识符匹配,确定所述IOS应用程序运行异常由所述SDK造成,将所述异常堆栈信息以及匹配结果上报至所述SDK的提供方。
可选地,所述宿主程序为小程序;
所述记录单元,在记录所述宿主程序当前使用的对应于所述宿主程序的全局异常处理器时,具体用于:
调用GetApp函数获取所述小程序当前使用的对应于所述小程序的OnError函数,并记录对应于所述小程序的OnError函数;
所述设置单元,在将所述宿主程序当前使用的异常处理器设置为对应于所述SDK的局部异常处理器时,具体用于:
将所述小程序当前使用的OnError函数设置为对应于所述SDK的OnError函数;
所述处理单元,在调用所述局部异常处理器的所述局部异常处理策略进行异常处理时,具体用于:
调用对应于所述SDK的OnError函数进行异常处理。
可选地,所述装置还包括:
还原单元,在所述小程序运行无异常的情况下,响应于所述小程序对所述SDK调用的结束,将当前使用的OnError函数还原为已记录的对应于所述小程序的OnError函数。
可选地,所述处理单元,在调用对应于所述SDK的OnError函数进行异常处理时,具体用于:
采集所述小程序的异常堆栈信息;
将所述异常堆栈信息中包含的异常标识符和预先设置的与所述SDK相关的标识符进行匹配;所述异常标识符为所述小程序在运行异常时执行的标识符;
响应于所述异常标识符和任一与所述SDK相关的标识符匹配,确定所述小程序运行异常由所述SDK造成,将所述异常堆栈信息以及匹配结果上报至所述SDK的提供方。
在本公开实施方式的第三方面中,提供了一种介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现上述任一SDK异常的自检方法。
在本公开实施方式的第四方面中,提供了一种计算设备,包括:
处理器;
用于存储所述处理器可执行程序的存储器;
其中,所述处理器通过运行所述可执行程序实现上述任一SDK异常的自检方法。
根据本公开实施方式的SDK异常的自检方法,安装于宿主程序中的所述SDK在受所述宿主程序调用并初始化成功后,记录所述宿主程序当前使用的对应于所述宿主程序的全局异常处理器,然后,将所述宿主程序当前使用的异常处理器设置为对应于所述SDK的局部异常处理器,所述局部异常处理器配置有局部异常处理策略,在被所述宿主程序调用而运行的过程中,响应于所述宿主程序运行异常,可以调用对应于所述SDK的局部异常处理器的局部异常处理策略进行异常处理。
本公开中,SDK在受宿主程序调用之初,将所述宿主程序使用的异常处理器重设为对应于所述SDK的局部异常处理器,故而在所述SDK运行的生命周期中,能够调用所述局部异常处理器的局部异常处理策略,对包括SDK异常在内的宿主程序运行异常进行处理。所述局部异常处理策略可由SDK提供方自行定义,所述SDK因而具备了自检能力,即使在宿主程序不执行异常检测的情况下SDK异常也能够得到处理,增强了SDK异常检测及处理的时效性和全面性。
附图说明
通过参考附图阅读下文的详细描述,本公开示例性实施方式的上述以及其他目的、特征和优点将变得易于理解。在附图中,以示例性而非限制性的方式示出了本公开的若干实施方式,其中:
图1示意性地示出了根据本公开实施方式的一种组网架构示意图;
图2示意性地示出了根据本公开实施方式的一种SDK异常的自检方法的流程图;
图3示意性地示出了根据本公开实施方式的一种SDK生命周期的示意图;
图4示意性地示出了根据本公开实施方式的一种宿主程序及SDK间生命周期关系的示意图;
图5示意性地示出了根据本公开一实施例的一种Android应用程序下SDK异常的自检方法的流程图;
图6示意性地示出了根据本公开另一实施例的一种Android应用程序下SDK异常的自检方法的流程图;
图7示意性地示出了根据本公开又一实施例的一种IOS应用程序下SDK异常的自检方法的流程图;
图8示意性地示出了根据本公开再一实施例的一种小程序下SDK异常的自检方法的流程图;
图9示意性地示出了根据本公开实施方式的一种SDK异常的自检装置的框图;
图10示意性地示出了根据本公开实施方式的一种介质的示意图;
图11示意性地示出了根据本公开实施方式的一种计算设备的示意图。
在附图中,相同或对应的标号表示相同或对应的部分。
具体实施方式
下面将参考若干示例性实施方式来描述本公开的原理和精神。应当理解,给出这些实施方式仅仅是为了使本领域技术人员能够更好地理解进而实现本公开,而并非以任何方式限制本公开的范围。相反,提供这些实施方式是为了使本公开更加透彻和完整,并且能够将本公开的范围完整地传达给本领域的技术人员。
本领域技术人员知道,本公开的实施方式可以实现为一种系统、装置、设备、方法或计算机程序产品。因此,本公开可以具体实现为以下形式,即:完全的硬件、完全的软件(包括固件、驻留软件、微代码等),或者硬件和软件结合的形式。
根据本公开的实施方式,提出了一种SDK异常的自检方法、装置、介质和计算设备。
在本文中,附图中的任何元素数量均用于示例而非限制,以及任何命名都仅用于区分,而不具有任何限制含义。
下面参考本公开的若干代表性实施方式,详细阐释本公开的原理和精神。
发明概述
SDK(Software Development Kit,软件开发工具包)是由SDK提供方开发以供应用程序(Application,APP)和小程序调用的功能模块,能够提高应用程序和小程序开发的效率和丰富性,常见的SDK包括支付SDK、地图SDK、第三方登录SDK等。
接入SDK的应用程序或小程序为所述SDK的宿主程序,通常,宿主程序的提供方与SDK的提供方是不同的两方。
开发完成的宿主程序运行在用户终端上,所述宿主程序可以对已安装的SDK进行调用,所述SDK存活于所述宿主程序的生命周期内。如果所述宿主程序调用的SDK由于存在逻辑错误等问题而发生崩溃或无响应,所述宿主程序将因运行异常而终止,在所述宿主程序的开发者为所述宿主程序设计有异常处理机制的情况下,响应于所述宿主程序运行异常,所述宿主程序可以采集运行异常时的异常信息并上报至所述宿主程序的提供方,以供其据此对所述宿主程序进行优化。
所述宿主程序的提供方可以定期与所接入SDK的提供方进行异常信息的交互,以供所述SDK的提供方对SDK进行修正和完善。但是,来自宿主程序提供方的异常信息往往时效性很低,并且只涉及所述宿主程序调用的SDK中的部分API,所述异常信息并不全面。此外,在所述宿主程序的开发者没有为所述宿主程序设计有异常处理机制的情况下,所述宿主程序不会进行异常信息的采集,所述SDK的提供方也将无法获取与SDK相关的异常信息,不能实现对SDK的修正和完善。
故而,相关技术中,依赖于宿主程序的SDK异常检测方法,将导致SDK的提供方所获取的与SDK相关的异常信息在时效性和全面性上无法得到保障。
有鉴于此,本公开提出一种SDK异常的自检方法,应用于SDK;安装于宿主程序中的所述SDK在受所述宿主程序调用并初始化成功后,记录所述宿主程序当前使用的对应于所述宿主程序的全局异常处理器,然后,将所述宿主程序当前使用的异常处理器设置为对应于所述SDK的局部异常处理器,所述局部异常处理器配置有局部异常处理策略,在被所述宿主程序调用而运行的过程中,响应于所述宿主程序运行异常,可以调用对应于所述SDK的局部异常处理器的局部异常处理策略进行异常处理。
本公开中,SDK在受宿主程序调用之初,将所述宿主程序使用的异常处理器重设为对应于所述SDK的局部异常处理器,故而在所述SDK运行的生命周期中,能够调用所述局部异常处理器的局部异常处理策略,对包括SDK异常在内的宿主程序运行异常进行处理。所述局部异常处理策略可由SDK提供方自行定义,所述SDK因而具备了自检能力,即使在宿主程序不执行异常检测的情况下SDK异常也能够得到处理,增强了SDK异常检测及处理的时效性和全面性。
在介绍了本公开的基本原理之后,下面具体介绍本公开的各种非限制性实施方式。
应用场景总览
SDK的提供方开发有SDK,宿主程序的提供方开发有宿主程序;所述宿主程序安装有所述SDK,并且可以在运行过程中对所述SDK发起调用;所述SDK安装于所述宿主程序中,受所述宿主程序调用而运行。
参考图1,SDK服务器为所述SDK的提供方用以交互信息的服务器,宿主服务器为所述宿主程序的提供方用以交互信息的服务器,用户终端上运行着安装有所述SDK的所述宿主程序;上述三者彼此间可以进行信息交互。
可以理解的是,所述SDK的提供方以及所述宿主程序的提供方也可以采用服务器之外的其他网络设备实现对外交互,运行着所述宿主程序的用户终端包括手机、个人电脑等智能电子设备。
示例性方法
下面结合图1的应用场景,参考图2-8来描述根据本公开示例性实施方式的SDK异常的自检方法。需要注意的是,上述应用场景仅是为了便于理解本公开的精神和原理而示出,本公开的实施方式在此方面不受任何限制。相反,本公开的实施方式可以应用于适用的任何场景。
参考图2,图2示意性地示出了根据本公开实施方式的一种SDK异常的自检方法的流程图。
所述SDK异常的自检方法可以应用于任一SDK,所述SDK安装于宿主程序中并受所述宿主程序调用;可以理解的是,所述SDK的提供方与所述宿主程序的提供方为不同的两方,而所述SDK具体为何种用途的SDK,以及所述宿主程序具体为Android应用程序、IOS应用程序或小程序,在本公开中不做具体限制。
所述SDK异常的自检方法,可以包括如下步骤:
步骤202,响应于宿主程序的调用,在SDK初始化成功后,记录所述宿主程序当前使用的对应于所述宿主程序的全局异常处理器。
运行在用户终端上的宿主程序,响应于特定的用户操作或调用条件,对SDK发起调用,以支付SDK为例,响应于用户点击支付图标的操作,所述支付SDK将被所述宿主程序调用而启动。所述SDK在受到所述宿主程序的调用后启动并进行初始化,初始化完毕后,可以对所述宿主程序当前使用的异常处理器进行记录,并将其记作全局异常处理器。
异常处理器可以为一种异常处理机制,宿主程序的异常处理器将对所述宿主程序运行的全线程进行异常检测和处理。
无论所述宿主程序是Android应用程序、IOS应用程序或小程序,所述宿主程序当前使用唯一的异常处理器,举例来说,所述宿主程序中可以存在异常处理器A、异常处理器B和异常处理器C,但所述宿主程序在一个时刻只能选用其中的一个异常处理器。
所述全局异常处理器对应于所述宿主程序,它由所述宿主程序的开发者加以设置,如果所述宿主程序的开发者没有为所述宿主程序设置异常处理器,则所述全局异常处理器为空。所述SDK在初始化完毕后对所述全局异常处理器进行记录,以使所述宿主程序当前使用的异常处理器被重新设置后,原有的对应于所述宿主程序的全局异常处理器在所述SDK的生命周期结束之时能够得到恢复,并使对应于所述SDK的局部异常处理器可以调用所述全局异常处理器的全局异常处理策略,详见后文。
步骤204,将所述宿主程序当前使用的异常处理器设置为对应于所述SDK的局部异常处理器;所述局部异常处理器配置有用于进行异常处理的局部异常处理策略。
所述SDK在记录对应于所述宿主程序的全局异常处理器后,将所述宿主程序当前使用的异常处理器由所述全局异常处理器更改设置为局部异常处理器,后续对所述宿主程序运行异常的检测及处理可以基于所述局部异常处理器进行。
所述局部异常处理器对应于所述SDK,它由所述SDK的开发者加以设置,配置有用于进行异常处理的局部异常处理策略。异常处理策略表征在宿主程序运行异常时执行的处理措施,所述局部异常处理策略可以由所述SDK的开发者根据所述SDK的实际需求进行自定义设置。
步骤206,在所述SDK被所述宿主程序调用而运行的过程中,响应于所述宿主程序运行异常,调用所述局部异常处理器的所述局部异常处理策略进行异常处理。
在所述SDK被所述宿主程序调用而运行的过程中,即,在所述SDK的生命周期内,响应于所述宿主程序运行的全线程中的任一线程运行异常,可以调用所述宿主程序当前使用的局部异常处理器所配置的局部异常处理策略进行异常处理。
本公开中,SDK在受宿主程序调用之初,将所述宿主程序使用的异常处理器重设为对应于所述SDK的局部异常处理器,故而在所述SDK运行的生命周期中,能够调用所述局部异常处理器的局部异常处理策略,对包括SDK异常在内的宿主程序运行异常进行处理。所述局部异常处理策略可由SDK提供方自行定义,所述SDK因而具备了自检能力,即使在宿主程序不执行异常检测的情况下SDK异常也能够得到处理,增强了SDK异常检测及处理的时效性和全面性。
在一种可选择的实现方式下,上述SDK异常的自检方法,还包括:
在所述宿主程序运行无异常的情况下,响应于所述宿主程序对所述SDK调用的结束,将当前使用的异常处理器还原为已记录的所述全局异常处理器。
如果在所述SDK的生命周期内,包括所述SDK在内的所述宿主程序运行的全线程均未发生异常,响应于所述宿主程序对所述SDK调用的结束,即,在所述SDK的生命周期结束之前,将所述宿主程序当前使用的异常处理器由所述局部异常处理还原为已记录的对应于所述宿主程序的全局异常处理。
参考图3,图3示意性地示出了根据本公开实施方式的一种SDK生命周期的示意图。
在SDK生命周期开始之时,所述SDK初始化成功后将宿主程序使用的异常处理器重设为局部异常处理器;从而使得在SDK生命周期中的任意时刻,一旦宿主程序运行异常即可调用所述局部异常处理器的局部异常处理策略进行检测及处理;如果在SDK生命周期中宿主程序运行无异常,则在SDK生命周期结束之时,所述SDK将宿主程序使用的异常处理器还原为全局异常处理器。
可以看出,本公开提供的SDK异常的自检方法是一种针对SDK全生命周期的异常检测及处理方法,所述局部异常处理器自所述SDK初始化成功后的生命周期的起点开始执行SDK异常自检,直至所述SDK因运行异常或调用结束而到达其生命周期的终点。
另外,在所述宿主程序对所述SDK的调用结束时进行全局异常处理器的还原,可以使得所述宿主程序结束对所述SDK的调用后,沿用所述宿主程序的开发者为所述宿主程序设置的全局异常处理进行异常处理,从而在非所述SDK运行的时段内不违背所述宿主程序进行异常处理的意志,降低对所述宿主程序原有异常处理机制的影响。
为了使本领域技术人员更好地理解本公开中SDK异常自检与宿主程序原有的异常处理机制之间的关系,下面结合SDK以及宿主程序的生命周期进行相关说明。
参考图4,图4示意性地示出了根据本公开实施方式的一种宿主程序及SDK间生命周期关系的示意图。
宿主程序的运行过程中,可以调用不同的SDK,所述SDK存活于所述宿主程序的生命周期内,即所述SDK的生命周期处于所述宿主程序的生命周期之中,所述宿主程序的生命周期包括SDK运行时段以及非SDK运行时段。
相关技术中,在宿主程序的生命周期内,始终采用宿主程序的异常处理机制对崩溃或无响应等异常加以处理。无论是SDK运行时段,还是非SDK运行时段,宿主程序运行的全线程均由对应于宿主程序的全局异常处理器进行异常检测及处理。
而本公开中,在宿主程序的生命周期内,非SDK运行时段采用宿主程序原有的异常处理机制,SDK运行时段则采用上述SDK异常自检的方法。换言之,在SDK的生命周期内,宿主程序运行的包括SDK在内的全线程将交由对应于SDK的局部异常处理器接管异常检测及处理任务,一旦宿主程序结束调用SDK,所述SDK的生命周期结束,则宿主程序运行的全线程的异常检测及处理任务可以重归对应于宿主程序的全局异常处理器承担。
因此,通过上述在SDK生命周期的始末重设和还原异常处理器的实现方式,本公开提供的SDK异常的自检方法不仅能够在SDK的全生命周期进行适应于SDK需求的异常检测及处理,并且能够避免对宿主程序原有的异常处理机制产生干扰,使得宿主程序生命周期内非SDK运行时段内的异常检测及处理不受影响。
在一种可能的情况下,所述宿主程序当前使用的异常处理器在所述SDK的生命周期内,可以为所述宿主程序或所述宿主程序调用的其他SDK重新设置,故而,在将所述宿主程序当前使用的异常处理器还原为所述全局异常处理器之前,还可以对所述宿主程序当前使用的异常处理器是否为对应于所述SDK的局部异常处理器进行判断,确定所述宿主程序当前使用的是所述局部异常处理器则进行还原,而确定所述宿主程序当前使用的并非所述局部异常处理器则不再进行还原。
在一种可选择的实现方式下,上述SDK异常的自检方法中,步骤206所述调用所述局部异常处理器的所述局部异常处理策略进行异常处理,包括:
采集所述宿主程序运行异常时的异常信息并对所述异常信息进行分析;
响应于分析结果为所述宿主程序运行异常由所述SDK造成,将所述异常信息以及所述分析结果上报至所述SDK的提供方。
在所述SDK的生命周期内,所述宿主程序运行异常可能由所述SDK造成,响应于所述宿主程序运行异常,所述局部异常处理器的局部异常处理策略将指示所述SDK对所述宿主程序运行异常时的异常信息进行采集,比较常见的,可以采集所述宿主程序的异常堆栈信息。
所述宿主程序使用的异常处理器对所述宿主程序运行的全线程进行异常检测及处理,响应于所述宿主程序运行异常,所述SDK可以采集所述宿主程序运行异常时的异常信息,并对所述宿主程序运行异常的原因进行分析,以确定所述宿主程序运行异常是否由所述SDK造成。举例来说,可以分析所述宿主程序运行异常时执行的相关代码,确定所述宿主程序运行异常的异常类型等。
如果分析确定所述宿主程序本次运行异常是由所述SDK造成,则可以将所述宿主程序本次运行异常的异常信息、以及所述宿主程序运行异常的原因分析过程和结果上报至所述SDK的提供方,即,所述用户终端可以及时地向所述SDK服务器转发与所述SDK相关的异常信息和分析结果。
进一步地,所述全局异常处理器配置有用于进行异常处理的全局异常处理策略。
上述SDK异常的自检方法中,步骤206所述调用所述局部异常处理器的所述局部异常处理策略进行异常处理,还包括:
在将所述异常信息以及所述分析结果上报至所述SDK的提供方后,确定已记录的所述全局异常处理器是否为空;
响应于已记录的所述全局异常处理器非空,调用所述全局异常处理器的全局异常处理策略再次进行异常处理。
所述全局异常处理策略可以由所述宿主程序的开发者根据所述宿主程序的实际需求进行自定义设置。为了降低由局部异常处理器替换全局异常处理器对所述宿主程序原有的异常处理机制的影响,所述局部异常处理器的局部异常处理策略中可以包含所述全局异常处理器的全局异常处理策略,基于步骤202中记录的所述全局异常处理器,在局部异常处理器的局部异常处理策略中调用所述全局异常处理器的全局异常处理策略。
另外,基于前述,考虑到所述宿主程序的开发者也可以不为所述宿主程序设置异常处理器,即,所述全局异常处理器可以为空,故而,在调用全局异常处理器的全局异常处理策略前,可以先对所述全局异常处理器是否为空进行判断,确定所述全局异常处理器非空后再调用所述全局异常处理策略,而确定所述全局异常处理器为空则无需再调用全局异常处理策略。
为了使本领域技术人员更好地理解本公开,下面分别在所述宿主程序为Android应用程序、IOS应用程序和小程序的情况下对SDK异常的自检方法进行说明。
(1)宿主程序为Android应用程序
由于Android系统采用分层架构,Android应用程序可以包括在Java层和Native层分别运行的不同部分;其中,Java层采用Java语言编写,具有更佳的便捷性;而Native层则采用C语言或C++语言编写,具有更高的安全性。故而,在所述SDK安装于Android应用程序并受所述Android应用程序调用的情况下,SDK异常自检将包括其在Java层的异常自检以及其在Native层的异常自检。
参考图5,图5示意性地示出了根据本公开实施方式的Android应用程序下的一种SDK异常的自检方法的流程图。
在Android应用程序下,SDK针对Java层运行异常的自检方法,可以包括如下步骤:
步骤502,响应于宿主Android应用程序的调用,在SDK初始化成功后,调用Java层的getDefaultUncaughtExceptionHandler函数获取所述Android应用程序当前使用的全局未捕获异常处理器,并记录所述全局未捕获异常处理器;所述全局未捕获异常处理器对应于所述Android应用程序,为UncaughtExceptionHandler接口的一个实现类。
Android应用程序在Java层基于UncaughtExceptionHandler接口进行异常处理,在所述Android应用程序因其全线程中的任一线程发生Java层未捕获异常而即将终止前,JVM(JavaVirtualMachine,Java虚拟机)将查询所述Android应用程序当前使用的UncaughtExceptionHandler接口的实现类,以调用所述实现类下的uncaughtException函数进行异常处理。
所述Android应用程序在同一时刻可以使用唯一的UncaughtExceptionHandler接口的实现类,在SDK受所述Android应用程序调用并初始化成功后,所述SDK可以调用Java层的getDefaultUncaughtExceptionHandler函数,对所述Android应用程序当前使用的UncaughtExceptionHandler接口的实现类进行获取,并将其记作全局未捕获异常处理器。
所述全局未捕获异常处理器对应于所述Android应用程序,它是由所述Android应用程序的开发者实现的UncaughtExceptionHandler接口的实现类,所述UncaughtExceptionHandler接口的实现类下实现有用于进行Java层异常处理的uncaughtException函数,所述全局未捕获异常处理器的uncaughtException函数适应于所述Android应用程序的Java层异常处理需求。
可以理解的是,如果所述Android应用程序的开发者没有为所述Android应用程序设置所述UncaughtExceptionHandler接口的实现类,则所述SDK调用所述getDefaultUncaughtExceptionHandler函数获取到的所述全局未捕获异常处理器将为空。
步骤504,调用Java层的setDefaultUncaughtExceptionHandler函数将所述Android应用程序当前使用的未捕获异常处理器设置为局部未捕获异常处理器;所述局部未捕获异常处理器对应于所述SDK,为所述UncaughtExceptionHandler接口的另一实现类且配置有用于进行Java层异常处理的uncaughtException函数。
在获取并记录了所述Android当前使用的全局未捕获异常处理器后,所述SDK可以调用Java层的setDefaultUncaughtExceptionHandler函数,将所述Android应用程序当前使用的未捕获异常处理器由所述全局未捕获异常处理器更改设置为局部未捕获异常处理器。
所述局部未捕获异常处理器对应于所述SDK,它是由所述SDK的开发者实现的UncaughtExceptionHandler接口的另一实现类,所述局部未捕获异常处理器下用于进行Java层异常处理的uncaughtException函数适应于所述SDK的Java层异常处理需求。
步骤506,在所述SDK被所述Android应用程序调用而运行的过程中,响应于所述Android应用程序在Java层运行异常,调用所述局部未捕获异常处理器的uncaughtException函数进行Java层异常处理。
在所述SDK的生命周期内,响应于所述Android应用程序运行的全线程中的任一线程在Java层运行异常,可以调用所述Android应用程序当前使用的对应于所述SDK的局部未捕获异常处理器的uncaughtException函数进行Java层异常处理。
所述Android应用程序运行的全线程中的任一线程在Java层运行异常,包括所述Android应用程序自身在Java层运行异常以及所述Android应用程序调用的任一SDK在Java层运行异常。
而发生在Java层的异常可以基于未捕获异常类Throwable加以区分,所述未捕获异常类Throwable包括多个子类,举例来说,所述Android应用程序自身或所述Android应用程序调用的任一SDK在Java层运行异常,包括在Java层发生ArrayIndexOutOfBoundsException数组下标越界异常、NullPointerException空指针异常、ClassCastException强制类型转换异常、FileNotFoundException文件查询异常以及OutOfMemoryError内存移除异常中的任一项。
在一种可选择的实现方式下,上述Android应用程序下SDK针对Java层运行异常的自检方法,还包括:
在所述Android应用程序运行无异常的情况下,响应于所述Android应用程序对所述SDK调用的结束,调用Java层的setDefaultUncaughtExceptionHandler函数将当前使用的未捕获异常处理器还原为已记录的对应于所述Android应用程序的全局未捕获异常处理器。
如果在所述SDK的生命周期内,包括所述SDK在内的所述Android应用程序运行的全线程均未发生异常,在所述SDK的生命周期结束之前,所述SDK可以调用Java层的setDefaultUncaughtExceptionHandler函数将所述Android应用程序当前使用的未捕获异常处理器由所述局部未捕获异常处理器还原为已记录的对应于所述Android应用程序的全局未捕获异常处理器。
在一种可选择的实现方式下,上述Android应用程序下SDK针对Java层运行异常的自检方法中,步骤506所述调用所述局部未捕获异常处理器的uncaughtException函数进行Java层异常处理,包括:
基于所述Android应用程序运行异常时抛出的Java层异常参数,采集所述Android应用程序的Java层异常堆栈信息;
将所述Java层异常堆栈信息中包含的Java层异常标识符和预先设置的与所述SDK相关的Java层标识符进行匹配;所述Java层异常标识符为所述Android应用程序在Java层运行异常时执行的标识符;
响应于所述Java层异常标识符和任一与所述SDK相关的Java层标识符匹配,确定所述Android应用程序在Java层运行异常由所述SDK造成,将所述Java层异常堆栈信息以及匹配结果上报至所述SDK的提供方。
在所述SDK的生命周期内,所述Android应用程序运行的全线程中的任一线程在Java层运行异常时将向所述Android应用程序当前使用的未捕获异常处理器抛出Java层异常参数,所述Java层异常参数包括表征线程的参数Thread以及表征未捕获异常类的参数Throwable。
基于所述Java层异常参数,调用诸如getMessage、getCause、printStackTrace等函数可以采集所述Android应用程序的Java层异常堆栈等异常信息。Java层异常堆栈信息中包含多个Java层异常标识符,所述Java层异常标识符为所述Android应用程序在Java层运行异常时执行的包名、类名和函数名等。
将所述Java层异常标识符和预先设置的与所述SDK相关的Java层标识符进行匹配,在所述Java层异常标识符和任一与所述SDK相关的Java层标识符匹配的情况下,确定所述Android应用程序在Java层运行异常由所述SDK造成,将已采集的所述Java层异常堆栈信息以及匹配结果上报至所述SDK的提供方,即,所述用户终端可以及时地向所述SDK服务器转发与所述SDK相关的Java层异常堆栈信息以及匹配结果。
进一步地,所述全局未捕获异常处理器配置有用于进行Java层异常处理的uncaughtException函数。
上述Android应用程序下SDK针对Java层运行异常的自检方法中,步骤506所述调用所述局部未捕获异常处理器的uncaughtException函数进行Java层异常处理,还包括:
将所述Java层异常堆栈信息以及匹配结果上报至所述SDK的提供方后,确定所述全局未捕获异常处理器是否为空;
响应于所述全局未捕获异常处理器非空,基于所述Java层异常参数调用所述全局未捕获异常处理器的uncaughtException函数再次进行Java层异常处理。
在所述局部未捕获异常处理器的uncaughtException函数中,完成上述异常信息采集和分析上报后,可以对所述全局未捕获异常处理器是否为空进行确定,若所述全局未捕获异常处理器非空,则可调用所述全局未捕获异常处理器的uncaughtException函数,即,调用所述Android应用程序的开发者所实现UncaughtExceptionHandler接口的实现类下的uncaughtException函数再次进行Java层异常处理。
在一种可选择的实现方式下,上述Android应用程序下SDK针对Java层运行异常的自检方法中,所述调用所述全局未捕获异常处理器的uncaughtException函数再次进行Java层异常处理,包括:
基于所述Java层异常参数,采集所述Android应用程序的Java层异常堆栈信息,并将所述Java层异常堆栈信息上报至所述Android应用程序的提供方。
所述全局未捕获异常处理器的uncaughtException函数由所述Android应用程序的开发者根据所述Android应用程序的异常处理需求进行设置。比较常见的,所述Android应用程序的开发者所实现的uncaughtException函数中,可以基于所述Android应用程序在Java层运行异常时抛出的Java层异常参数,对Java层异常堆栈等异常信息进行采集,并将Java层异常堆栈信息上报至所述Android应用程序的提供方,即,所述用户终端向Android应用程序的服务器转发所述Java层异常堆栈信息。
参考图6,图6示意性地示出了根据本公开实施方式的Android应用程序下的另一种SDK异常的自检方法的流程图。
在Android应用程序下,SDK针对Native层运行异常的自检方法,可以包括如下步骤:
步骤602,响应于宿主Android应用程序的调用,在SDK初始化成功后,针对预先设置的异常信号集合中的每个异常信号,调用Native层的sigaction函数将当前用于处理所述异常信号的信号处理函数设置为所述SDK用于处理所述异常信号的局部信号处理函数act,并记录所述Android应用程序用于处理所述异常信号的全局信号处理函数old act。
Android应用程序在Native层通过信号监听以及信号处理函数进行异常处理,预先设置异常信号集合并为所述异常信号集合中的每个异常信号设置对应的信号处理函数,对所述异常信号集合中的异常信号进行监听,在所述Android应用程序运行的全线程中的任一线程在Native层运行异常并触发所述异常信号后,可以调用所触发异常信号对应的信号处理函数进行异常处理。
针对一个异常信号,所述Android应用程序在同一时刻用于处理所述异常信号的信号处理函数是唯一的,在SDK受所述Android应用程序调用并初始化成功后,所述SDK可以遍历所述异常信号集合中的每个异常信号,调用Native层的sigaction函数将所述Android应用程序当前用于处理所述异常信号的信号处理函数设置为所述SDK用于处理所述异常信号的局部信号处理函数act,并记录所述Android应用程序用于处理所述异常信号的全局信号处理函数old act,所述act和old act实际分别为指向所述局部信号处理函数和全局信号处理函数的指针。
所述局部信号处理函数act是由所述SDK的开发者实现的用于处理异常信号的信号处理函数,所述局部信号处理函数适应于所述SDK的Native层异常处理需求;所述全局信号处理函数old act则是由所述Android应用程序的开发者实现的用于处理异常信号的处理函数,所述全局信号处理函数适应于所述Android应用程序的Native层异常处理需求。
步骤604,在所述SDK被所述Android应用程序调用而运行的过程中,响应于所述Android应用程序在Native层运行异常并触发异常信号集合中的任一异常信号,调用所述SDK用于处理所述异常信号的局部信号处理函数act对所述异常信号进行Native层异常处理,并调用所述Android应用程序用于处理所述异常信号的全局信号处理函数old act对所述异常信号再次进行Native层异常处理。
在所述SDK的生命周期内,响应于所述Android应用程序运行的全线程中的任一线程在Native层运行异常并触发所述异常信号集合中的任一异常信号,可以先后调用所述SDK用于处理所述异常信号的局部信号处理函数act、以及所述Android应用程序用于处理所述异常信号的全局信号处理函数old act,对所述异常信号进行Native层异常处理。
所述Android应用程序运行的全线程中的任一线程在Native层运行异常,包括所述Android应用程序自身在Native层运行异常,以及所述Android应用程序调用的任一SDK在Native层运行异常。
而发生在Native层的异常可以基于所述异常信号加以区分,举例来说,所述Android应用程序自身或所述Android应用程序调用的任一SDK在Native层运行异常,包括在Native层发生执行无效的内存引用指令触发SIGSEGV信号、执行非法的硬件调用指令触发SIGBUS信号、执行非法的系统调用指令触发SIGSYS信号、执行断点指令或陷阱指令触发SIGTRAP信号、执行致命的算术运算触发SIGFPE信号以及调用Abort函数触发SIGABRT信号中的任一情况。
在一种可选择的实现方式下,上述Android应用程序下SDK针对Native层运行异常的自检方法,还包括:
在所述Android应用程序运行无异常的情况下,响应于所述Android应用程序对所述SDK调用的结束,针对所述异常信号集合中的每个异常信号,调用Native层的sigaction函数将当前用于处理所述异常信号的信号处理函数还原为已记录的所述Android应用程序用于处理所述异常信号的全局信号处理函数old act。
如果在所述SDK的生命周期内,包括所述SDK在内的所述Android应用程序运行的全线程均未发生异常,在所述SDK的生命周期结束之前,所述SDK可以遍历所述异常信号集合中的每个异常信号,调用Native层的sigaction函数将所述Android应用程序当前用于处理所述异常信号的信号处理函数还原为已记录的所述Android应用程序用于处理所述异常信号的全局信号处理函数old act。
在一种可选择的实现方式下,上述Android应用程序下SDK针对Native层运行异常的自检方法中,步骤604所述调用所述SDK用于处理所述异常信号的局部信号处理函数act对所述异常信号进行Native层异常处理,包括:
基于所述宿主程序运行异常时传入的Native层异常参数,采集所述Android应用程序的Native层异常堆栈信息;
将所述Native层异常堆栈信息中包含的Native层异常标识符和预先设置的与所述SDK相关的Native层标识符进行匹配;所述Native层异常标识符为所述Android应用程序在Native层运行异常时执行的标识符;
响应于所述Native层异常标识符和任一与所述SDK相关的Native层标识符匹配,确定所述Android应用程序在Native层运行异常由所述SDK造成,将所述Native层异常堆栈信息以及匹配结果上报至所述SDK的提供方。
在所述SDK的生命周期内,所述Android应用程序运行的全线程中的任一线程在Native层运行异常并触发异常信号集合中的异常信号时,将向所述Android应用程序当前用于处理所述异常信号的信号处理函数传入Native层异常参数,所述Native层异常参数包括异常信号编号signo、以及结构体指针siginfo_t等。
基于所述Native层异常参数,对所述Android应用程序的Native层异常堆栈等异常信息进行采集,并将Native层异常堆栈信息中包含的Native层异常标识符和预先设置的与所述SDK相关的Native层标识符进行匹配,在所述Native层异常标识符和任一与所述SDK相关的Native层标识符匹配的情况下,确定所述Android应用程序在Native层运行异常由所述SDK造成,将已采集的所述Native层异常堆栈信息以及匹配结果上报至所述SDK的提供方,即,所述用户终端可以及时地向所述SDK服务器转发与所述SDK相关的Native层异常堆栈信息以及匹配结果。
本公开中,适应于Android系统的分层架构,考虑到宿主Android应用程序以及SDK可以包括在Java层以及在Native层分别运行的不同部分,分别提供针对Java层运行异常以及针对Native层运行异常的SDK异常自检方法,从而在宿主程序为Android应用程序的情况下更加全面有效地实现SDK异常的检测及处理。
针对Java层异常,基于宿主Android应用程序在Java层使用的UncaughtExceptionHandler接口实现类进行检测及处理。在SDK受宿主Android应用程序调用之初,重设宿主Android应用程序所使用的Uncaught ExceptionHandler接口实现类为SDK开发者所实现的局部未捕获异常处理器,以使在SDK的生命周期内发生的Java层异常可以基于SDK开发者实现的uncaughtException函数执行适应于SDK需求的检测及处理,增强了SDK在Java层运行异常时检测及处理的时效性和全面性。
而针对Native层异常,则基于宿主Android应用程序在Native层使用的信号处理函数进行检测及处理。在SDK受宿主Android应用程序调用之初,重设异常信号集合中各个异常信号的信号处理函数为SDK开发者所实现的信号处理函数,以使在SDK的生命周期内发生的Native层异常可以基于SDK开发者实现的信号处理函数执行适应于SDK需求的检测及处理,增强了SDK在Native层运行异常时检测及处理的时效性和全面性。
另外,在SDK生命周期结束之前,将宿主Android应用程序在Java层所使用的UncaughtExceptionHandler接口实现类还原为宿主Android应用程序所实现的全局未捕获异常处理器,在Native层所使用的信号处理函数还原为宿主Android应用程序开发者所实现的信号处理函数,以使在宿主Android应用程序的生命周期中,除SDK运行时段外的其他时间里可以沿用宿主Android应用程序原有的异常处理机制,降低SDK异常自检对宿主Android应用程序的影响。
(2)宿主程序为IOS应用程序
IOS系统不采用分层架构,一般基于Object-C语言实现。
参考图7,图7示意性地示出了根据本公开实施方式的IOS应用程序下的一种SDK异常的自检方法的流程图。
所述IOS应用程序下,SDK异常的自检方法,可以包括如下步骤:
步骤702,响应于宿主IOS应用程序的调用,在SDK初始化成功后,调用NSGetUncaughtExceptionHandler函数获取所述IOS应用程序当前使用的全局未捕获异常处理函数,并记录所述全局未捕获异常处理函数;所述全局未捕获异常处理函数对应于所述IOS应用程序。
步骤704,调用NSSetUncaughtExceptionHandler函数将所述IOS应用程序当前使用的未捕获异常处理函数设置为局部未捕获异常处理函数;所述局部未捕获异常处理函数对应于所述SDK。
步骤706,在所述SDK被所述IOS应用程序调用而运行的过程中,响应于所述IOS应用程序运行异常,调用对应于所述SDK的局部未捕获异常处理函数进行异常处理。
IOS应用程序基于未捕获异常处理函数进行异常处理,在所述IOS应用程序因其全线程中的任一线程发生未捕获异常而即将终止前,可以调用所述IOS应用程序当前使用的未捕获异常处理函数进行异常处理。
所述IOS应用程序在同一时刻可以使用唯一的未捕获异常处理函数,在所述SDK受所述IOS应用程序调用并初始化成功后,所述SDK可以调用NSGetUncaughtExceptionHandler函数,对所述IOS应用程序当前使用的未捕获异常处理函数进行获取,并将其记作全局未捕获异常处理函数。所述全局未捕获异常处理函数对应于所述IOS应用程序,它是由所述IOS应用程序的开发者实现的用于进行异常处理的未捕获异常处理函数,适应于所述IOS应用程序的异常处理需求。
在获取并记录了所述IOS应用程序当前使用的全局未捕获异常处理函数后,所述SDK可以调用NSSetUncaughtExceptionHandler函数,将所述IOS应用程序当前使用的未捕获异常处理函数由所述全局未捕获异常处理函数更改设置为局部异常处理函数。所述局部未捕获异常处理函数对应于所述SDK,它是由所述SDK的开发者实现的用于进行异常处理的未捕获异常处理函数,适应于所述SDK的异常处理需求。
完成所述IOS应用程序当前使用的未捕获异常处理函数的重新设置后,在所述SDK的生命周期内,响应于所述IOS应用程序运行的全线程中的任一线程运行异常,可以调用所述局部未捕获异常处理函数进行异常处理。
在一种可选择的实现方式下,上述IOS应用程序下SDK异常的自检方法,还包括:
在所述IOS应用程序运行无异常的情况下,响应于所述IOS应用程序对所述SDK调用的结束,调用NSSetUncaughtExceptionHandler函数将当前使用的未捕获异常处理函数还原为已记录的对应于所述IOS应用程序的全局未捕获异常处理函数。
如果在所述SDK的生命周期内,包括所述SDK在内的所述IOS应用程序运行的全线程均未发生异常,在所述SDK的生命周期结束之前,所述SDK可以调用NSSetUncaughtExceptionHandler函数将所述IOS应用程序当前使用的未捕获异常处理函数由所述局部未捕获异常处理函数还原为已记录的对应于所述IOS应用程序的全局未捕获异常处理函数。
在一种可选择的实现方式下,上述IOS应用程序下SDK异常的自检方法中,步骤706所述调用对应于所述SDK的局部未捕获异常处理函数进行异常处理,包括:
基于所述IOS应用程序运行异常时抛出的异常参数,采集所述IOS应用程序的异常堆栈信息;
将所述异常堆栈信息中包含的异常标识符与预先设置的与所述SDK相关的标识符进行匹配;所述异常标识符为所述IOS应用程序在运行异常时执行的标识符;
响应于所述异常标识符和任一与所述SDK相关的标识符匹配,确定所述IOS应用程序运行异常由所述SDK造成,将所述异常堆栈信息以及匹配结果上报至所述SDK的提供方。
在所述SDK的生命周期内,所述IOS应用程序全线程中的任一线程运行异常时将向所述IOS应用程序当前使用的未捕获异常处理函数抛出异常参数,所述异常参数包括表征未捕获异常类的参数NSException。
基于所述异常参数,对所述IOS应用程序的异常堆栈等异常信息进行采集,并将异常堆栈信息中包含的异常标识符和预先设置的与所述SDK相关的标识符进行匹配,在所述异常标识符和任一与所述SDK相关的标识符匹配的情况下,确定所述IOS应用程序运行异常由所述SDK造成,将已采集的所述异常堆栈信息以及匹配结果上报至所述SDK的提供方,即,所述用户终端可以及时地向所述SDK服务器转发与所述SDK相关的异常堆栈信息以及匹配结果。
本公开中,适应于IOS系统架构,基于宿主IOS应用程序使用的未捕获异常处理函数进行异常检测及处理。在SDK受宿主IOS应用程序调用之初,重设宿主IOS应用程序所使用的未捕获异常处理函数为SDK开发者实现的局部未捕获异常处理函数,以使在SDK的生命周期内发生的异常可以基于SDK开发者实现的局部未捕获异常处理函数执行适应于SDK需求的检测及处理,从而在宿主程序为IOS应用程序的情况下增强了SDK异常检测及处理的时效性和全面性。
另外,在SDK生命周期结束前,将宿主IOS应用程序所使用的未捕获异常处理函数还原为宿主IOS应用程序的开发者所实现的全局未捕获异常处理函数,以使在宿主IOS应用程序的生命周期中,除SDK运行时段外的其他时间里可以沿用宿主IOS应用程序原有的异常处理机制,降低SDK异常自检对宿主IOS应用程序的影响。
(3)宿主程序为小程序
小程序不存在分层架构,一般基于JavaScript语言实现。
参考图8,图8示意性地示出了根据本公开实施方式的小程序下的一种SDK异常的自检方法的流程图。
所述小程序下SDK异常的自检方法,可以包括如下步骤:
步骤802,响应于宿主小程序的调用,在SDK初始化成功后,调用GetApp函数获取所述小程序当前使用的对应于所述小程序的OnError函数,并记录对应于所述小程序的OnError函数。
步骤804,将所述小程序当前使用的OnError函数设置为对应于所述SDK的OnError函数。
步骤806,在所述SDK被所述小程序调用而运行的过程中,响应于所述小程序运行异常,调用对应于所述SDK的OnError函数进行异常处理。
小程序基于OnError函数进行异常处理,在所述小程序因运行异常而即将终止前,可以调用所述小程序当前使用的OnError函数进行异常处理。
所述小程序在同一时刻可以使用唯一的OnError函数,在SDK受所述小程序调用并初始化成功后,所述SDK可以调用GetApp函数获取所述小程序当前使用的对应于所述小程序的OnError函数并记录。对应于所述小程序的OnError函数是由所述小程序的开发者实现的用于进行异常处理的OnError函数,能够适应于所述小程序的异常处理需求。
在获取并记录了对应于所述小程序的OnError函数后,所述SDK可以将所述小程序当前使用的OnError函数更改设置为对应于所述SDK的OnError函数。对应于所述SDK的OnError函数是由所述SDK的开发者实现的用于进行异常处理的OnError函数,能够适应于所述SDK的异常处理需求。
完成OnError函数的重新设置后,在所述SDK的生命周期内,响应于所述小程序运行异常,可以调用对应于所述SDK的OnError函数进行异常处理。
在一种可选择的实现方式下,上述小程序下SDK异常的自检方法,还包括:
在所述小程序运行无异常的情况下,响应于所述小程序对所述SDK调用的结束,将当前使用的OnError函数还原为已记录的对应于所述小程序的OnError函数。
在一种可选择的实现方式下,上述小程序下SDK异常的自检方法中,步骤806所述调用对应于所述SDK的OnError函数进行异常处理,包括:
采集所述小程序的异常堆栈信息;
将所述异常堆栈信息中包含的异常标识符和预先设置的与所述SDK相关的标识符进行匹配;所述异常标识符为所述小程序在运行异常时执行的标识符;
响应于所述异常标识符和任一与所述SDK相关的标识符匹配,确定所述小程序运行异常由所述SDK造成,将所述异常堆栈信息以及匹配结果上报至所述SDK的提供方。
本公开中,适应于小程序的架构,基于宿主小程序使用的OnError函数进行异常检测及处理。在SDK受宿主小程序调用之初,重设宿主小程序所使用的OnError函数为SDK开发者所实现的OnError函数,以使在SDK的生命周期内发生的异常可以基于SDK开发者实现的OnError函数执行适应于SDK需求的检测及处理,从而在宿主程序为小程序的情况下增强了SDK异常检测及处理的时效性和全面性。
另外,在SDK生命周期结束之前,将宿主小程序所使用的OnError函数还原为宿主小程序开发者所实现的OnError函数,以使在宿主小程序的生命周期中,除SDK运行时段外的其他时间里可以沿用宿主小程序原有的异常处理机制,降低SDK异常自检对宿主小程序的影响。
综上所述,本公开在宿主程序为Android应用程序、IOS应用程序以及小程序的情况下,适应于不同宿主程序的系统架构,分别提出了相应的SDK异常的自检方法,且皆能够达到增强SDK异常检测及处理的时效性和全面性的效果。
在不同宿主程序下,SDK均可以在生命周期开始之时重新设置宿主程序使用的异常处理器,以使得在SDK的生命周期内,能够调用对应于SDK的局部异常处理器的局部异常处理策略进行异常处理。所述SDK通过替换异常处理器具备了自检能力,即使在宿主程序不执行异常检测的情况下SDK异常也能够得到处理;对应于所述SDK的局部异常处理器的局部异常处理策略可以由SDK的开发者进行自定义设置,所述局部异常处理策略包括采集、分析异常信息并将其上报至所述SDK的提供方等,能够适应于所述SDK的异常处理需求,增强了SDK异常检测及处理的时效性和全面性;所述局部异常处理策略还可以包括对全局异常处理器的全局异常处理策略的调用,从而降低了在所述SDK生命周期内对所述宿主程序原有异常处理机制的影响。
在SDK生命周期结束之时,将宿主程序使用的异常处理器还原为对应于所述宿主程序的全局异常处理器,以使得在所述宿主程序不运行所述SDK的生命周期内,可以沿用适应于所述宿主程序异常处理需求的全局异常处理器,从而降低了对所述宿主程序原有异常处理机制的影响。
示例性装置
在介绍了本公开示例性实施方式的介质之后,接下来,参考图9对本公开示例性实施方式的装置进行说明。
下述装置中各个模块的功能和作用的实现过程具体详见上述方法中对应步骤的实现过程,在此不再赘述。对于装置实施例而言,由于其基本对应于方法实施例,所以相关之处参见方法实施例的部分说明即可。
图9示意性地示出了根据本公开实施方式的一种SDK异常的自检装置,应用于SDK,所述SDK安装于宿主程序中并受所述宿主程序调用;所述装置包括:
记录单元910,响应于宿主程序的调用,在SDK初始化成功后,记录所述宿主程序当前使用的对应于所述宿主程序的全局异常处理器;
设置单元920,将所述宿主程序当前使用的异常处理器设置为对应于所述SDK的局部异常处理器;所述局部异常处理器配置有用于进行异常处理的局部异常处理策略;
处理单元930,在所述SDK被所述宿主程序调用而运行的过程中,响应于所述宿主程序运行异常,调用所述局部异常处理器的所述局部异常处理策略进行异常处理。
可选地,所述装置还包括:
还原单元940,在所述宿主程序运行无异常的情况下,响应于所述宿主程序对所述SDK调用的结束,将当前使用的异常处理器还原为已记录的所述全局异常处理器。
可选地,所述处理单元930,在调用所述局部异常处理器的所述局部异常处理策略进行异常处理时,具体用于:
采集所述宿主程序运行异常时的异常信息并对所述异常信息进行分析;
响应于分析结果为所述宿主程序运行异常由所述SDK造成,将所述异常信息以及所述分析结果上报至所述SDK的提供方。
可选地,所述全局异常处理器配置有用于进行异常处理的全局异常处理策略;
所述处理单元930,在调用所述局部异常处理器的所述局部异常处理策略进行异常处理时,还用于:
在将所述异常信息以及所述分析结果上报至所述SDK的提供方后,确定已记录的所述全局异常处理器是否为空;
响应于已记录的所述全局异常处理器非空,调用所述全局异常处理器的全局异常处理策略再次进行异常处理。
可选地,所述宿主程序为Android应用程序;
所述记录单元910,在记录所述宿主程序当前使用的对应于所述宿主程序的全局异常处理器时,具体用于:
调用Java层的getDefaultUncaughtExceptionHandler函数获取所述Android应用程序当前使用的全局未捕获异常处理器,并记录所述全局未捕获异常处理器;所述全局未捕获异常处理器对应于所述Android应用程序,为UncaughtExceptionHandler接口的一个实现类;
所述设置单元920,在将所述宿主程序当前使用的异常处理器设置为对应于所述SDK的局部异常处理器时,具体用于:
调用Java层的setDefaultUncaughtExceptionHandler函数将所述Android应用程序当前使用的未捕获异常处理器设置为局部未捕获异常处理器;所述局部未捕获异常处理器对应于所述SDK,为所述UncaughtExceptionHandler接口的另一实现类且配置有用于进行Java层异常处理的uncaughtException函数;
所述处理单元930,在响应于所述宿主程序运行异常,调用所述局部异常处理器的所述局部异常处理策略进行异常处理时,具体用于:
响应于所述Android应用程序在Java层运行异常,调用所述局部未捕获异常处理器的uncaughtException函数进行Java层异常处理。
可选地,所述装置还包括:
还原单元940,在所述Android应用程序运行无异常的情况下,响应于所述Android应用程序对所述SDK调用的结束,调用Java层的setDefaultUncaughtExceptionHandler函数将当前使用的未捕获异常处理器还原为已记录的对应于所述Android应用程序的全局未捕获异常处理器。
可选地,所述处理单元930,在调用所述局部未捕获异常处理器的uncaughtException函数进行Java层异常处理时,具体用于:
基于所述Android应用程序运行异常时抛出的Java层异常参数,采集所述Android应用程序的Java层异常堆栈信息;
将所述Java层异常堆栈信息中包含的Java层异常标识符和预先设置的与所述SDK相关的Java层标识符进行匹配;所述Java层异常标识符为所述Android应用程序在Java层运行异常时执行的标识符;
响应于所述Java层异常标识符和任一与所述SDK相关的Java层标识符匹配,确定所述Android应用程序在Java层运行异常由所述SDK造成,将所述Java层异常堆栈信息以及匹配结果上报至所述SDK的提供方。
可选地,所述全局未捕获异常处理器配置有用于进行Java层异常处理的uncaughtException函数;
所述处理单元930,在调用所述局部未捕获异常处理器的uncaughtException函数进行Java层异常处理时,还用于:
将所述Java层异常堆栈信息以及匹配结果上报至所述SDK的提供方后,确定所述全局未捕获异常处理器是否为空;
响应于所述全局未捕获异常处理器非空,基于所述Java层异常参数调用所述全局未捕获异常处理器的uncaughtException函数再次进行Java层异常处理。
可选地,所述处理单元930,在调用所述全局未捕获异常处理器的uncaughtException函数再次进行Java层异常处理,具体用于:
基于所述Java层异常参数,采集所述Android应用程序的Java层异常堆栈信息,并将所述Java层异常堆栈信息上报至所述Android应用程序的提供方。
可选地,所述Android应用程序在Java层运行异常,包括:
所述Android应用程序在运行的过程中,在Java层发生ArrayIndexOutOfBoundsException数组下标越界异常、NullPointerException空指针异常、ClassCastException强制类型转换异常、FileNotFoundException文件查询异常以及OutOfMemoryError内存移除异常中的任一项;
或,所述Android应用程序调用的任一SDK在运行的过程中,在Java层发生ArrayIndexOutOfBoundsException数组下标越界异常、NullPointerException空指针异常、ClassCastException强制类型转换异常、FileNotFoundException文件查询异常以及OutOfMemoryError内存移除异常中的任一项。
可选地,所述设置单元920,响应于宿主程序的调用,在SDK初始化成功后,还用于:
针对预先设置的异常信号集合中的每个异常信号,调用Native层的sigaction函数将当前用于处理所述异常信号的信号处理函数设置为所述SDK用于处理所述异常信号的局部信号处理函数act;
所述记录单元910,响应于宿主程序的调用,在SDK初始化成功后,还用于:
记录所述Android应用程序用于处理所述异常信号的全局信号处理函数old act;
所述处理单元930,在所述SDK被所述宿主程序调用而运行的过程中,还用于:
响应于所述Android应用程序在Native层运行异常并触发异常信号集合中的任一异常信号,调用所述SDK用于处理所述异常信号的局部信号处理函数act对所述异常信号进行Native层异常处理,并调用所述Android应用程序用于处理所述异常信号的全局信号处理函数old act对所述异常信号再次进行Native层异常处理。
可选地,所述装置还包括:
还原单元940,在所述Android应用程序运行无异常的情况下,响应于所述Android应用程序对所述SDK调用的结束,针对所述异常信号集合中的每个异常信号,调用Native层的sigaction函数将当前用于处理所述异常信号的信号处理函数还原为已记录的所述Android应用程序用于处理所述异常信号的全局信号处理函数old act。
可选地,所述处理单元930,在调用所述SDK用于处理所述异常信号的局部信号处理函数act对所述异常信号进行Native层异常处理时,具体用于:
基于所述宿主程序运行异常时传入的Native层异常参数,采集所述Android应用程序的Native层异常堆栈信息;
将所述Native层异常堆栈信息中包含的Native层异常标识符和预先设置的与所述SDK相关的Native层标识符进行匹配;所述Native层异常标识符为所述Android应用程序在Native层运行异常时执行的标识符;
响应于所述Native层异常标识符和任一与所述SDK相关的Native层标识符匹配,确定所述Android应用程序在Native层运行异常由所述SDK造成,将所述Native层异常堆栈信息以及匹配结果上报至所述SDK的提供方。
可选地,所述Android应用程序在Native层运行异常并触发异常信号集合中的异常信号,包括:
所述Android应用程序在运行的过程中,在Native层发生执行无效的内存引用指令触发SIGSEGV信号、执行非法的硬件调用指令触发SIGBUS信号、执行非法的系统调用指令触发SIGSYS信号、执行断点指令或陷阱指令触发SIGTRAP信号、执行致命的算术运算触发SIGFPE信号以及调用Abort函数触发SIGABRT信号中的任一情况;
或,所述Android应用程序调用的任一SDK在运行的过程中,在Native层发生执行无效的内存引用指令触发SIGSEGV信号、执行非法的硬件调用指令触发SIGBUS信号、执行非法的系统调用指令触发SIGSYS信号、执行断点指令或陷阱指令触发SIGTRAP信号、执行致命的算术运算触发SIGFPE信号以及调用Abort函数触发SIGABRT信号中的任一情况。
可选地,所述宿主程序为IOS应用程序;
所述记录单元910,在记录所述宿主程序当前使用的对应于所述宿主程序的全局异常处理器时,具体用于:
调用NSGetUncaughtExceptionHandler函数获取所述IOS应用程序当前使用的全局未捕获异常处理函数,并记录所述全局未捕获异常处理函数;所述全局未捕获异常处理函数对应于所述IOS应用程序;
所述设置单元920,在将所述宿主程序当前使用的异常处理器设置为对应于所述SDK的局部异常处理器,具体用于:
调用NSSetUncaughtExceptionHandler函数将所述IOS应用程序当前使用的未捕获异常处理函数设置为局部未捕获异常处理函数;所述局部未捕获异常处理函数对应于所述SDK;
所述处理单元930,在调用所述局部异常处理器的所述局部异常处理策略进行异常处理时,具体用于:
调用对应于所述SDK的局部未捕获异常处理函数进行异常处理。
可选地,所述装置还包括:
还原单元940,在所述IOS应用程序运行无异常的情况下,响应于所述IOS应用程序对所述SDK调用的结束,调用NSSetUncaughtExceptionHandler函数将当前使用的未捕获异常处理函数还原为已记录的对应于所述IOS应用程序的全局未捕获异常处理函数。
可选地,所述处理单元930,在调用对应于所述SDK的局部未捕获异常处理函数进行异常处理时,具体用于:
基于所述IOS应用程序运行异常时抛出的异常参数,采集所述IOS应用程序的异常堆栈信息;
将所述异常堆栈信息中包含的异常标识符与预先设置的与所述SDK相关的标识符进行匹配;所述异常标识符为所述IOS应用程序在运行异常时执行的标识符;
响应于所述异常标识符和任一与所述SDK相关的标识符匹配,确定所述IOS应用程序运行异常由所述SDK造成,将所述异常堆栈信息以及匹配结果上报至所述SDK的提供方。
可选地,所述宿主程序为小程序;
所述记录单元910,在记录所述宿主程序当前使用的对应于所述宿主程序的全局异常处理器时,具体用于:
调用GetApp函数获取所述小程序当前使用的对应于所述小程序的OnError函数,并记录对应于所述小程序的OnError函数;
所述设置单元920,在将所述宿主程序当前使用的异常处理器设置为对应于所述SDK的局部异常处理器时,具体用于:
将所述小程序当前使用的OnError函数设置为对应于所述SDK的OnError函数;
所述处理单元930,在调用所述局部异常处理器的所述局部异常处理策略进行异常处理时,具体用于:
调用对应于所述SDK的OnError函数进行异常处理。
可选地,所述装置还包括:
还原单元940,在所述小程序运行无异常的情况下,响应于所述小程序对所述SDK调用的结束,将当前使用的OnError函数还原为已记录的对应于所述小程序的OnError函数。
可选地,所述处理单元930,在调用对应于所述SDK的OnError函数进行异常处理时,具体用于:
采集所述小程序的异常堆栈信息;
将所述异常堆栈信息中包含的异常标识符和预先设置的与所述SDK相关的标识符进行匹配;所述异常标识符为所述小程序在运行异常时执行的标识符;
响应于所述异常标识符和任一与所述SDK相关的标识符匹配,确定所述小程序运行异常由所述SDK造成,将所述异常堆栈信息以及匹配结果上报至所述SDK的提供方。
示例性介质
在介绍了本公开示例性实施方式的方法之后,接下来,参考图10对本公开示例性实施方式的介质进行说明。
本示例性实施方式中,可以通过程序产品实现上述方法,如可以采用便携式紧凑盘只读存储器(CD-ROM)并包括程序代码,并可以在设备,例如个人电脑上运行。然而,本公开的程序产品不限于此,在本文件中,可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。
该程序产品可以采用一个或多个可读介质的任意组合。可读介质可以是可读信号介质或者可读存储介质。可读存储介质例如可以为但不限于电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。可读存储介质的更具体的例子(非穷举的列表)包括:具有一个或多个导线的电连接、便携式盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、光纤、便携式紧凑盘只读存储器(CD-ROM)、光存储器件、磁存储器件、或者上述的任意合适的组合。
计算机可读信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了可读程序代码。这种传播的数据信号可以采用多种形式,包括但不限于电磁信号、光信号或上述的任意合适的组合。可读信号介质还可以是可读存储介质以外的任何可读介质,该可读介质可以发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序。
可读介质上包含的程序代码可以用任何适当的介质传输,包括但不限于无线、有线、光缆、RE等等,或者上述的任意合适的组合。
可以以一种或多种程序设计语言的任意组合来编写用于执行本公开操作的程序代码,程序设计语言包括面向对象的程序设计语言,诸如Java、C++等,还包括常规的过程式程序设计语言,诸如C语言或类似的程序设计语言。程序代码可以完全地在用户计算设备上执行、部分在用户计算设备上部分在远程计算设备上执行、或者完全在远程计算设备或服务器上执行。在涉及远程计算设备的情形中,远程计算设备可以通过任意种类的网络,包括局域网(LAN)或广域网(WAN),连接到用户计算设备,或者,可以连接到外部计算设备(例如利用因特网服务提供商来通过因特网连接)。
示例性计算设备
在介绍了本公开示例性实施方式的方法、介质和装置之后,接下来,参考图11对本公开示例性实施方式的计算设备进行说明。
图11显示的计算设备1100仅仅是一个示例,不应对本公开实施例的功能和使用范围带来任何限制。
如图11所示,计算设备1100以通用计算设备的形式表现。计算设备1100的组件可以包括但不限于:上述至少一个处理单元1101、上述至少一个存储单元1102,连接不同系统组件(包括处理单元1101和存储单元1102)的总线1103。
总线1103包括数据总线、控制总线和地址总线。
存储单元1102可以包括易失性存储器形式的可读介质,例如随机存取存储器(RAM)11021和/或高速缓存存储器11022,可以进一步包括非易失性存储器形式的可读介质,例如只读存储器(ROM)11023。
存储单元1102还可以包括具有一组(至少一个)程序模块11024的程序/实用工具11025,这样的程序模块11024包括但不限于:操作系统、一个或者多个应用程序、其它程序模块以及程序数据,这些示例中的每一个或某种组合中可能包括网络环境的实现。
计算设备1100也可以与一个或多个外部设备1104(例如键盘、指向设备等)通信。
这种通信可以通过输入/输出(I/O)接口1105进行。并且,计算设备1100还可以通过网络适配器1106与一个或者多个网络(例如局域网(LAN),广域网(WAN)和/或公共网络,例如因特网)通信。如图11所示,网络适配器1106通过总线1103与计算设备1100的其它模块通信。应当理解,尽管图中未示出,可以结合计算设备1100使用其它硬件和/或软件模块,包括但不限于:微代码、设备驱动器、冗余处理单元、外部磁盘驱动阵列、RAID系统、磁带驱动器以及数据备份存储系统等。
应当注意,尽管在上文详细描述中提及了SDK异常的自检装置的若干单元/模块或子单元/模块,但是这种划分仅仅是示例性的并非强制性的。实际上,根据本公开的实施方式,上文描述的两个或更多单元/模块的特征和功能可以在一个单元/模块中具体化。反之,上文描述的一个单元/模块的特征和功能可以进一步划分为由多个单元/模块来具体化。
此外,尽管在附图中以特定顺序描述了本公开方法的操作,但是,这并非要求或者暗示必须按照该特定顺序来执行这些操作,或是必须执行全部所示的操作才能实现期望的结果。附加地或备选地,可以省略某些步骤,将多个步骤合并为一个步骤执行,和/或将一个步骤分解为多个步骤执行。
虽然已经参考若干具体实施方式描述了本公开的精神和原理,但是应该理解,本公开并不限于所公开的具体实施方式,对各方面的划分也不意味着这些方面中的特征不能组合以进行受益,这种划分仅是为了表述的方便。本公开旨在涵盖所附权利要求的精神和范围内所包括的各种修改和等同布置。
Claims (10)
1.一种SDK异常的自检方法,应用于SDK,所述SDK安装于宿主程序中并受所述宿主程序调用;所述方法包括:
响应于宿主程序的调用,在SDK初始化成功后,记录所述宿主程序当前使用的对应于所述宿主程序的全局异常处理器;
将所述宿主程序当前使用的异常处理器设置为对应于所述SDK的局部异常处理器;所述局部异常处理器配置有用于进行异常处理的局部异常处理策略;
在所述SDK被所述宿主程序调用而运行的过程中,响应于所述宿主程序运行异常,调用所述局部异常处理器的所述局部异常处理策略进行异常处理。
2.根据权利要求1所述的方法,还包括:
在所述宿主程序运行无异常的情况下,响应于所述宿主程序对所述SDK调用的结束,将当前使用的异常处理器还原为已记录的所述全局异常处理器。
3.根据权利要求1所述的方法,所述调用所述局部异常处理器的所述局部异常处理策略进行异常处理,包括:
采集所述宿主程序运行异常时的异常信息并对所述异常信息进行分析;
响应于分析结果为所述宿主程序运行异常由所述SDK造成,将所述异常信息以及所述分析结果上报至所述SDK的提供方。
4.根据权利要求1所述的方法,所述宿主程序为Android应用程序;
所述记录所述宿主程序当前使用的对应于所述宿主程序的全局异常处理器,包括:
调用Java层的getDefaultUncaughtExceptionHandler函数获取所述Android应用程序当前使用的全局未捕获异常处理器,并记录所述全局未捕获异常处理器;所述全局未捕获异常处理器对应于所述Android应用程序,为UncaughtExceptionHandler接口的一个实现类;
所述将所述宿主程序当前使用的异常处理器设置为对应于所述SDK的局部异常处理器,包括:
调用Java层的setDefaultUncaughtExceptionHandler函数将所述Android应用程序当前使用的未捕获异常处理器设置为局部未捕获异常处理器;所述局部未捕获异常处理器对应于所述SDK,为所述UncaughtExceptionHandler接口的另一实现类且配置有用于进行Java层异常处理的uncaughtException函数;
所述响应于所述宿主程序运行异常,调用所述局部异常处理器的所述局部异常处理策略进行异常处理,包括:
响应于所述Android应用程序在Java层运行异常,调用所述局部未捕获异常处理器的uncaughtException函数进行Java层异常处理。
5.根据权利要求4所述的方法,响应于宿主程序的调用,在SDK初始化成功后,所述方法还包括:
针对预先设置的异常信号集合中的每个异常信号,调用Native层的sigaction函数将当前用于处理所述异常信号的信号处理函数设置为所述SDK用于处理所述异常信号的局部信号处理函数act,并记录所述Android应用程序用于处理所述异常信号的全局信号处理函数old act;
在所述SDK被所述宿主程序调用而运行的过程中,所述方法还包括:
响应于所述Android应用程序在Native层运行异常并触发异常信号集合中的任一异常信号,调用所述SDK用于处理所述异常信号的局部信号处理函数act对所述异常信号进行Native层异常处理,并调用所述Android应用程序用于处理所述异常信号的全局信号处理函数old act对所述异常信号再次进行Native层异常处理。
6.根据权利要求1所述的方法,所述宿主程序为IOS应用程序;
所述记录所述宿主程序当前使用的对应于所述宿主程序的全局异常处理器,包括:
调用NSGetUncaughtExceptionHandler函数获取所述IOS应用程序当前使用的全局未捕获异常处理函数,并记录所述全局未捕获异常处理函数;所述全局未捕获异常处理函数对应于所述IOS应用程序;
所述将所述宿主程序当前使用的异常处理器设置为对应于所述SDK的局部异常处理器,包括:
调用NSSetUncaughtExceptionHandler函数将所述IOS应用程序当前使用的未捕获异常处理函数设置为局部未捕获异常处理函数;所述局部未捕获异常处理函数对应于所述SDK;
所述调用所述局部异常处理器的所述局部异常处理策略进行异常处理,包括:
调用对应于所述SDK的局部未捕获异常处理函数进行异常处理。
7.根据权利要求1所述的方法,所述宿主程序为小程序;
所述记录所述宿主程序当前使用的对应于所述宿主程序的全局异常处理器,包括:
调用GetApp函数获取所述小程序当前使用的对应于所述小程序的OnError函数,并记录对应于所述小程序的OnError函数;
所述将所述宿主程序当前使用的异常处理器设置为对应于所述SDK的局部异常处理器,包括:
将所述小程序当前使用的OnError函数设置为对应于所述SDK的OnError函数;
所述调用所述局部异常处理器的所述局部异常处理策略进行异常处理,包括:
调用对应于所述SDK的OnError函数进行异常处理。
8.一种SDK异常的自检装置,应用于SDK,所述SDK安装于宿主程序中并受所述宿主程序调用;所述装置包括:
记录单元,响应于宿主程序的调用,在SDK初始化成功后,记录所述宿主程序当前使用的对应于所述宿主程序的全局异常处理器;
设置单元,将所述宿主程序当前使用的异常处理器设置为对应于所述SDK的局部异常处理器;所述局部异常处理器配置有用于进行异常处理的局部异常处理策略;
处理单元,在所述SDK被所述宿主程序调用而运行的过程中,响应于所述宿主程序运行异常,调用所述局部异常处理器的所述局部异常处理策略进行异常处理。
9.一种介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现权利要求1-7中任一项所述的方法。
10.一种计算设备,包括:
处理器;
用于存储所述处理器可执行程序的存储器;
其中,所述处理器通过运行所述可执行程序实现权利要求1-7中任一项所述的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111183908.7A CN113986622A (zh) | 2021-10-11 | 2021-10-11 | Sdk异常的自检方法、装置、介质和计算设备 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111183908.7A CN113986622A (zh) | 2021-10-11 | 2021-10-11 | Sdk异常的自检方法、装置、介质和计算设备 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN113986622A true CN113986622A (zh) | 2022-01-28 |
Family
ID=79738146
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202111183908.7A Pending CN113986622A (zh) | 2021-10-11 | 2021-10-11 | Sdk异常的自检方法、装置、介质和计算设备 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN113986622A (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2024040916A1 (zh) * | 2022-08-26 | 2024-02-29 | 中国银联股份有限公司 | Sdk的修复方法、装置、终端、设备、系统及介质 |
-
2021
- 2021-10-11 CN CN202111183908.7A patent/CN113986622A/zh active Pending
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2024040916A1 (zh) * | 2022-08-26 | 2024-02-29 | 中国银联股份有限公司 | Sdk的修复方法、装置、终端、设备、系统及介质 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US9514029B2 (en) | Partial recording of a computer program execution for replay | |
US8156475B2 (en) | Device and method for testing embedded software using emulator | |
US8250543B2 (en) | Software tracing | |
US8037459B2 (en) | Recovery from nested exceptions in an instrumentation routine | |
KR101650110B1 (ko) | 콜백을 사용하여 소프트웨어의 동적 계측을 위한 고장안전 메커니즘 | |
US20080005281A1 (en) | Error capture and reporting in a distributed computing environment | |
US8607098B2 (en) | Generating appropriately sized core files used in diagnosing application crashes | |
EP3660684A1 (en) | Efficient and comprehensive source code fuzzing | |
US20070220370A1 (en) | Mechanism to generate functional test cases for service oriented architecture (SOA) applications from errors encountered in development and runtime | |
JPH06208486A (ja) | ソフトウェア例外条件に対する選択的データ捕獲方法 | |
CN107577593B (zh) | 使用执行单一步骤来诊断编码 | |
US8793694B2 (en) | Policy driven autonomic performance data collection | |
JP2007500401A (ja) | ソフトウェアデバッギング用装置とその方法 | |
US20080276129A1 (en) | Software tracing | |
US20070083792A1 (en) | System and method for error detection and reporting | |
US20170075789A1 (en) | Method and apparatus for generating, capturing, storing, and loading debug information for failed tests scripts | |
US11113182B2 (en) | Reversible debugging in a runtime environment | |
CN113986622A (zh) | Sdk异常的自检方法、装置、介质和计算设备 | |
Nguyen et al. | Insight: In-situ online service failure path inference in production computing infrastructures | |
CN110045952B (zh) | 代码调用方法与装置 | |
US8418151B2 (en) | Date and time simulation for time-sensitive applications | |
US20200310942A1 (en) | Collecting application state in a runtime environment for reversible debugging | |
WO2013104964A1 (en) | Thread based dynamic data collection | |
CN113032100B (zh) | 一种异常处理方法、装置、设备及存储介质 | |
US11307920B2 (en) | Automated crash recovery |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |