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

软件工具开发包的热修复方法、装置、电子设备及介质与流程

2022-11-14 03:34:20 来源:中国专利 TAG:


1.本公开涉及计算机的技术领域,具体而言,涉及一种软件工具开发包的热修复方法、装置、电子设备及介质。


背景技术:

2.热修复又称补丁技术,热修复是指在用户无感知情况下对应用程序使用补丁进行紧急修复。
3.目前,市面上针对应用程序app(application)级别的热修方案已较为成熟了。但是,现有技术中对软件工具开发包(software development kit,简称sdk)级别的热修复技术还比较少。在现有的sdk热修复技术中,通常选择直接修改类中的方法,该热修复技术将产生关于方法的反射调用。然而,现有热修复技术对反射调用中抛出的异常无法进行准确的识别,从而导致sdk本身所存在的问题难以被发现,进而导致更加严重的结果。


技术实现要素:

4.本公开实施例至少提供一种软件工具开发包的热修复方法、装置、电子设备及介质。
5.第一方面,本公开实施例提供了一种软件工具开发包的热修复方法,包括:获取反射调用的待修复方法内部所产生目标异常的异常信息;基于所述异常信息识别所述目标异常的目标异常类型;其中,所述目标异常类型用于指示所述目标异常是否为预先设置的已知类异常;确定与所述目标异常类型相匹配的修复处理模式,并基于所述修复处理模式对所述目标异常进行热修复处理,以实现对所述待修复方法进行热修复处理。
6.一种可选的实施方式中,所述基于所述异常信息识别所述目标异常的目标异常类型,包括:在基于所述异常信息确定所述目标异常为反射异常的情况下,获取所述异常信息中目标异常字段的字段内容;其中,所述反射异常用于指示所述目标异常为将初始异常进行封装后抛出的异常;基于所述字段内容识别所述目标异常中被封装的初始异常的真实异常类型,并将所述真实异常类型确定为所述目标异常类型。
7.一种可选的实施方式中,所述基于所述字段内容识别所述目标异常中被封装的初始异常的真实异常类型,包括:获取所述待修复方法中预先声明的预设异常类型;在确定所述字段内容所指示的异常类型为所述预设异常类型的情况下,确定所述初始异常的真实异常类型为第一已知类异常。
8.一种可选的实施方式中,所述基于所述字段内容识别所述目标异常中被封装的初始异常的真实异常类型,包括:在确定所述字段内容所指示的异常类型为运行时异常,且所述运行时异常不是预先定义的运行时异常的情况下,确定所述初始异常的真实异常类型为第二已知类异常。
9.一种可选的实施方式中,所述基于所述字段内容识别所述目标异常中被封装的初始异常的真实异常类型,包括:在确定所述字段内容所指示的异常类型为运行时异常,且所
述运行时异常是预先定义的运行时异常的情况下,确定所述初始异常的真实异常类型为第一非已知类异常。
10.一种可选的实施方式中,所述基于所述异常信息识别所述目标异常的目标异常类型,包括:在基于所述异常信息确定所述目标异常不是反射异常的情况下,确定所述目标异常的异常类型为第二非已知类异常;其中,所述反射异常用于指示所述目标异常为将初始异常进行封装后抛出的异常。
11.一种可选的实施方式中,所述确定与所述目标异常类型相匹配的修复处理模式,并基于所述修复处理模式对所述目标异常进行热修复处理,包括:在确定所述目标异常类型为已知类异常的情况下,将所述目标异常的异常信息抛出;或者,在确定所述目标异常类型为非已知类异常的情况下,基于所述目标异常的异常信息生成新异常信息,并将所述新异常信息抛出;其中,所述新异常信息所指示异常的类型为非已知类异常。
12.第二方面,本公开实施例提供了一种软件工具开发包的热修复装置包括:获取单元,用于获取反射调用的待修复方内部所产生目标异常的异常信息;识别单元,用于基于所述异常信息识别所述目标异常的目标异常类型;其中,所述目标异常类型用于指示所述目标异常是否为预先设置的已知类异常;确定单元,用于确定与所述目标异常类型相匹配的修复处理模式;热修复单元,用于基于所述修复处理模式对所述目标异常进行热修复处理,以实现对所述待修复方法进行热修复处理。
13.第三方面,本公开实施例还提供一种电子设备,包括:处理器、存储器和总线,所述存储器存储有所述处理器可执行的机器可读指令,当电子设备运行时,所述处理器与所述存储器之间通过总线通信,所述机器可读指令被所述处理器执行时执行上述第一方面,或第一方面中任一种可能的实施方式中的步骤。
14.第四方面,本公开实施例还提供一种计算机可读存储介质,该计算机可读存储介质上存储有计算机程序,该计算机程序被处理器运行时执行上述第一方面,或第一方面中任一种可能的实施方式中的步骤。
15.在本公开实施例中,首先,可以获取反射调用的待修复方法内部所产生目标异常的异常信息;之后,可以基于该异常信息识别该目标异常的目标异常类型,从而基于该目标异常类型确定该目标异常是否为预先设置的已知类异常。针对已知类异常和非已知类异常,可以设置不同的修复处理模式,进而,基于与该目标异常类型相匹配的修复处理模式对待修复方法进行热修复处理。通过该处理方式,可以实现在热修复过程中的反射调用不会影响原有方法对异常信息的逻辑处理;同时,还可以实现对非已知类异常和已知类异常进行区分,从而可以根据识别的异常类型对待修复方法进行修复处理,以实现更加全面的对sdk进行热修复,从而保证对应应用程序的稳定运行。
16.为使本公开的上述目的、特征和优点能更明显易懂,下文特举较佳实施例,并配合所附附图,作详细说明如下。
附图说明
17.为了更清楚地说明本公开实施例的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,此处的附图被并入说明书中并构成本说明书中的一部分,这些附图示出了符合本公开的实施例,并与说明书一起用于说明本公开的技术方案。应当理解,以下附图
仅示出了本公开的某些实施例,因此不应被看作是对范围的限定,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他相关的附图。
18.图1示出了本公开实施例所提供的一种软件工具开发包的热修复方法的流程图;
19.图2示出了本公开实施例所提供一种sdk修复方法的流程图;
20.图3示出了本公开实施例所提供的一种软件工具开发包的热修复方法的流程图中,基于所述异常信息识别抛出的目标异常的目标异常类型的具体流程图;
21.图4示出了本公开实施例所提供的一种软件工具开发包的热修复方法的流程图中,确定与目标异常类型相匹配的修复处理模式,并基于修复处理模式对所述目标异常进行热修复处理的具体流程图;
22.图5示出了本公开实施例所提供的第二种软件工具开发包的热修复方法的流程图;
23.图6示出了本公开实施例所提供的第三种软件工具开发包的热修复方法的流程图;
24.图7示出了本公开实施例所提供的一种软件工具开发包的热修复装置的示意图;
25.图8示出了本公开实施例所提供的一种电子设备的示意图。
具体实施方式
26.为使本公开实施例的目的、技术方案和优点更加清楚,下面将结合本公开实施例中附图,对本公开实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本公开一部分实施例,而不是全部的实施例。通常在此处附图中描述和示出的本公开实施例的组件可以以各种不同的配置来布置和设计。因此,以下对在附图中提供的本公开的实施例的详细描述并非旨在限制要求保护的本公开的范围,而是仅仅表示本公开的选定实施例。基于本公开的实施例,本领域技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都属于本公开保护的范围。
27.应注意到:相似的标号和字母在下面的附图中表示类似项,因此,一旦某一项在一个附图中被定义,则在随后的附图中不需要对其进行进一步定义和解释。
28.本文中术语“和/或”,仅仅是描述一种关联关系,表示可以存在三种关系,例如,a和/或b,可以表示:单独存在a,同时存在a和b,单独存在b这三种情况。另外,本文中术语“至少一种”表示多种中的任意一种或多种中的至少两种的任意组合,例如,包括a、b、c中的至少一种,可以表示包括从a、b和c构成的集合中选择的任意一个或多个元素。
29.经研究发现,目前,市面上针对应用程序app(application)级别的热修方案已较为成熟了。但是,现有技术中对软件工具开发包(software development kit,简称sdk)级别的热修复技术还比较少。在现有的sdk热修复技术中,通常选择直接修改类中的方法,该热修复技术将产生关于方法的反射调用。然而,现有热修复技术对反射调用中抛出的异常无法进行准确的识别,从而导致sdk本身所存在的问题难以被发现,进而导致更加严重的结果。
30.在现有的sdk热修复技术中,通常会将被反射调用的代码中抛出的异常直接兜住,然后,将兜住的异常封装为一个新的异常,并抛出该新的异常,但是上述技术方案会有以下缺点:
31.缺点一:直接兜住反射调用方法时的异常,无法区分出该异常是由于该方法本身的问题抛出的异常(例如,已知类异常,或者,可预期的异常),还是由于反射调用的错误而抛出的异常(例如,非已知类异常,或者,无法预期的异常)。针对方法本身的问题所抛出的异常,通常可以按照原有方法的处理逻辑对该异常进行处理。然而,在对该异常进行重新封装之后,将导致原有方法中可能本该抛出的异常被“吞掉”,从而导致原有方法无法按照原处理逻辑对该异常进行处理。
32.缺点二:如果在兜住异常后统一抛出新的异常,那么将很难区分出该新的异常真正产生的原因,从而会降低使用方对热修复技术的信任度;但是,如果不抛出新的异常,那么可能会导致原有方法本身所存在的问题更难被发现,导致更加严重的后果。
33.基于上述研究,本公开提供了一种软件工具开发包的热修复方法。在本公开实施例中,首先,获取反射调用的待修复方法内部所产生目标异常的异常信息;之后,可以基于该异常信息识别该目标异常的目标异常类型,从而基于该目标异常类型确定该目标异常是否为预先设置的已知类异常。针对已知类异常和非已知类异常,可以设置不同的修复处理模式,进而,基于与该目标异常类型相匹配的修复处理模式对待修复方法进行热修复处理。通过该处理方式,可以实现在热修复过程中的反射调用不会影响原有方法对异常信息的逻辑处理;同时,还可以实现对非已知类异常和已知类异常进行区分,从而可以根据识别的异常类型对待修复方法进行修复处理,以实现更加全面的对sdk进行热修复,从而保证对应应用程序的稳定运行。
34.为便于对本实施例进行理解,首先对本公开实施例所公开的一种软件工具开发包的热修复方法进行详细介绍,本公开实施例所提供的软件工具开发包的热修复方法的执行主体一般为具有一定计算能力的电子设备。
35.参见图1所示,为本公开实施例提供的一种软件工具开发包的热修复方法的流程图,所述方法包括步骤s101~s105,其中:
36.s101:获取反射调用的待修复方法内部所产生目标异常的异常信息。
37.这里,反射调用可以理解为:对于任意一个类,都可以调用该类所有的属性和方法;以及对于该类中所包含任意一个对象,都可以调用该对象的任意方法和属性。
38.在本公开实施例中,可以获取软件工具开发包sdk的修复补丁包,然后,运行该修复补丁包,其中,修复补丁包可以为对sdk进行热修复的程序,该修复补丁包通过修改sdk的类(class)文件中相应方法的方式实现对该sdk进行热修复。其中,在修改类文件中相应方法的过程中,存在着对相应方法的反射调用。
39.具体实施时,可以在sdk发开结束之后,生成修复补丁包patch,之后,可以将该修复补丁包patch投放至服务端。客户端在运行之前,可以向服务端查询是否存在该sdk的修复补丁包,并在查询到存在该修复补丁包的情况下,从服务端下载该修复补丁包,并运行该修复补丁包。其中,修复补丁包的运行过程中所执行的步骤即为本公开技术方案所提供的软件工具开发包的热修复方法的各个执行步骤。
40.这里,通过上述所描述的修复补丁包对该sdk的修复原理可知,在运行该修复补丁包的过程中,该修复补丁包会反射调用sdk的类文件中的待修复方法,以实现对该待修复方法的修改。
41.此时,可以在反射调用待修复方法的过程中,捕获待修复方法内部抛出的目标异
常的异常信息。
42.s103:基于所述异常信息识别所述目标异常的目标异常类型;其中,所述目标异常类型用于指示所述目标异常是否为预先设置的已知类异常。
43.这里,可以将目标异常的异常类型划分为已知类异常和非已知类异常;其中,已知类异常可以理解为符合预期的异常(或者为能预先预料到的异常),非已知类异常可以理解为不符合预期的异常(或者为预先无法预料的异常)。
44.针对已知类异常可以包含多种子异常类型,即下述实施例中所描述的第一已知类异常和第二已知类异常。
45.这里,第一已知类异常可以理解为:预先在待修复方法中声明的非运行时(runtime exception)异常;第二已知类异常可以理解为:未预先在待修复方法中声明的自定义的运行时异常时(runtime exception)。
46.其中,待修复方法中包含抛出关键字“throws”,可以通过为该关键字设置对应的关键内容,以通过该关键内容作为在待修复方法中声明的异常。
47.针对非已知类异常可以包含多种子异常类型,即下述实施例中所描述的第一非已知类异常和第二非已知类异常。
48.这里,第一非已知类异常可以理解为:由于被反射调用方法所运行的代码有问题所抛出的系统定义类运行时异常(runtime exception)。第二非已知类异常可以理解为由于反射调用的过程中由于所调用参数错误等原因造成的异常。
49.s105:确定与所述目标异常类型相匹配的修复处理模式,并基于所述修复处理模式对所述目标异常进行热修复处理,以实现对所述待修复方法进行热修复处理。
50.在本公开实施例中,在确定出目标异常类型之后,就可以确定与该目标异常类型相匹配的修复处理模式,其中,该修复处理模式可以用于指示对目标异常进行处理方式。针对已知类异常和非已知类异常所对应的修复处理模式不相同。
51.通过该处理方式,可以实现在热修复过程中的反射调用不会影响原有方法对异常信息的逻辑处理;同时,还可以实现对非已知类异常和已知类异常进行区分,从而可以根据识别的异常类型对待修复方法进行修复处理,以实现更加全面的对sdk进行热修复,从而保证对应应用程序的稳定运行。
52.下面将结合图2对sdk的修复过程进行简单介绍。如图2所示的为一种sdk修复方法的流程图,该修复方法具体包括以下几个过程:
53.过程1:sdk开发过程:编译待修复的sdk。
54.具体实施时,可以为sdk中可能需要修复的方法插桩,以为该需要修复的方法预留修复接口。其中,可以通过在该sdk中编写对应修复接口程序的方式为该需要修复的方法预留修复接口。之后,可以记录被插桩的方法,以便于对该被插桩的方法进行管理。
55.过程2:patch生成过程:编译生成修复补丁包patch。
56.对需要修复的方法添加注解,以通过该注解标注需要修改的位置,并识别需要修复的方法中预先声明的异常;遍历需要修复的方法,收集patch的生效信息,最终打包生成patch。
57.过程3:patch投放和客户端生效过程:
58.配置patch对应的特征;然后,将patch上传到服务端统一管理,供客户端请求下
载。运行时从客户端提取sdk特征,然后,基于该sdk特征从服务端下载各个sdk对应的patch;将所有的patch进行合并;按照本公开实施例所提供的方法运行该修复补丁包patch,以实现对所述sdk中的待修复方法进行热修复处理。
59.在一个可选的实施方式中,如图3所示,上述步骤s103基于所述异常信息识别所述目标异常的目标异常类型,具体包括如下步骤:
60.步骤s1031:在基于所述异常信息确定所述目标异常为反射异常的情况下,获取所述异常信息中目标异常字段的字段内容;其中,所述反射异常用于指示所述目标异常为将初始异常进行封装后抛出的异常;
61.步骤s1032:基于所述字段内容识别所述目标异常中被封装的初始异常的真实异常类型,并将所述真实异常类型确定为所述目标异常类型。
62.在本公开实施例中,当被反射调用的待修复方法内部抛出异常(即,上述步骤中描述的初始异常)时,由于该异常无法以统一且明确的方式进行表示,因此,该异常可以包装成反射异常invocationtargetexception,并将包装后的invocationtargetexception反射异常抛出。
63.在将初始异常进行重新封装的过程中,可以将该初始异常和该初始异常的异常类型进行封装,从而得到一个包含该初始异常和异常类型的新异常,即反射异常invocationtargetexception。
64.因此,可以在获取到目标异常的异常信息之后,可以基于该异常信息确定目标异常是否为反射异常invocationtargetexception。如果确定出反射异常invocationtargetexception,那么可以提取该invocationtargetexception中的目标异常字段target exception的字段内容。
65.这里,目标异常字段target exception可以用于指示被反射调用的待修复方法内部抛出的未经过封装的异常(即,初始异常)的真实异常类型。
66.基于此,可以在反射异常invocationtargetexception中查找目标异常字段target exception,并提取该目标异常字段target exception的字段内容,从而基于提取到的字段内容识别该初始异常的真实异常类型。然后,将该真实异常类型确定为上述目标异常类型。
67.上述实施方式中,通过目标异常字段的字段内容识别被反射调用的待修复方法内部抛出的初始异常的真实异常类型的方式,可以更加准确快速的识别待修复方法抛出的真实异常类型,从而可以实现针对不同类型的异常按照不同的修复处理模式进行修复处理,进而可以在不影响原有代码逻辑的影响下对sdk中的待修复方法进行修复,便于后续的问题分析和处理。
68.在一个可选的实施方式中,上述步骤s1032基于所述字段内容识别所述目标异常中被封装的初始异常的真实异常类型,具体包括如下步骤:
69.s11:获取所述待修复方法中预先声明的预设异常类型;
70.s12:在确定所述字段内容所指示的异常类型为所述预设异常类型的情况下,确定所述初始异常的真实异常类型为第一已知类异常。
71.在本公开实施例中,在生成修复补丁包的过程中,可以将每个待修复方法中预先声明的异常类型(也即,预设异常类型)设置在该修复补丁包中与该待修复方法相对应的位
置处。例如,可以将该预设异常类型通过对应字符串数组的方式设置在修复补丁包中。其中,每个待修复方法中预先声明的异常类型通常为非运行时异常runtimeexception。
72.在识别上述真实异常类型的过程中,可以在修复补丁包中获取用于指示该待修复方法中预先声明的预设异常类型的字符串数组。如果确定目标异常字段target exception的字段内容所指示的异常类型为上述获取到的字符串数组中的一个,则可以确定所指示的异常类型为待修复方法中预先声明的非运行时异常runtimeexception(也即预设异常类型)中的一个。此时,可以确定初始异常的真实异常类型为被反射调用的方法(即待修复方法)中通过抛出关键字throws声明的可能会抛出的预期中异常(即,第一已知类异常)。
73.在确定出初始异常的真实异常类型为第一已知类异常的情况下,可以将所述目标异常的异常信息抛出。例如,可以将该目标异常的异常信息抛出至异常存放池,其中,sdk中用于处理该目标异常的方法可以在异常存放池中获取该异常信息,并对该目标异常进行处理。
74.在一个可选的实施方式中,上述步骤s1032基于所述字段内容识别所述目标异常中被封装的初始异常的真实异常类型,具体包括如下步骤:
75.s21:在确定所述字段内容所指示的异常类型为运行时异常,且所述运行时异常不是预先定义的运行时异常的情况下,确定所述初始异常的真实异常类型为第二已知类异常。
76.在本公开实施例中,如果确定目标异常字段target exception的字段内容所指示的异常类型并未在抛出关键字throws中声明,且确定目标异常字段target exception的字段内容所指示的异常类型为runtimeexception(运行时异常),其中,该runtimeexception(运行时异常)为自定义的runtimeexception,那么可以确定该runtimeexception不是预先定义的运行时异常,那么可以确定初始异常的真实异常类型为被反射调用的方法抛出的异常为述第二已知类异常。
77.具体实施时,可以确定目标异常字段target exception的字段内容所指示的runtimeexception运行时异常是否是以java.lang开头的异常,例如,java.lang.runtimeexception异常。如果确定出不是,则可以确定该运行时异常为自定义的runtimeexception,或者,非系统定义的runtimeexception。
78.在确定出初始异常的真实异常类型为第二已知类异常的情况下,可以将所述目标异常的异常信息抛出。例如,可以将该目标异常的异常信息抛出至异常存放池,其中,sdk中用于处理该目标异常的方法可以在异常存放池中获取该异常信息,并对该目标异常进行处理。
79.在一个可选的实施方式中,上述步骤s1032基于所述字段内容识别所述目标异常中被封装的初始异常的真实异常类型,具体包括如下步骤:
80.s31:在确定所述字段内容所指示的异常类型为运行时异常,且所述运行时异常是预先定义的运行时异常的情况下,确定所述初始异常的真实异常类型为第一非已知类异常。
81.在本公开实施例中,如果确定目标异常字段target exception的字段内容所指示的异常类型为运行时异常runtimeexception,且为系统定义的runtimeexception(即,预先定义的运行时异常),那么可以确定该异常是被反射调用的方法的逻辑异常(或者,代码异
常)造成的非预期异常(即,第一非已知类异常)。
82.具体实施时,可以确定目标异常字段target exception的字段内容所指示的runtimeexception运行时异常是否是以java.lang开头的异常,例如,java.lang.runtimeexception异常。如果确定是,则可以确定该运行时异常为自定义的系统定义的runtimeexception。
83.在确定出初始异常的真实异常类型第一非已知类异常的情况下,可以重新定义一个包含该异常信息的新异常信息抛出,方便后续过滤出抛出非预期异常的情况,同时可以为确定真正异常的原因提供基础信息。
84.在一个可选的实施方式中,上述步骤s103基于所述异常信息识别所述目标异常的目标异常类型,具体包括如下步骤:
85.s41:在基于所述异常信息确定所述目标异常不是反射异常的情况下,确定所述目标异常的异常类型为第二非已知类异常;其中,所述反射异常用于指示所述目标异常为将初始异常进行封装后抛出的异常。
86.在本公开实施例中,当被反射调用的待修复方法内部抛出异常(即,上述步骤中描述的初始异常)时,由于该异常无法以统一且明确的方式进行表示,因此,该异常可以包装成反射异常invocationtargetexception,并将包装后的invocationtargetexception反射异常抛出。
87.在将初始异常进行重新封装的过程中,可以将该初始异常和该初始异常的异常类型进行封装,从而得到一个包含该初始异常和异常类型的新异常,即反射异常invocationtargetexception。
88.在本公开实施例中,可以在获取到目标异常的异常信息之后,基于该异常信息确定目标异常是否为反射异常invocationtargetexception。如果基于该异常信息确定目标异常不是invocationtargetexception类型的异常,则可以将该目标异常确定为第二非已知类异常。
89.这里,可以非invocationtargetexception类型的异常可以为由于反射调用的参数,方法名等信息等错误造成的异常。
90.在确定出初始异常的真实异常类型第二非已知类异常的情况下,可以重新定义一个包含该异常信息的新异常信息抛出,方便后续过滤出抛出非预期异常的情况,同时可以为确定真正异常的原因提供基础信息。
91.上述实施方式中,可以实现在热修复过程中的反射调用不会影响原有方法对异常信息的逻辑处理;同时,还可以实现对非已知类异常和已知类异常进行区分,从而可以根据识别的异常类型对待修复方法进行修复处理,以实现更加全面的对sdk进行热修复,从而保证对应应用程序的稳定运行。
92.在一个可选的实施方式中,如图4所示,上述步骤s105确定与所述目标异常类型相匹配的修复处理模式,并基于所述修复处理模式对所述目标异常进行热修复处理,具体包括如下步骤:
93.步骤s1051:在确定所述目标异常类型为已知类异常的情况下,将所述目标异常的异常信息抛出。
94.在本公开实施例中,在确定出初始异常的真实异常类型为第一已知类异常或者为
第二已知类异常的情况下,可以将目标异常的异常信息抛出。例如,可以将该目标异常的异常信息抛出至异常存放池,其中,sdk中用于处理该目标异常的方法可以在异常存放池中获取该异常信息,并对该目标异常进行处理。
95.步骤s1052:在确定所述目标异常类型为非已知类异常的情况下,基于所述目标异常的异常信息生成新异常信息,并将所述新异常信息抛出;其中,所述新异常信息所指示异常的类型为非已知类异常。
96.在本公开实施例中,在确定出初始异常的真实异常类型第一非已知类异常或者为第二非已知类异常的情况下,可以重新定义一个包含该异常信息的新异常信息抛出,方便后续过滤出抛出非预期异常的情况,同时可以为确定真正异常的原因提供基础信息。
97.具体实施时,可以生成一个新的异常信息,该新的异常信息的信息内容为上述目标异常的异常信息,同时,还可以为该新的异常信息添加异常类型标识,以通过该异常类型标识指示该新的异常信息所指示的异常为非已知类异常。除此之外,还可以通过该异常类型标识指示该非已知类异常的异常特征。例如,针对第一非已知类异常,该异常类型标识中可以包含用于指示以下信息的子标识:系统定义的runtimeexception;针对第二非已知类异常,该异常类型标识中可以包含用于指示以下信息的子标识:参数错误的子标识、方法名错误的子标识等子标识。
98.上述实施方式中,通过将被反射调用的方法中可能抛出的异常划分为多种类型,即已知类异常和非已知类异常,可以实现对不同类型的异常进行不同的修复处理。比如,对预期中可能抛出的异常(已知类异常)可以不做处理,从而不影响代码本身的逻辑;对非预期中的异常(非已知类异常)做统一的处理,可以方便后续问题的快速过滤、发现,以及根据被包装好的原有异常找出真正的错误原因。
99.在本公开实施例中,在如图1所述实施例的基础上,如图5所示,该方法还包括如下步骤:
100.s1001:在所述待修复方法所对应的类文件中查找所述待修复方法中声明的预设异常类型;
101.s1002:对所述预设异常类型的类型名称进行混淆处理,得到名称混淆结果;
102.s1003:基于所述名称混淆结果和所述待修复方法的方法信息,生成所述sdk的修复补丁包。
103.在本公开实施例中,在对软件工具开发包sdk进行修复之前,需要生成修复补丁包。在生成的修复补丁包中包含该修复补丁包所修复的方法(即,上述待修复方法)中预先声明的预设异常类型。在此基础上,运行该修复补丁包时,该修复补丁包可以基于该待修复方法中预先声明的预设异常类型来确定该目标异常的真实异常类型,从而基于该真实异常类型做出合理的修复处理。
104.通过上述描述可知,在修复补丁包patch生成过程中,可以在源程序中对需要待修复方法添加注解,以通过该注解在源程序中标注需要修改的位置;之后,可以基于该注解识别源程序中待修复方法,并在待修复方法所对应的类class文件中识别该待修复方法中预先声明的异常,即预设异常类型。接下来,可以对预设异常类型的类型名称进行混淆处理,得到名称混淆结果;其中,该名称混淆结果可以为客户端能够识别的名称。最后,就可以将该名称混淆结果和待修复方法的方法信息(例如,方法参数信息、方法名称等信息)添加至
修复补丁包中。
105.在一个可选的实施方式中,上述步骤s1001在所述待修复方法所对应的类文件中查找所述待修复方法中声明的预设异常类型,具体包括如下步骤:
106.(1)、在所述类文件中查找与所述待修复方法相对应的文件内容;
107.(2)、在所述文件内容中查找抛出关键字,并将所述抛出关键字所对应的关键内容确定为所述预设异常类型。
108.在本公开实施例中,可以识别出待修复方法在class(类)文件中对应的文件内容,从而基于该文件内容找到声明的可能被抛出关键字throws(抛出)的异常结构,可以在该异常结构中确定出所有可能被声明抛出的异常(即,预设异常类型)的名字,将上述名字根据混淆规则翻译成客户端能够识别的名称。最后,将被翻译后的名称组成字符串数组,然后连同方法名,方法参数等信息一起添加至修复补丁包中。
109.下面结合图6对软件工具开发包的热修复方法进行介绍。如图6所示的为另一种软件工具开发包的热修复方法的流程图,如图6所示,该方法具体包括如下步骤:
110.s601:在所述类文件中查找与待修复方法相对应的文件内容,并基于确定待修复方法中预先声明的预设异常类型;
111.在本公开实施例中,可以识别出待修复方法在class(类)文件中对应的文件内容,从而基于该文件内容找到声明的可能被抛出关键字throws(抛出)的异常结构,可以在该异常结构中确定出所有可能被声明抛出的异常(即,预设异常类型)的名字,将上述名字根据混淆规则翻译成客户端能够识别的名称。最后,将被翻译后的名称组成字符串数组,然后连同方法名,方法参数等信息一起添加至修复补丁包中。
112.s602:对所述预设异常类型的类型名称进行混淆处理,得到名称混淆结果;
113.s603:基于所述名称混淆结果和所述待修复方法的方法信息,生成所述sdk的修复补丁包。
114.接下来,可以对预设异常类型的类型名称进行混淆处理,得到名称混淆结果;其中,该名称混淆结果可以为客户端能够识别的名称。最后,就可以将该名称混淆结果和待修复方法的方法信息(例如,方法参数信息、方法名称等信息)添加至修复补丁包中。
115.s604:运行修复补丁包,获取反射调用的待修复方法内部所产生目标异常的异常信息;
116.s605:在基于异常信息确定所述目标异常为反射异常的情况下,获取异常信息中目标异常字段的字段内容;
117.s606:在确定字段内容所指示的异常类型为待修复方法中预先声明的预设异常类型的情况下,确定目标异常类型为第一已知类异常;之后,可以执行s610将所述目标异常的异常信息抛出。
118.在本公开实施例中,在生成修复补丁包的过程中,可以将每个待修复方法中预先声明的异常类型(也即,预设异常类型)设置在该修复补丁包中与该待修复方法相对应的位置处。例如,可以将该预设异常类型通过对应字符串数组的方式设置在修复补丁包中。其中,每个待修复方法中预先声明的异常类型通常为非运行时异常runtimeexception。
119.在识别上述真实异常类型的过程中,可以在修复补丁包中获取用于指示该待修复方法中预先声明的预设异常类型的字符串数组。如果确定目标异常字段target exception
的字段内容所指示的异常类型为上述获取到的字符串数组中的一个,则可以确定所指示的异常类型为待修复方法中预先声明的非运行时异常runtimeexception(也即预设异常类型)中的一个。此时,可以确定初始异常的真实异常类型为被反射调用的方法(即待修复方法)中通过抛出关键字throws声明的可能会抛出的预期中异常(即,第一已知类异常)。
120.s607:在确定字段内容所指示的异常类型为运行时异常,且运行时异常不是预先定义的运行时异常的情况下,确定目标异常类型为第二已知类异常;之后,可以执行s610将所述目标异常的异常信息抛出。
121.在本公开实施例中,如果确定目标异常字段target exception的字段内容所指示的异常类型并未在抛出关键字throws中声明,且确定目标异常字段target exception的字段内容所指示的异常类型为runtimeexception(运行时异常),其中,该runtimeexception(运行时异常)为自定义的runtimeexception,那么可以确定该runtimeexception不是预先定义的运行时异常,那么可以确定初始异常的真实异常类型为被反射调用的方法抛出的异常为述第二已知类异常。
122.具体实施时,可以确定目标异常字段target exception的字段内容所指示的runtimeexception运行时异常是否是以java.lang开头的异常:java.lang.runtimeexception异常。如果确定出不是,则可以确定该运行时异常为自定义的runtimeexception,或者,非系统定义的runtimeexception。
123.s608:在确定字段内容所指示的异常类型为运行时异常,且运行时异常是预先定义的运行时异常的情况下,确定目标异常类型为第一非已知类异常;之后,可以执行s611基于所述目标异常的异常信息生成新异常信息,并将所述新异常信息抛出。
124.在本公开实施例中,如果确定目标异常字段target exception的字段内容所指示的异常类型为运行时异常runtimeexception,且为系统定义的runtimeexception(即,预先定义的运行时异常),那么可以确定该异常是被反射调用的方法的逻辑异常(或者,代码异常)造成的非预期异常(即,第一非已知类异常)。
125.具体实施时,可以确定目标异常字段target exception的字段内容所指示的runtimeexception运行时异常是否是以java.lang开头的异常:java.lang.runtimeexception异常。如果确定是,则可以确定该运行时异常为自定义的系统定义的runtimeexception。
126.s609:在基于异常信息确定所述目标异常不是反射异常的情况下,确定目标异常的异常类型为第二非已知类异常;其中,所述反射异常用于指示所述目标异常为将初始异常进行封装后抛出的异常;之后,可以执行s611基于所述目标异常的异常信息生成新异常信息,并将所述新异常信息抛出;
127.在本公开实施例中,当被反射调用的待修复方法内部抛出异常(即,上述步骤中描述的初始异常)时,由于该异常无法以统一且明确的方式进行表示,因此,该异常可以包装成反射异常invocationtargetexception,并将包装后的invocationtargetexception反射异常抛出。
128.在将初始异常进行重新封装的过程中,可以将该初始异常和该初始异常的异常类型进行封装,从而得到一个包含该初始异常和异常类型的新异常,即反射异常invocationtargetexception。
129.在本公开实施例中,可以在获取到目标异常的异常信息之后,基于该异常信息确定目标异常是否为反射异常invocationtargetexception。如果基于该异常信息确定目标异常不是invocationtargetexception类型的异常,则可以将该目标异常确定为第二非已知类异常。
130.s610:将所述目标异常的异常信息抛出。
131.在本公开实施例中,在确定出初始异常的真实异常类型为第一已知类异常或者为第二已知类异常的情况下,可以将目标异常的异常信息抛出。例如,可以将该目标异常的异常信息抛出至异常存放池,其中,sdk中用于处理该目标异常的方法可以在异常存放池中获取该异常信息,并对该目标异常进行处理。
132.s611:基于所述目标异常的异常信息生成新异常信息,并将所述新异常信息抛出;其中,所述新异常信息所指示异常的类型为非已知类异常。
133.在本公开实施例中,在确定出初始异常的真实异常类型第一非已知类异常或者为第二非已知类异常的情况下,可以重新定义一个包含该异常信息的新异常信息抛出,方便后续过滤出抛出非预期异常的情况,同时可以为确定真正异常的原因提供基础信息。
134.本领域技术人员可以理解,在具体实施方式的上述方法中,各步骤的撰写顺序并不意味着严格的执行顺序而对实施过程构成任何限定,各步骤的具体执行顺序应当以其功能和可能的内在逻辑确定。
135.基于同一发明构思,本公开实施例中还提供了与软件工具开发包的热修复方法对应的软件工具开发包热修复装置,由于本公开实施例中的装置解决问题的原理与本公开实施例上述软件工具开发包的热修复方法相似,因此装置的实施可以参见方法的实施,重复之处不再赘述。
136.参照图7所示,为本公开实施例提供的一种软件工具开发包热修复装置的示意图,所述装置包括:获取单元10、识别单元20、确定单元30和热修复单元40;其中,
137.获取单元10,用于获取反射调用的待修复方法内部所产生目标异常的异常信息;
138.识别单元20,用于基于所述异常信息识别所述目标异常的目标异常类型;其中,所述目标异常类型用于指示所述目标异常是否为预先设置的已知类异常;
139.确定单元30,用于确定与所述目标异常类型相匹配的修复处理模式;
140.热修复单元40,用于基于所述修复处理模式对所述目标异常进行热修复处理,以实现对所述待修复方法进行热修复处理。
141.通过该处理方式,可以实现在热修复过程中的反射调用不会影响原有方法对异常信息的逻辑处理;同时,还可以实现对非已知类异常和已知类异常进行区分,从而可以根据识别的异常类型对待修复方法进行修复处理,以实现更加全面的对sdk进行热修复,从而保证对应应用程序的稳定运行。
142.一种可能的实施方式中,识别单元,还用于:在基于所述异常信息确定所述目标异常为反射异常的情况下,获取所述异常信息中目标异常字段的字段内容;其中,所述反射异常用于指示所述目标异常为将初始异常进行封装后抛出的异常;基于所述字段内容识别所述目标异常中被封装的初始异常的真实异常类型,并将所述真实异常类型确定为所述目标异常类型。
143.一种可能的实施方式中,识别单元,还用于:获取所述待修复方法中预先声明的预
设异常类型;在确定所述字段内容所指示的异常类型为所述预设异常类型的情况下,确定所述初始异常的真实异常类型为第一已知类异常。
144.一种可能的实施方式中,识别单元,还用于:在确定所述字段内容所指示的异常类型为运行时异常,且所述运行时异常不是预先定义的运行时异常的情况下,确定所述初始异常的真实异常类型为第二已知类异常。
145.一种可能的实施方式中,识别单元,还用于:在确定所述字段内容所指示的异常类型为运行时异常,且所述运行时异常是预先定义的运行时异常的情况下,确定所述初始异常的真实异常类型为第一非已知类异常。
146.一种可能的实施方式中,识别单元,还用于:在基于所述异常信息确定所述目标异常不是反射异常的情况下,确定所述目标异常的异常类型为第二非已知类异常;其中,所述反射异常用于指示所述目标异常为将初始异常进行封装后抛出的异常。
147.一种可能的实施方式中,热修复单元,还用于:在确定所述目标异常类型为已知类异常的情况下,将所述目标异常的异常信息抛出;或者,在确定所述目标异常类型为非已知类异常的情况下,基于所述目标异常的异常信息生成新异常信息,并将所述新异常信息抛出;其中,所述新异常信息所指示异常的类型为非已知类异常。
148.关于装置中的各模块的处理流程、以及各模块之间的交互流程的描述可以参照上述方法实施例中的相关说明,这里不再详述。
149.对应于图1中的软件工具开发包的热修复方法,本公开实施例还提供了一种电子设备800,如图8所示,为本公开实施例提供的电子设备800结构示意图,包括:
150.处理器81、存储器82、和总线83;存储器82用于存储执行指令,包括内存821和外部存储器822;这里的内存821也称内存储器,用于暂时存放处理器81中的运算数据,以及与硬盘等外部存储器822交换的数据,处理器81通过内存821与外部存储器822进行数据交换,当所述电子设备800运行时,所述处理器81与所述存储器82之间通过总线83通信,使得所述处理器81执行以下指令:
151.获取反射调用的待修复方法内部所产生目标异常的异常信息;
152.基于所述异常信息识别所述目标异常的目标异常类型;其中,所述目标异常类型用于指示所述目标异常是否为预先设置的已知类异常;
153.确定与所述目标异常类型相匹配的修复处理模式,并基于所述修复处理模式对所述目标异常进行热修复处理,以实现对所述待修复方法进行热修复处理。
154.本公开实施例还提供一种计算机可读存储介质,该计算机可读存储介质上存储有计算机程序,该计算机程序被处理器运行时执行上述方法实施例中所述的软件工具开发包的热修复方法的步骤。其中,该存储介质可以是易失性或非易失的计算机可读取存储介质。
155.本公开实施例还提供一种计算机程序产品,该计算机程序产品承载有程序代码,所述程序代码包括的指令可用于执行上述方法实施例中所述的软件工具开发包的热修复方法的步骤,具体可参见上述方法实施例,在此不再赘述。
156.其中,上述计算机程序产品可以具体通过硬件、软件或其结合的方式实现。在一个可选实施例中,所述计算机程序产品具体体现为计算机存储介质,在另一个可选实施例中,计算机程序产品具体体现为软件产品,例如软件开发包(software development kit,sdk)等等。
157.所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统和装置的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。在本公开所提供的几个实施例中,应该理解到,所揭露的系统、装置和方法,可以通过其它的方式实现。以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,又例如,多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些通信接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
158.所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
159.另外,在本公开各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。
160.所述功能如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个处理器可执行的非易失的计算机可读取存储介质中。基于这样的理解,本公开的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本公开各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:u盘、移动硬盘、只读存储器(read-only memory,rom)、随机存取存储器(random access memory,ram)、磁碟或者光盘等各种可以存储程序代码的介质。
161.最后应说明的是:以上所述实施例,仅为本公开的具体实施方式,用以说明本公开的技术方案,而非对其限制,本公开的保护范围并不局限于此,尽管参照前述实施例对本公开进行了详细的说明,本领域的普通技术人员应当理解:任何熟悉本技术领域的技术人员在本公开揭露的技术范围内,其依然可以对前述实施例所记载的技术方案进行修改或可轻易想到变化,或者对其中部分技术特征进行等同替换;而这些修改、变化或者替换,并不使相应技术方案的本质脱离本公开实施例技术方案的精神和范围,都应涵盖在本公开的保护范围之内。因此,本公开的保护范围应所述以权利要求的保护范围为准。
再多了解一些

本文用于创业者技术爱好者查询,仅供学习研究,如用于商业用途,请联系技术所有人。

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

相关文献