具体实施方式
为使本公开实施例的目的、技术方案和优点更加清楚,下面将结合本公开实施例中附图,对本公开实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本公开一部分实施例,而不是全部的实施例。通常在此处附图中描述和示出的本公开实施例的组件可以以各种不同的配置来布置和设计。因此,以下对在附图中提供的本公开的实施例的详细描述并非旨在限制要求保护的本公开的范围,而是仅仅表示本公开的选定实施例。基于本公开的实施例,本领域技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都属于本公开保护的范围。
应注意到:相似的标号和字母在下面的附图中表示类似项,因此,一旦某一项在一个附图中被定义,则在随后的附图中不需要对其进行进一步定义和解释。
本文中术语“和/或”,仅仅是描述一种关联关系,表示可以存在三种关系,例如,A和/或B,可以表示:单独存在A,同时存在A和B,单独存在B这三种情况。另外,本文中术语“至少一种”表示多种中的任意一种或多种中的至少两种的任意组合,例如,包括A、B、C中的至少一种,可以表示包括从A、B和C构成的集合中选择的任意一个或多个元素。
经研究发现,在现有的针对Flutter应用的修复方案中,在针对该Flutter应用中的待修复功能进行代码修改得到补丁包后,再将该补丁包上传至应用商店,以使用户从应用商店下载该补丁包,从而完成该Flutter应用中的待修复功能的修复。因此,现有的修复方案整个流程较为冗长,修复效率较低。
基于上述研究,本公开提供了一种应用程序的修复方法、装置、计算机设备以及存储介质,在本公开实施例中,首先检测针对Flutter应用中的目标功能的功能调用请求,并基于该功能调用请求在Flutter应用的本地文件中查找该目标功能的目标字节码文件,在查找到该目标字节码文件的情况下,就可以运行该目标字节码文件,以实现执行修复对应功能缺陷之后的目标功能,从而缩短了修复Flutter应用的功能缺陷的流程,提高了修复效率,进而提高了用户的使用体验。
为便于对本实施例进行理解,首先对本公开实施例所公开的一种应用程序的修复方法进行详细介绍,本公开实施例所提供的应用程序的修复方法的执行主体一般为具有一定计算能力的计算机设备。在一些可能的实现方式中,该应用程序的修复方法可以通过处理器调用存储器中存储的计算机可读指令的方式来实现。
参见图1所示,为本公开实施例提供的一种应用程序的修复方法的流程图,应用于Flutter应用,所述方法包括步骤S101~S105,其中:
S101:检测针对所述Flutter应用中的目标功能的功能调用请求。
在本公开实施例中,上述Flutter应用为基于可跨平台开发的Flutter框架开发的应用程序,该Flutter应用中包含实现不同指定功能的方法。例如,该Flutter应用可以为资讯浏览类应用程序,其中,该Flutter应用包含以下指定功能:资讯浏览,短视频浏览,影视放映,小程序等。
这里,用户在使用该Flutter应用时,可以通过功能调用请求对Flutter应用中的目标功能进行调用,从而实现该Flutter应用的目标功能。例如,在上述目标功能为该Flutter应用中的小程序的情况下,在检测到针对该小程序的调用操作后,就可以将该小程序确定为目标功能,并确定检测到针对该目标功能的功能调用请求。
S103:基于检测到的所述功能调用请求在所述Flutter应用的本地文件中查找所述目标功能的目标字节码文件;其中,所述目标字节码文件中包含用于修复所述目标功能的对应功能缺陷的字节码。
在本公开实施例中,首先需要查询Flutter应用的本地文件,并确定该本地文件中是否包含上述目标功能所对应的目标字节码文件。需要说明的是,在该目标功能产生功能缺陷的情况下,技术人员可以编写用于修复该目标功能所对应功能缺陷的修复代码,并将基于该修复代码生成对应的目标字节码文件,然后将该目标字节码文件下发至Flutter应用。因此,在运行该Flutter应用的目标功能之前,需要首先在Flutter应用的本地文件中查找该目标功能的目标字节码文件。
具体实施时,可以通过以下几种方式查找上述目标功能的目标字节码文件:
方式一:
在本公开实施例中,上述Flutter应用的本地文件中包含不同的子文件,其中,每个子文件可以对应该Flutter应用中的至少一个指定功能。因此,在查找上述目标功能的目标字节码文件时,首先可以确定该目标功能在Flutter应用的本地文件中所对应的目标子文件,并对该目标子文件进行遍历,从而确定该目标子文件中是否包含该目标功能的目标字节码文件。
方式二:
在本公开实施例中,上述Flutter应用的本地文件中包含字节码文件,该字节码文件用于存储服务器发送的字节码文件。因此,在在查找上述目标功能的目标字节码文件时,首先可以基于上述功能调用请求确定目标功能的功能标识,并根据该功能标识在上述Flutter应用的字节码文件中进行查找,从而确定出字节码文件中是否包含和该功能标识相对应的目标字节码文件。
S105:在查找到所述目标功能的目标字节码文件的情况下,运行所述目标功能的字节码文件,以实现执行修复对应功能缺陷之后的目标功能。
在本公开实施例中,在查找到上述目标功能的目标字节码文件的情况下,就可以通过运行该目标字节码文件的方式实现该目标功能。具体实施时,可以将该目标字节码加载到虚拟机中,并通过该虚拟机实现字节码解释器的功能,对该目标字节码进行运行,从而实现上述目标功能。
通过上述描述可知,在本公开实施例中,首先检测针对Flutter应用中的目标功能的功能调用请求,并基于该功能调用请求在Flutter应用的本地文件中查找该目标功能的目标字节码文件,在查找到该目标字节码文件的情况下,就可以运行该目标字节码文件,以实现执行修复对应功能缺陷之后的目标功能,从而缩短了修复Flutter应用的功能缺陷的流程,提高了修复效率,进而提高了用户的使用体验。
在一个可选的实施方式中,所述方法还包括如下过程:
(1)、在检测对所述Flutter应用中的目标功能的功能调用请求之后,获取服务器发送的所述目标功能的目标字节码文件;
(2)、将所述目标功能的目标字节码文件保存在所述本地文件的指定存储位置。
在本公开实施例中,在获取到服务器发送的目标功能的目标字节码文件后,就可以确定该目标字节码文件在本地文件中的指定存储位置。具体实施时,对应上述查找目标功能的目标字节码文件的几种方式,包括以下几种情况:
情况一:
在本公开实施例中,对应上述方式一中提到的:上述Flutter应用的本地文件中包含不同的子文件,其中,每个子文件可以对应该Flutter应用中的至少一个指定功能。因此,在确定上述目标功能的目标字节码文件的指定存储位置时,首先可以确定该目标功能所在本地文件中所对应的目标子文件的存储目录,并在该存储目录下生成上述目标字节码文件的指定存储位置,从而将该目标字节码文件存储在该目标子文件中。
情况二:
在本公开实施例中,对应上述方式二中提到的:上述Flutter应用的本地文件中包含字节码文件,该字节码文件用于存储服务器发送的字节码文件。因此,在确定上述目标功能的目标字节码文件的指定存储位置时,首先可以获取该字节码文件在本地文件中所对应的存储目录,并在该存储目录下生成上述目标字节码文件的指定存储位置,从而将该目标字节码文件存储在该字节码文件中。
通过上述描述可知,在获取到服务器发送的目标功能的目标字节码文件之后,就可以将该目标字节码文件保存到本地文件的指定存储位置,从而便于根据功能调用请求,从指定存储位置调用该目标字节码文件。
在一个可选的实施方式中,上述将所述目标功能的目标字节码文件保存在上述本地文件的指定存储位置,具体包括如下过程:
(1)、在所述本地文件中查找所述目标功能的历史字节码文件;
(2)、在查找到所述历史字节码文件的情况下,删除所述历史字节码文件,并将所述目标字节码文件保存在所述本地文件的指定存储位置。
在本公开实施例中,在对上述目标字节码文件进行保存之前,首先可以确定上述目标功能在本地文件中是否存在历史版本的历史字节码文件。
具体实施时,首先可以确定上述目标字节码文件在本地文件中的指定存储位置,在该指定存储位置存在其他字节码文件的情况下,则确定目标功能在本地文件中存在历史版本的历史字节码文件,然后,就可以删除该历史字节码文件,并将上述目标字节码文件保存在该指定存储位置。
另外的,在上述指定存储位置不存在其他字节码文件的情况下,还可以对该指定位置所属的存储目录进行查询,从而确定该存储目录下是否存在目标功能的历史字节码文件。在该存储目录下存在目标功能的历史字节码文件的情况下,就可以删除该历史字节码文件,并将上述目标字节码文件保存在上述指定存储位置。
通过上述描述可知,在将对上述目标字节码文件进行保存之前,首先可以确定上述目标功能在本地文件中是否存在历史版本的历史字节码文件,并在本地文件中存在历史版本的历史字节码文件的情况下,删除该历史字节码文件,从而节省本地文件的存储空间,并减少了可能出现的,由于存在多个版本的字节码文件造成的调用字节码文件错误的情况。
在一个可选的实施方式中,参见图2所示,上述S103,基于检测到的功能调用请求在Flutter应用的本地文件中查找目标功能的目标字节码文件,具体包括如下过程:
S1031:在所述功能调用请求中获取所述目标功能的功能标识。
在本公开实施例中,首先基于上述功能调用请求,获取目标功能的功能标识,其中,该功能标识可以为该目标功能的功能id。
S1032:获取目标映射文件;其中,所述目标映射文件中包含所述Flutter应用的指定功能的功能标识和字节码标识之间的映射关系,所述字节码标识用于指示对应指定功能是否存在相应的字节码文件。
在本公开实施例中,可以为上述Flutter应用建立目标映射文件。这里,该目标映射文件中可以包含映射表,其中,该映射表用于指示Flutter应用中的指定功能的功能标识和字节码标识之间的映射关系。
这里,上述映射表中的映射关系是实时更新的,具体实施时,在接收到服务器发送的字节码文件后,就可以获取该字节码文件的字节码标识,并根据该字节码标识确定该字节码所对应的指定功能,然后,就可以基于该字节码标识,在上述映射表中更新该指定功能的映射关系。另外的,该映射表中还可以包含本地文件中存储字节码文件的指定位置,从而便于直接查找该字节码文件。
在本公开实施例中,在获取到上述目标功能的功能标识后,就可以获取上述映射表,并根据该目标功能的功能标识在映射表中查找该目标功能是否有对应的映射关系。
S1033:在所述目标映射文件中查找与所述目标功能的功能标识相对应的目标映射数据,并在基于所述目标映射数据确定所述本地文件中存在所述目标功能的目标字节码文件的情况下,在所述本地文件的指定位置中查找所述目标功能的目标字节码文件。
在本公开实施例中,首先可以确定与目标功能的功能标识相对应的目标映射数据,并基于该目标映射数据确定该目标功能所对应的映射关系。
具体实施时,可以基于上述目标映射数据确定目标功能是否有对应的映射关系,这里,可以基于映射关系标识来确定该目标功能是否有对应的映射关系。在该目标功能所对应的映射关系标识为1时,则确定该目标功能有对应的映射关系,在该目标功能所对应的映射关系标识为0时,则确定该目标功能没有对应的映射关系。
在确定出上述目标功能没有对应的映射关系后,就可以确定该目标功能没有对应的目标字节码文件。另外的,在确定出上述目标功能有对应的映射关系后,就可以确定该目标功能有对应的目标字节码文件,然后,就可以基于上述目标映射数据,确定本地文件中存储该目标字节码文件的指定位置,并基于该指定位置查找上述目标字节码文件。
通过上述描述可知,在检测到针对目标功能的功能调用请求后,就可以基于目标映射文件查找与该目标功能相对应的目标映射数据,并根据该目标映射数据查找目标功能所对应的目标字节码文件,从而提高了查找目标字节码文件的效率,进而提高了设备的响应速度。
在一个可选的实施方式中,上述S103,基于检测到的所述功能调用请求在所述Flutter应用的本地文件中查找所述目标功能的目标字节码文件,还包括如下过程:
(1)、在所述本地文件中查找到所述目标功能的多个版本的字节码文件的情况下,基于所述功能调用请求确定当前时刻所需要调用的目标功能的版本标识;
(2)、在所述多个版本的字节码文件中确定与所述版本标识相匹配的字节码文件作为所述目标功能的目标字节码文件。
在本公开实施例中,在上述目标功能经历过多次Flutter应用的版本更新和/或功能修复的情况下,每次版本更新或者功能修复后Flutter应用都会收到对应的字节码文件,因此,上述目标功能在本地文件中可以包含多个版本的字节码文件。
在本地文件中查找到目标功能的多个版本的字节码文件的情况下,首先需要确定功能调用请求所指示调用的目标功能的版本标识,其中,该版本标识可以用于指示对应的目标功能的版本更新时间。
在一种可选的实施方式中,上述功能调用请求所指示调用的目标功能的版本标识默认为最近一次版本更新所对应的版本标识,例如,目标功能所对应的多个版本的版本标识所指示的版本更新时间分别为2021.12.3、2021.12.31以及2022.2.1,那么,上述功能调用请求所指示调用的目标功能的版本标识所指示的版本更新时间就可以为2022.2.1。
在另一种可选的实施方式中,上述功能调用请求所指示调用的目标功能的版本标识还可以为指向性的,可以指示目标功能所对应的全部版本中的任一版本的版本标识。
具体实施时,用户在针对目标功能进行调用之前,可以在目标功能所对应的多个版本中选择想要调用的目标版本,并针对该目标版本发起功能调用请求。因此,在确定出该功能调用请求所指示调用的目标功能的版本标识后,就可以在多个版本的字节码文件中确定与该版本标识相匹配的字节码文件作为目标字节码文件。
另外的,在上述目标功能所对应的多个版本的字节码文件中包含失效字节码文件的情况下,还可以优先判断功能调用请求所指示调用的目标字节码文件是否有效,从而避免运行失效字节码文件造成的和Flutter应用之间的版本冲突。这里,失效字节码文件可以由开发人员进行确定,在确定出失效字节码文件之后,就可以通过服务器向Flutter应用发送禁用指令,以使该Flutter应用基于禁用指令,将该禁用指令所指示的字节码文件确定为失效字节码文件。
通过上述描述可知,在目标功能对应多个版本的字节码文件的情况下,可以通过功能调用请求确定出需要调用的目标字节码文件,从而使得用户可以自行选择想要运行的版本,提高了用户的操作体验。
在一个可选的实施方式中,上述方法还包括如下过程:
(1)、在未查找到所述目标功能的目标字节码文件的情况下,获取预设时段内所述Flutter应用的历史下载记录;所述历史下载记录用于指示所述Flutter应用在预设时段内从服务器获取到的对应功能的字节码文件;
(2)、在确定所述历史下载记录中包含所述目标功能的目标字节码文件的历史下载记录的情况下,向所述服务器发送获取请求;
(3)、获取所述服务器基于所述获取请求返回的所述目标字节码文件,并运行所述目标字节码文件。
在一种可选的实施方式中,在获取到服务器发送的目标字节码文件后,可能会由于存储失败等问题无法对该目标字节码进行保存,或者在对该目标字节码进行保存后,由于清理存储空间等原因出现将该目标字节码文件误删等情况,此时,就会出现未查找到该目标功能的目标字节码文件,但是存在目标字节码文件的历史下载记录的情况。
这里,在确定出上述历史下载记录中包含目标功能的目标字节码文件的历史下载记录的情况下,就可以确定所述目标功能的功能标识,并基于该功能标识生成目标字节码文件的获取请求,并获取服务器基于该获取请求返回的目标字节码文件。
在另一种可选的实施方式中,在未查找到目标功能的目标字节码文件的情况下,还可以直接基于目标功能的功能标识生成目标字节码文件的获取请求,服务器在接收到该获取请求后,就可以确定该目标功能是否存在对应的目标字节码文件,若存在,就可以将该目标字节码文件发送至Flutter应用,从而提高了功能调用请求调用到目标字节码文件的可靠性。
通过上述描述可知,在未查找到目标功能的目标字节码文件的情况下,可以通过历史下载记录确定目标功能是否对应目标字节码文件,从而避免在该目标字节码文件被从本地文件中误删时,功能调用请求无法调用到该目标字节码文件的问题。
在一个可选的实施方式中,所述方法还包括如下过程:
在未查找到所述目标功能的目标字节码文件的情况下,在所述本地文件查找所述目标功能的AOT编译文件,并运行所述AOT编译文件。
需要说明的是,在构建上述Flutter应用时得到的编译产物为AOT编译文件,该AOT编译文件为和处理器类型相关的二进制代码,具体的,可以通过Dart编译器对该Flutter应用进行编译。另外的,在对上述Flutter应用的指定功能进行编译从而修复该指定功能的功能缺陷的过程中,还可以产出中间编译产物:字节码文件,该字节码文件可以发送到Flutter应用中,以使该Flutter应用对该字节码文件进行运行,从而达到修复该指定功能的功能缺陷的效果。
因此,在本公开实施例中,在未查找到目标功能的目标字节码文件的情况下,就可以获取该目标功能在本地文件中的AOT编译文件,并通过运行该AOT编译文件来实现该目标功能。
通过上述描述可知,在未查找到目标功能的目标字节码文件的情况下,还可以运行该目标功能的AOT编译文件,从而使得该目标功能能够顺利的运行。
在一个可选的实施方式中,运行所述目标功能的目标字节码文件,以实现执行修复对应功能缺陷之后的目标功能,具体包括如下过程:
(1)、调用所述Flutter应用中的Dart虚拟机;
(2)、将所述目标字节码文件加载至所述Dart虚拟机,以通过所述Dart虚拟机中的字节码解释器运行所述目标功能的目标字节码文件,以实现执行修复对应功能缺陷之后的目标功能。
在本公开实施例中,在获取到上述目标功能的目标字节码后,就可以调用上述虚拟机,这里,由于该Flutter应用是基于Dart语言进行构建的,那么,该虚拟机就可以为Dart虚拟机,其中,Dart虚拟机为为Dart语言提供执行环境的虚拟机。
具体实施时,可以将上述目标字节码加载到Dart虚拟机中,以通过该Dart虚拟机实现字节码解释器的功能,从而对该目标字节码进行运行,实现上述目标功能。
通过上述描述可知,通过将目标功能的目标字节码文件加载至Dart虚拟机的方式,就可以运行该目标功能的目标字节码文件,从而实现执行修复对应功能缺陷之后的目标功能。
在一个可选的实施方式中,参见图3所示,为本公开实施例提供的另一种应用程序的修复方法的流程图,应用于服务器,所述方法包括步骤S301~S305,其中:
S301:确定Flutter应用中待修复功能的目标修复代码。
在本公开实施例中,在确定出Flutter应用中的待修复功能后,技术人员就可以针对该待修复功能编写目标修复代码,该目标修复代码可以用于修复该待修复功能所对应的功能缺陷。这里,上述待修复功能即为上述目标功能。
S303:对所述目标修复代码进行编译,并基于所述编译过程中的目标中间编译产物生成所述待修复功能的目标字节码文件。
在本公开实施例中,在确定出Flutter应用中待修复功能的目标修复代码后,就可以将该目标修复代码加载至Dart编译器中,以使该Dart编译器对该目标修复代码进行编译。应理解的是,这里需要获取该编译过程中的中间编译产物,并基于该中间编译产物生成待修复功能的目标字节码文件。
S305:向所述Flutter应用发送所述目标字节码文件,以使所述Flutter应用基于上述图1所对应的方法运行所述目标字节码文件。
在本公开实施例中,在确定出上述目标字节码文件后,就可以将该目标字节码文件发送至Flutter应用,以使该Flutter应用运行该目标字节码文件。
具体实施时,在向Flutter应用发送上述目标字节码文件时可以设置多种发送方式。例如,可以采用实时发送的方式,在确定出上述目标字节码文件后就可以将该目标字节码发送至Flutter应用;或者可以采用定时发送的方式,这里,具体的发送时间可以基于Flutter应用的版本更新时间进行确定。
通过上述描述可知,在本公开实施例中,首先检测针对Flutter应用中的目标功能的功能调用请求,并基于该功能调用请求在Flutter应用的本地文件中查找该目标功能的目标字节码文件,在查找到该目标字节码文件的情况下,就可以运行该目标字节码文件,以实现执行修复对应功能缺陷之后的目标功能,从而缩短了修复Flutter应用的功能缺陷的流程,提高了修复效率,进而提高了用户的使用体验。
在一个可选的实施方式中,所述方法还包括如下过程:
(1)、接收所述Flutter应用发送的获取请求,并确定所述获取请求所对应的待修复功能;
(2)、接获取所述待修复功能所对应的目标字节码文件,并将所述目标字节码文件传输至所述Flutter应用。
在本公开实施例中,上述Flutter应用可以基于针对目标功能的功能调用请求确定需要调用的目标字节码,并基于该目标功能的功能标识,生成该目标字节码的获取请求,并向服务器发送该获取请求。
服务器在获取到该获取请求后,就可以基于该获取请求所携带的功能标识确定对应的待修复功能,并获取该待修复功能所对应的目标字节码文件。
另外的,在上述待修复功能对应多个版本的字节码文件的情况下,还可以在这多个版本的字节码文件中确定出目标字节码文件,具体的,获取所述待修复功能所对应的目标字节码文件,包括如下过程:
(1)、获取所述待修复功能所对应的各个版本的字节码文件;
(2)、在所述各个版本的字节码文件中确定与所述获取请求相匹配的字节码文件作为所述目标字节码文件;其中,所述获取请求中携带所请求调用的待修复功能的版本标识。
在本公开实施例中,上述待修复功能在服务器的本地文件中对应着更新文件,其中,该更新文件用于存储该待修复功能的多个版本的字节码文件。
在通过上述Flutter应用向服务器发送待修复功能所对应的获取请求之前,用户可以选择想要获取的目标字节码文件所属版本的版本标识,然后,就可以基于该版本标识生成获取请求,并将该获取请求发送至服务器。
服务器在接收到该获取请求后,首先可以获取该获取请求所携带的功能标识确定待修复功能,并获取该待修复功能所对应的更新文件中的各个版本的字节码文件。
在获取到上述各个版本的字节码文件后,就可以确定上述获取请求中所携带的待修复功能的版本标识,并根据该版本标识在更新文件中所包含的各个版本的字节码文件之中进行匹配操作,并将与该版本标识相匹配的字节码文件确定为目标字节码文件。
通过上述描述可知,在待修复功能对应多个版本的字节码文件的情况下,可以基于获取请求所携带的版本标识确定出目标字节码文件,从而使得用户能通过获取请求灵活的选择想要获取的目标字节码文件的版本,提高了用户的使用体验。
参见图4所示,为本公开实施例提供的又一种应用程序的修复方法的流程图,所述方法包括步骤S401~S105,其中:
S401:检测针对所述Flutter应用中的目标功能的功能调用请求。
在本公开实施例中,用户在使用该Flutter应用时,可以通过功能调用请求对Flutter应用中的目标功能进行调用,从而实现该Flutter应用的目标功能。例如,在上述目标功能为该Flutter应用中的小程序的情况下,在检测到针对该小程序的调用操作后,就可以将该小程序确定为目标功能,并确定检测到针对该目标功能的功能调用请求。
S402:判断上述目标功能在本地文件中是否存在目标字节码文件,若是,则执行S403;若否,则执行S404。
在本公开实施例中,在本公开实施例中,首先需要查询Flutter应用的本地文件,并确定该本地文件中是否包含上述目标功能所对应的目标字节码文件。需要说明的是,在该目标功能产生功能缺陷的情况下,技术人员可以编写用于修复该目标功能所对应功能缺陷的修复代码,并将基于该修复代码生成对应的目标字节码文件,然后将该目标字节码文件下发至Flutter应用。因此,在运行该Flutter应用的目标功能之前,需要首先在Flutter应用的本地文件中查找该目标功能的目标字节码文件。
具体实施时,可以通过上述图1所对应的实施例中的几种方式查找上述目标功能的目标字节码文件,此处不再赘述。
S403:运行上述目标功能的目标字节码文件,以实现执行修复对应功能缺陷之后的目标功能。
在本公开实施例中,在查找到上述目标功能的目标字节码文件的情况下,就可以通过运行该目标字节码文件的方式实现该目标功能。具体实施时,可以将该目标字节码加载到虚拟机中,并通过该虚拟机实现字节码解释器的功能,对该目标字节码进行运行,从而实现上述目标功能。
S404:在本地文件查找上述目标功能的AOT编译文件,并运行该AOT编译文件,以实现执行该目标功能。
在本公开实施例中,上述Flutter应用和服务器之间的交互过程如图5所示,其中,该Flutter应用中包含n个指定功能,每个指定功能在本地文件中均对应AOT编译文件。在上述目标功能在本地文件中不包含目标字节码文件时,就可以运行该目标功能在本地文件中的AOT编译文件,以实现执行该目标功能。
另外的,在上述Flutter应用中的指定功能3需要修复的情况下,就可以获取服务器发送的该指定功能3所对应的目标字节码文件,并将该目标字节码文件存储到指定位置中。
在一个可选的实施方式中,在构建上述Flutter应用的过程中,还包括如下过程:
(1)、获取上述Flutter应用中所包含的多个指定功能,并获取每个指定功能所对应的Dart代码文件;
确定字节码文件判断程序;该字节码判断程序用于在检测到针对对应的指定功能的功能调用请求之后,判断该指定功能在本地文件中是否存在对应的字节码文件;
(2)、基于上述字节码文件判断程序,为每个上述Dart代码文件进行插桩操作;其中,该插桩操作为在每个Dart代码文件的指定位置插入该字节码文件判断程序。
在本公开实施例中,在构建上述Flutter应用的过程中,首先可以将该Flutter应用划分为多个指定功能,并分别开发该Flutter应用的每个指定功能,从而得到每个指定功能所对应的Dart代码文件。
这里,可以在编写每个指定功能所对应的Dart代码文件的过程中,将上述字节码文件判断程序编写在该Dart代码文件的指定位置中。另外的,还可以在得到每个指定功能所对应的Dart代码文件之后,通过插桩操作为每个Dart代码文件的指定位置插入该字节码文件判断程序,本公开对插入字节码文件判断程序的具体时机不做限定。
通过上述描述可知,通过为每个指定功能所对应的Dart代码文件插入字节码文件判断程序的方式,使得Flutter应用在检测到针对目标功能的功能调用请求后,通过该目标功能中的字节码文件判断程序查找该Flutter应用的本地文件中是否存在目标字节码文件。
综上,在本公开实施例中,首先检测针对Flutter应用中的目标功能的功能调用请求,并基于该功能调用请求在Flutter应用的本地文件中查找该目标功能的目标字节码文件,在查找到该目标字节码文件的情况下,就可以运行该目标字节码文件,以实现执行修复对应功能缺陷之后的目标功能,从而缩短了修复Flutter应用的功能缺陷的流程,提高了修复效率,进而提高了用户的使用体验。
本领域技术人员可以理解,在具体实施方式的上述方法中,各步骤的撰写顺序并不意味着严格的执行顺序而对实施过程构成任何限定,各步骤的具体执行顺序应当以其功能和可能的内在逻辑确定。
基于同一发明构思,本公开实施例中还提供了与应用程序的修复方法对应的应用程序的修复装置,由于本公开实施例中的装置解决问题的原理与本公开实施例上述应用程序的修复方法相似,因此装置的实施可以参见方法的实施,重复之处不再赘述。
参照图6所示,为本公开实施例提供的一种应用程序的修复装置的示意图,所述装置包括:检测单元61、查找单元62、运行单元63;其中,
检测单元61,用于检测针对所述Flutter应用中的目标功能的功能调用请求;
查找单元62,用于基于检测到的所述功能调用请求在所述Flutter应用的本地文件中查找所述目标功能的目标字节码文件;其中,所述目标字节码文件中包含用于修复所述目标功能的对应功能缺陷的字节码;
运行单元63,用于在查找到所述目标功能的目标字节码文件的情况下,运行所述目标功能的目标字节码文件,以实现执行修复对应功能缺陷之后的目标功能。
在本公开实施例中,首先检测针对Flutter应用中的目标功能的功能调用请求,并基于该功能调用请求在Flutter应用的本地文件中查找该目标功能的目标字节码文件,在查找到该目标字节码文件的情况下,就可以运行该目标字节码文件,以实现执行修复对应功能缺陷之后的目标功能,从而缩短了修复Flutter应用的功能缺陷的流程,提高了修复效率,进而提高了用户的使用体验。
一种可能的实施方式中,查找单元62,还用于:
在所述功能调用请求中获取所述目标功能的功能标识;
获取目标映射文件;其中,所述目标映射文件中包含所述Flutter应用的指定功能的功能标识和字节码标识之间的映射关系,所述字节码标识用于指示对应指定功能是否存在相应的字节码文件;
在所述目标映射文件中查找与所述目标功能的功能标识相对应的目标映射数据,并在基于所述目标映射数据确定所述本地文件中存在所述目标功能的目标字节码文件的情况下,在所述本地文件的指定位置中查找所述目标功能的目标字节码文件。
一种可能的实施方式中,该装置还用于:
在未查找到所述目标功能的目标字节码文件的情况下,获取预设时段内所述Flutter应用的历史下载记录;所述历史下载记录用于指示所述Flutter应用在预设时段内从服务器获取到的对应功能的字节码文件;
在确定所述历史下载记录中包含所述目标功能的目标字节码文件的历史下载记录的情况下,向所述服务器发送获取请求;
获取所述服务器基于所述获取请求返回的所述目标字节码文件,并运行所述目标字节码文件。
一种可能的实施方式中,该装置还用于:
在未查找到所述目标功能的目标字节码文件的情况下,在所述本地文件查找所述目标功能的AOT编译文件,并运行所述AOT编译文件。
一种可能的实施方式中,查找单元62,还用于:
在所述本地文件中查找到所述目标功能的多个版本的字节码文件的情况下,基于所述功能调用请求确定当前时刻所需要调用的目标功能的版本标识;
在所述多个版本的字节码文件中确定与所述版本标识相匹配的字节码文件作为所述目标功能的目标字节码文件。
一种可能的实施方式中,该装置还用于:
在检测对所述Flutter应用中的目标功能的功能调用请求之后,获取服务器发送的所述目标功能的目标字节码文件;
将所述目标功能的目标字节码文件保存在所述本地文件的指定存储位置。
一种可能的实施方式中,该装置还用于:
在所述本地文件中查找所述目标功能的历史字节码文件;
在查找到所述历史字节码文件的情况下,删除所述历史字节码文件,并将所述目标字节码文件保存在所述本地文件的指定存储位置。
一种可能的实施方式中,运行单元63,还用于:
调用所述Flutter应用中的Dart虚拟机;
将所述目标字节码文件加载至所述Dart虚拟机,以通过所述Dart虚拟机中的字节码解释器运行所述目标功能的目标字节码文件,以实现执行修复对应功能缺陷之后的目标功能。
参照图7所示,为本公开实施例提供的另一种应用程序的修复装置的示意图,所述装置包括:确定单元71、编译单元72、发送单元73;其中,
确定单元71,用于确定Flutter应用中待修复功能的目标修复代码;
编译单元72,用于对所述目标修复代码进行编译,并基于所述编译过程中的目标中间编译产物生成所述待修复功能的目标字节码文件;
发送单元73,用于向所述Flutter应用发送所述目标字节码文件,以使所述Flutter应用基于上述图1所对应的方法运行所述目标字节码文件。
一种可能的实施方式中,该装置还用于:
接收所述Flutter应用发送的获取请求,并确定所述获取请求所对应的待修复功能;
获取所述待修复功能所对应的目标字节码文件,并将所述目标字节码文件传输至所述Flutter应用。
一种可能的实施方式中,该装置还用于:
获取所述待修复功能所对应的各个版本的字节码文件;
在所述各个版本的字节码文件中确定与所述获取请求相匹配的字节码文件作为所述目标字节码文件;其中,所述获取请求中携带所请求调用的待修复功能的版本标识。
关于装置中的各单元的处理流程、以及各单元之间的交互流程的描述可以参照上述方法实施例中的相关说明,这里不再详述。
对应于图1中的应用程序的修复方法,本公开实施例还提供了一种计算机设备800,如图8所示,为本公开实施例提供的计算机设备800结构示意图,包括:
处理器81、存储器82、和总线83;存储器82用于存储执行指令,包括内存821和外部存储器822;这里的内存821也称内存储器,用于暂时存放处理器81中的运算数据,以及与硬盘等外部存储器822交换的数据,处理器81通过内存821与外部存储器822进行数据交换,当所述计算机设备800运行时,所述处理器81与所述存储器82之间通过总线83通信,使得所述处理器81执行以下指令:
检测针对所述Flutter应用中的目标功能的功能调用请求;
基于检测到的所述功能调用请求在所述Flutter应用的本地文件中查找所述目标功能的目标字节码文件;其中,所述目标字节码文件中包含用于修复所述目标功能的对应功能缺陷的字节码;
在查找到所述目标功能的目标字节码文件的情况下,运行所述目标功能的目标字节码文件,以实现执行修复对应功能缺陷之后的目标功能。
对应于图3中的应用程序的修复方法,本公开实施例还提供了另一种计算机设备900,如图9所示,为本公开实施例提供的计算机设备900结构示意图,包括:
处理器91、存储器92、和总线93;存储器92用于存储执行指令,包括内存921和外部存储器922;这里的内存921也称内存储器,用于暂时存放处理器91中的运算数据,以及与硬盘等外部存储器922交换的数据,处理器91通过内存921与外部存储器922进行数据交换,当所述计算机设备900运行时,所述处理器91与所述存储器92之间通过总线93通信,使得所述处理器91执行以下指令:
确定Flutter应用中待修复功能的目标修复代码;
对所述目标修复代码进行编译,并基于所述编译过程中的目标中间编译产物生成所述待修复功能的目标字节码文件;
向所述Flutter应用发送所述目标字节码文件,以使所述Flutter应用基于上述图1所对应的方法运行所述目标字节码文件。
本公开实施例还提供一种计算机可读存储介质,该计算机可读存储介质上存储有计算机程序,该计算机程序被处理器运行时执行上述方法实施例中所述的应用程序的修复方法的步骤。其中,该存储介质可以是易失性或非易失的计算机可读取存储介质。
本公开实施例还提供一种计算机程序产品,该计算机程序产品承载有程序代码,所述程序代码包括的指令可用于执行上述方法实施例中所述的应用程序的修复方法的步骤,具体可参见上述方法实施例,在此不再赘述。
其中,上述计算机程序产品可以具体通过硬件、软件或其结合的方式实现。在一个可选实施例中,所述计算机程序产品具体体现为计算机存储介质,在另一个可选实施例中,计算机程序产品具体体现为软件产品,例如软件开发包(Software Development Kit,SDK)等等。
所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统和装置的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。在本公开所提供的几个实施例中,应该理解到,所揭露的系统、装置和方法,可以通过其它的方式实现。以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,又例如,多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些通信接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本公开各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。
所述功能如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个处理器可执行的非易失的计算机可读取存储介质中。基于这样的理解,本公开的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本公开各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(Read-OnlyMemory,ROM)、随机存取存储器(Random Access Memory,RAM)、磁碟或者光盘等各种可以存储程序代码的介质。
最后应说明的是:以上所述实施例,仅为本公开的具体实施方式,用以说明本公开的技术方案,而非对其限制,本公开的保护范围并不局限于此,尽管参照前述实施例对本公开进行了详细的说明,本领域的普通技术人员应当理解:任何熟悉本技术领域的技术人员在本公开揭露的技术范围内,其依然可以对前述实施例所记载的技术方案进行修改或可轻易想到变化,或者对其中部分技术特征进行等同替换;而这些修改、变化或者替换,并不使相应技术方案的本质脱离本公开实施例技术方案的精神和范围,都应涵盖在本公开的保护范围之内。因此,本公开的保护范围应所述以权利要求的保护范围为准。