技术领域
[0001] 本
申请涉及应用程序领域,尤其涉及一种应用程序缺陷修补方法及装置。
背景技术
[0002] 目前,当已发布的应用程序出现缺陷时,
服务器端通常需要发布新的版本,安装应用程序的客户端通过将应用程序升级成新版本的应用程序来克服缺陷。但是,这种发布新版本的形式增加了服务器端和客户端的处理复杂度,且更新效率较低。
[0003] 为了简化应用程序缺陷修补的过程,并提高更新效率,开发人员提出了采用将基于Lua脚本语言编写的
补丁程序(patch)和Wax
框架相结合修补应用程序中的缺陷的方式。客户端下载patch后,利用Lua解析器对该patch进行解析,并利用Wax框架提供的在Lua脚本语言和编写应用程序的Objective-C语言之间进行交互的能
力,运行解析后的patch。
[0004] 上述基于Lua脚本语言和Wax框架的应用程序缺陷修补方式存在如下缺陷:首先,WAX框架本身容易出现问题,并且WAX框架的架构和编写代码较为复杂,修复过程极为繁琐。其次,由于Lua脚本语言是需要解析执行的,在加载基于Lua脚本语言编写的补丁程序后,还需要采用Lua解析器对该patch进行解析,执行效率较低。
[0005] 综上,当前基于Lua脚本语言和Wax框架的应用程序缺陷修补方式存在维护过程复杂、执行效率较低的问题。
发明内容
[0006] 本申请
实施例提供一种应用程序缺陷修补方法及装置,用以解决当前基于Lua脚本语言和Wax框架的应用程序缺陷修补方式存在维护过程复杂、执行效率较低的问题。
[0007] 本申请实施例提供的一种应用程序缺陷修补方法包括:
[0008] 在启动应用程序后,向服务器
请求获取针对该应用程序的补丁程序patch;其中,所述patch为将编写的用于修补所述应用程序中的缺陷的补丁代码进行编译后生成的程序段,且所述patch的编程语言类型与所述应用程序的编程语言类型相同;
[0009] 在获取所述patch后,根据所述patch中指示的替换信息,确定所述应用程序中存在缺陷的方法;
[0010] 根据所述patch,对所述应用程序中存在缺陷的方法进行修补。
[0011] 可选地,根据所述patch,对所述应用程序中存在缺陷的方法进行修补,包括:
[0012] 将所述应用程序中存在缺陷的方法替换为符合该方法的返回值类型的桩方法;所述桩方法为具有设定返回值类型和不固定参数的方法;
[0013] 通过所述桩方法调用所述patch中的方法。
[0014] 可选地,通过所述桩方法调用所述patch中的方法之后,还包括:
[0015] 通过所述patch中的方法调用回调方法,执行所述回调方法中各参数指示的操作。
[0016] 可选地,所述替换信息包括类名、方法名、和方法类型信息。
[0017] 可选地,所述patch为编译生成的基于文件夹形式的patch,所述文件夹包含可执行文件和信息列表文件,所述可执行文件用于执行所述patch,所述信息列表文件包含所述替换信息。
[0018] 本申请实施例提供一种应用程序缺陷修补装置,包括:
[0019] 获取模
块,用于在启动应用程序后,向服务器请求获取针对该应用程序的补丁程序patch;其中,所述patch为将编写的用于修补所述应用程序中的缺陷的补丁代码进行编译后生成的程序段,且所述patch的编程语言类型与所述应用程序的编程语言类型相同;
[0020] 确定模块,用于在所述获取模块获取所述patch后,根据所述patch中指示的替换信息,确定所述应用程序中存在缺陷的方法;
[0021] 修补模块,用于根据所述patch,对所述应用程序中存在缺陷的方法进行修补。
[0022] 根据上述方法或装置可知,本申请基于补丁程序patch来修补应用程序中的缺陷,从而无需发布新版本的应用程序,并且,本申请提供了采用一种新的类型的patch来修补应用程序中的缺陷的方式。在本申请中,用于修补应用程序中的缺陷的补丁代码是采用与该应用程序的编程语言同类型的语言编写的,因此无需Wax框架来实现两种不同语言之间的交互,并且,本申请中的patch为将编写的补丁代码进行编译后生成的,因此在进行方法修补的过程中,无需对该patch进行解析,提高了运行效率。可见,采用本申请提供的上述方法或装置可以显著提高修补应用程序缺陷的效率。
附图说明
[0023] 为了更清楚地说明本申请实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简要介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域的普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
[0024] 图1为本申请实施例一提供的应用程序缺陷修补方法
流程图;
[0025] 图2为本申请实施例二提供的应用程序缺陷修补方法流程图;
[0026] 图3为本申请实施例提供的应用程序缺陷修补系统结构示意图;
[0027] 图4为本申请实施例提供的应用程序缺陷修补装置结构示意图。
具体实施方式
[0028] 本申请实施例的基本思想是:在启动应用程序后,向服务器请求获取针对该应用程序的补丁程序patch;本申请实施例中的patch为将编写的用于修补所述应用程序中的缺陷的补丁代码进行编译后生成的程序段,且所述patch与所述应用程序的编程语言的类型相同;在获取所述patch后,根据所述patch中指示的替换信息,确定所述应用程序中存在缺陷的方法;根据所述patch,对所述应用程序中存在缺陷的方法进行修补。
[0029] 本申请实施例基于补丁程序patch来修补应用程序中的缺陷,从而无需发布新版本的应用程序来修补应用程序中的缺陷,并且,本申请实施例提供了采用一种新的类型的patch来修补应用程序中的缺陷的方式。在本申请实施例中,用于修补应用程序中的缺陷的补丁代码是采用与该应用程序的编程语言同类型的语言编写的,因此无需Wax框架来实现两种不同语言之间的交互,并且,本申请实施例中的patch为将编写的补丁代码进行编译后生成的,因此在进行方法修补的过程中,无需对该patch进行解析,提高了运行效率。可见,采用本申请实施例的方法可以显著提高修补应用程序缺陷的效率。
[0030] 下面结合
说明书附图对本申请实施例作进一步详细描述。
[0031] 如图1所示,为本申请实施例一提供的应用程序缺陷修补方法流程图,包括以下步骤:
[0032] S101:在启动应用程序后,向服务器请求获取针对该应用程序的补丁程序patch;其中,所述patch为将编写的用于修补所述应用程序中的缺陷的补丁代码进行编译后生成的程序段,且所述patch的编程语言类型与所述应用程序的编程语言类型相同。
[0033] 本申请实施例中,所述应用程序与所述patch的编程语言可以是Objective-C语言。
[0034] 在具体实施过程中,可以在服务器侧基于Xcode创建基于文件夹形式的patch。具体地,使用Objective-C编写用于修补应用程序缺陷的补丁代码;编译运行编写好的补丁代码,生成基于文件夹形式的patch;采用Xcode工具对生成的patch进行签名。该文件夹包含可执行文件和信息列表文件,其中,所述可执行文件用于执行所述patch,所述信息列表文件包含用于确定所述应用程序中存在缺陷的方法的替换信息,除此之外,信息列表文件还可以包含patch版本号等。本申请实施例中,所述文件夹具体可以是NSBundle。
[0035] 在S101中,安装有所述应用程序的客户端在启动所述应用程序之后,向服务器发送请求消息,该请求消息用于咨询是否有针对该应用程序的patch,服务器在确定存储有针对该应用程序的patch后,指示客户端下载该patch。
[0036] S102:在获取所述patch后,根据所述patch中指示的替换信息,确定所述应用程序中存在缺陷的方法。
[0037] 该步骤中,patch中指示的替换信息包括类名(比如classA)、方法名(比如methodB)和方法类型信息。这里的方法类型包括类方法和实例方法。
[0038] S103:根据所述patch,对所述应用程序中存在缺陷的方法进行修补。
[0039] 该具体实施过程中,在客户端下载基于NSBundle的patch后,将其保存在该应用程序的
指定保存目录下,然后进行解压缩。之后,根据所述patch中指示的替换信息,确定所述应用程序中存在缺陷的方法。根据确定的缺陷的方法,通过NSBundle类库加载patch,完成缺陷修补过程。通过NSBundle类库加载patch的过程为:通过NSBundle的公开
接口principalClass、classNamed获取patch在NSBundle中的入口类,然后调用patch中的方法,该入口类遵从指定至少一个接口的BundleProtocol。
[0040] 在具体实施过程中,可以采用将应用程序中存在缺陷的方法直接替换为patch中的方法的方式来修补缺陷,但是,进行方法替换的过程并不是简单的程序拷贝过程,直接将存在缺陷的方法替换为patch中的方法会增加实现复杂度,也不利于对替换后的方法的追踪控制。
[0041] 基于此,本申请实施例中引入桩方法的概念。这里的桩方法为具有设定返回值类型和不固定参数的方法;应用程序中具有任意参数个数和参数类型的方法都能被替换为与该方法具有相同返回值类型的桩方法。下面通过一个具体的实施例对该实施方式作进一步介绍。
[0042] 如图2所示,为本申请实施例二提供的应用程序缺陷修补方法流程图,该实施例与实施例一的内容重复之处不再赘述。该实施例包括以下步骤:
[0043] S201:在启动应用程序后,向服务器请求获取针对该应用程序的补丁程序patch;其中,所述patch为将编写的用于修补所述应用程序中的缺陷的补丁代码进行编译后生成的程序段,且所述patch的编程语言类型与所述应用程序的编程语言类型相同。
[0044] 本申请实施例中,patch为编译生成的基于NSBundle的补丁程序,patch的编程语言和应用程序的编程语言的类型相同,都是Objective-C语言。patch中主要包括可执行文件和信息列表文件两部分内容,其中的可执行文件用于执行所述patch,信息列表(Info.plist)文件包含类名(比如classA)、方法名(比如methodB)和方法类型等替换信息。该替换信息可用于确定应用程序中存在缺陷的方法。
[0045] S202:在获取所述patch后,根据所述patch中指示的替换信息,确定所述应用程序中存在缺陷的方法。
[0046] 该步骤中,根据替换信息中的类名、方法名和方法类型信息,确定应用程序中存在缺陷的方法。具体地,可以分别通过info.plist文件中的hookClassName、hookClassMethodName、isHookClassMethod字段来表示应用程序中存在缺陷的方法的类名、方法名和方法类型信息,根据这三个字段对应的值确定应用程序中存在缺陷的方法。
[0047] S203:将所述应用程序中存在缺陷的方法替换为符合该方法的返回值类型的桩方法。
[0048] 该步骤中,可以通过Objective-C runtime(支持Objective-C语言具有动态属性的运行环境,可以动态获取方法列表、属性列表、变量列表,
修改方法、属性,增加方法、属性等。)提供的method_exchangeImplementations或class_replaceMethod方法将应用程序中存在缺陷的方法替换为符合该方法的返回值类型的桩方法,这样可以在需要调用该应用程序中存在缺陷的方法时,转为调用替换后的桩方法。基于桩方法的参数不固定性,应用程序中具有任意参数个数和参数类型的方法都能被替换为与该方法具有相同返回值类型的桩方法,因此,该桩方法可支持patch替换应用程序中的任意方法。
[0049] 比如,返回值类型为int的桩方法:int stub_hookMethod(id self,SEL_cmd,...);其中,self和_cmd分别为该桩方法中的第一个参数和第二个参数,省略号代表的是不固定参数,也即可变参数。
[0050] S204:通过所述桩方法调用所述patch中的方法。
[0051] 该步骤中,通过所述桩方法,基于NSBundle的公开接口principalClass、classNamed获取patch在NSBundle中的入口类,调用patch中的方法。
[0052] 可选地,S204之后,还包括:
[0053] 通过所述patch中的方法调用回调方法,执行所述回调方法中各参数指示的操作。
[0054] 在具体实施过程中,本申请实施例提供回调方法机制,运行完patch中用于修补应用程序缺陷的方法之后,调用回调方法,执行回调方法中各参数指示的操作,比如继续调用应用程序中存在缺陷的方法,或调用存在缺陷的方法的父类方法等。比如,回调方法id callBackBlock(NSInteger operation);其中参数operation表示需要执行的操作,该参数值为0表示需要继续调用应用程序中存在缺陷的方法,值为1表示需要调用所述存在缺陷的方法的父类方法。这里,继续调用应用程序中存在缺陷的方法是指在调用完所述patch中的方法后,调用应用程序中继所述patch中的方法之后的方法。比如,应用程序中缺少了进行判断的程序段,只有根据判断结果执行的后续方法,则编写进行判断的程序段作为该应用程序的patch,在调用完该patch之后,继续调用应用程序中根据判断结果执行的后续方法。
[0055] 如图3所示,为与上述实施例二的方法相对应的系统结构示意图。本申请实施例的系统包括:客户端31和服务器32。所述服务器32,用于将采用Objective-C语言编写的补丁代码进行编译运行,生成基于NSBundle的patch。所述客户端31,用于从服务器32下载针对该应用程序的补丁程序patch,根据所述patch中指示的替换信息,确定所述应用程序中存在缺陷的方法,将所述应用程序中存在缺陷的方法替换为符合该方法的返回值类型的桩方法,通过所述桩方法调用所述patch中的方法,通过所述patch中的方法调用回调方法,执行所述回调方法中各参数指示的操作。
[0056] 基于同一发明构思,本申请实施例中还提供了一种与应用程序缺陷修补方法对应的应用程序缺陷修补装置,由于该装置解决问题的原理与本申请实施例应用程序缺陷修补方法相似,因此该装置的实施可以参见方法的实施,重复之处不再赘述。
[0057] 如图4所示,为本申请实施例提供的应用程序缺陷修补装置结构示意图,包括:
[0058] 获取模块41,用于在启动应用程序后,向服务器请求获取针对该应用程序的补丁程序patch;其中,所述patch为将编写的用于修补所述应用程序中的缺陷的补丁代码进行编译后生成的程序段,且所述patch的编程语言类型与所述应用程序的编程语言类型相同;
[0059] 确定模块42,用于在所述获取模块41获取所述patch后,根据所述patch中指示的替换信息,确定所述应用程序中存在缺陷的方法;
[0060] 修补模块43,用于根据所述patch,对所述应用程序中存在缺陷的方法进行修补。
[0061] 可选地,所述修补模块43具体用于:将所述应用程序中存在缺陷的方法替换为符合该方法的返回值类型的桩方法,通过所述桩方法调用所述patch中的方法;所述桩方法为具有设定返回值类型和不固定参数的方法。
[0062] 可选地,所述修补模块43还用于,在通过所述桩方法调用所述patch中的方法之后,通过所述patch中的方法调用回调方法,执行所述回调方法中各参数指示的操作。
[0063] 可选地,所述替换信息包括类名、方法名、和方法类型信息。
[0064] 可选地,所述patch为编译生成的基于文件夹形式的patch,所述文件夹包含可执行文件和信息列表文件,所述可执行文件用于执行所述patch,所述信息列表文件包含所述替换信息。
[0065] 本领域内的技术人员应明白,本申请的实施例可提供为方法、系统、或
计算机程序产品。因此,本申请可采用完全
硬件实施例、完全
软件实施例、或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘
存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
[0066] 本申请是参照根据本申请实施例的方法、装置(系统)、和计算机程序产品的流程图和/或方
框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程
数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
[0067] 这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
[0068] 这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
[0069] 尽管已描述了本申请的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例作出另外的变更和修改。所以,所附
权利要求意欲解释为包括优选实施例以及落入本申请范围的所有变更和修改。
[0070] 显然,本领域的技术人员可以对本申请进行各种改动和变型而不脱离本申请的精神和范围。这样,倘若本申请的这些修改和变型属于本申请权利要求及其等同技术的范围之内,则本申请也意图包含这些改动和变型在内。