首页 / 专利库 / 人工智能 / 语言代码 / 一种应用程序修复方法及装置

一种应用程序修复方法及装置

阅读:980发布:2020-05-15

专利汇可以提供一种应用程序修复方法及装置专利检索,专利查询,专利分析的服务。并且本 申请 提出一种应用程序修复方法及装置,该方法包括:检测 服务器 上是否有新版本的应用程序代码文件;如果所述服务器上有新版本的应用程序代码文件,则下载所述新版本的应用程序代码文件;将所述新版本的应用程序代码文件的函数 指针 指向应用程序中待修复的方法的函数指针;设置应用程序执行到所述待修复的方法的函数指针时,跳转到从所述新版本的应用程序代码文件的函数指针处开始执行。上述方法可以实现将应用程序中的待修复方法函数替换为新版本的方法函数,从而达到热修复应用程序的目的,上述修复过程不需要重新提交审核应用程序代码,程序修复周期短,修复更迅速,利于提升用户体验。,下面是一种应用程序修复方法及装置专利的具体信息内容。

1.一种应用程序修复方法,其特征在于,包括:
检测服务器上是否有新版本的应用程序代码文件;
如果所述服务器上有新版本的应用程序代码文件,则下载所述新版本的应用程序代码文件;
将所述新版本的应用程序代码文件的函数指针指向应用程序中待修复的方法的函数指针;
设置应用程序执行到所述待修复的方法的函数指针时,跳转到从所述新版本的应用程序代码文件的函数指针处开始执行。
2.根据权利要求1所述的方法,其特征在于,所述新版本的应用程序代码文件为新版本的JavaScript应用程序代码文件;
所述将所述新版本的应用程序代码文件的函数指针指向应用程序中待修复的方法的函数指针,包括:
将所述新版本的JavaScript应用程序代码文件转换成Objective-C语言代码文件;
设置所述Objective-C语言代码文件的函数指针指向应用程序中待修复的方法的函数指针。
3.根据权利要求2所述的方法,其特征在于,所述设置应用程序执行到所述待修复的方法的函数指针时,跳转到从所述新版本的应用程序代码文件的函数指针处开始执行,包括:
在运行到所述应用程序的Objective-C语言代码文件中的,待修复的方法的函数指针时,执行消息转发处理;其中,所述消息转发处理被设置为跳转到所述新版本的应用程序代码文件的函数指针处开始执行。
4.根据权利要求1至3中任一权利要求所述的方法,其特征在于,在下载所述新版本的应用程序代码文件后,所述方法还包括:
校验下载的所述新版本的应用程序代码文件是否合法,如果下载的所述新版本的应用程序代码文件合法,则将所述新版本的应用程序代码文件的函数指针指向应用程序中待修复的方法的函数指针。
5.根据权利要求4所述的方法,其特征在于,所述下载所述新版本的应用程序代码文件包括获取服务器下发的应用程序脚本文件和加密后的应用程序脚本文件的校验值;
所述校验下载的所述新版本的应用程序代码文件是否合法,包括:
计算接收到的应用程序脚本文件的校验值;
对所述加密后的应用程序脚本文件的校验值进行解码,得到所述服务器下发的应用程序脚本文件的校验值;
对比计算得到的应用程序脚本文件的校验值与所述服务器下发的应用程序脚本文件的校验值是否相同;
如果计算得到的应用程序脚本文件的校验值与所述服务器下发的应用程序脚本文件的校验值相同,则确定下载的所述新版本的应用程序代码文件合法。
6.一种应用程序修复装置,其特征在于,包括:
代码检测单元,用于检测服务器上是否有新版本的应用程序代码文件;
代码下载单元,用于当所述服务器上有新版本的应用程序代码文件时,下载所述新版本的应用程序代码文件;
第一设置单元,用于将所述新版本的应用程序代码文件的函数指针指向应用程序中待修复的方法的函数指针;
第二设置单元,用于设置应用程序执行到所述待修复的方法的函数指针时,跳转到从所述新版本的应用程序代码文件的函数指针处开始执行。
7.根据权利要求6所述的装置,其特征在于,所述新版本的应用程序代码文件为新版本的JavaScript应用程序代码文件;
所述第一设置单元,包括:
代码转换单元,用于将所述新版本的JavaScript应用程序代码文件转换成Objective-C语言代码文件;
指针设置单元,用于设置所述Objective-C语言代码文件的函数指针指向应用程序中待修复的方法的函数指针。
8.根据权利要求7所述的装置,其特征在于,所述第二设置单元设置应用程序执行到所述待修复的方法的函数指针时,跳转到从所述新版本的应用程序代码文件的函数指针处开始执行时,具体用于:
在运行到所述应用程序的Objective-C语言代码文件中的,待修复的方法的函数指针时,执行消息转发处理;其中,所述消息转发处理被设置为跳转到所述新版本的应用程序代码文件的函数指针处开始执行。
9.根据权利要求6至8中任一权利要求所述的装置,其特征在于,所述装置还包括:
代码校验单元,用于校验下载的所述新版本的应用程序代码文件是否合法,如果下载的所述新版本的应用程序代码文件合法,则将所述新版本的应用程序代码文件的函数指针指向应用程序中待修复的方法的函数指针。
10.根据权利要求9所述的装置,其特征在于,所述下载所述新版本的应用程序代码文件包括获取服务器下发的应用程序脚本文件和加密后的应用程序脚本文件的校验值;
所述代码校验单元校验下载的所述新版本的应用程序代码文件是否合法时,具体用于:
计算接收到的应用程序脚本文件的校验值;
对所述加密后的应用程序脚本文件的校验值进行解码,得到所述服务器下发的应用程序脚本文件的校验值;
对比计算得到的应用程序脚本文件的校验值与所述服务器下发的应用程序脚本文件的校验值是否相同;
如果计算得到的应用程序脚本文件的校验值与所述服务器下发的应用程序脚本文件的校验值相同,则确定下载的所述新版本的应用程序代码文件合法。

说明书全文

一种应用程序修复方法及装置

技术领域

[0001] 本申请涉及应用程序运维技术领域,尤其涉及一种应用程序修复方法及装置。

背景技术

[0002] 及时发现和修复应用程序的bug(缺陷或漏洞),是应用程序日常运维中的一项重要工作,直接影响着用户使用体验。当发现应用程序bug时,应当以最快速度修复,以免影响更多用户使用。
[0003] 常用的应用程序修复方法是,当发现应用程序存在bug时,及时编写新的应用程序代码,然后将新的应用程序代码发布到应用商店供用户下载。应用商店运行方,例如苹果公司,会对新提交的应用程序代码进行严格的审核,当审核通过后才允许发布,供用户下载使用。应用商店运行方可能需要几天的时间才能完成对应用程序的审核,因此新版本应用程序需要经过几天的时间才能替换有bug的应用程序。显然这一应用程序修复过程周期较长,修复较慢,容易影响用户体验,造成用户流失。发明内容
[0004] 基于上述现有技术的缺陷和不足,本申请提出一种应用程序修复方法及装置,能够实现热修复应用程序,显著缩短修复周期。
[0005] 为了达到上述目的,本申请具体提出如下技术方案:
[0006] 一种应用程序修复方法,包括:
[0007] 检测服务器上是否有新版本的应用程序代码文件;
[0008] 如果所述服务器上有新版本的应用程序代码文件,则下载所述新版本的应用程序代码文件;
[0009] 将所述新版本的应用程序代码文件的函数指针指向应用程序中待修复的方法的函数指针;
[0010] 设置应用程序执行到所述待修复的方法的函数指针时,跳转到从所述新版本的应用程序代码文件的函数指针处开始执行。
[0011] 可选的,所述新版本的应用程序代码文件为新版本的JavaScript应用程序代码文件;
[0012] 所述将所述新版本的应用程序代码文件的函数指针指向应用程序中待修复的方法的函数指针,包括:
[0013] 将所述新版本的JavaScript应用程序代码文件转换成Objective-C语言代码文件;
[0014] 设置所述Objective-C语言代码文件的函数指针指向应用程序中待修复的方法的函数指针。
[0015] 可选的,所述设置应用程序执行到所述待修复的方法的函数指针时,跳转到从所述新版本的应用程序代码文件的函数指针处开始执行,包括:
[0016] 在运行到所述应用程序的Objective-C语言代码文件中的,待修复的方法的函数指针时,执行消息转发处理;其中,所述消息转发处理被设置为跳转到所述新版本的应用程序代码文件的函数指针处开始执行。
[0017] 可选的,在下载所述新版本的应用程序代码文件后,所述方法还包括:
[0018] 校验下载的所述新版本的应用程序代码文件是否合法,如果下载的所述新版本的应用程序代码文件合法,则将所述新版本的应用程序代码文件的函数指针指向应用程序中待修复的方法的函数指针。
[0019] 可选的,所述下载所述新版本的应用程序代码文件包括获取服务器下发的应用程序脚本文件和加密后的应用程序脚本文件的校验值;
[0020] 所述校验下载的所述新版本的应用程序代码文件是否合法,包括:
[0021] 计算接收到的应用程序脚本文件的校验值;
[0022] 对所述加密后的应用程序脚本文件的校验值进行解码,得到所述服务器下发的应用程序脚本文件的校验值;
[0023] 对比计算得到的应用程序脚本文件的校验值与所述服务器下发的应用程序脚本文件的校验值是否相同;
[0024] 如果计算得到的应用程序脚本文件的校验值与所述服务器下发的应用程序脚本文件的校验值相同,则确定下载的所述新版本的应用程序代码文件合法。
[0025] 一种应用程序修复装置,包括:
[0026] 代码检测单元,用于检测服务器上是否有新版本的应用程序代码文件;
[0027] 代码下载单元,用于当所述服务器上有新版本的应用程序代码文件时,下载所述新版本的应用程序代码文件;
[0028] 第一设置单元,用于将所述新版本的应用程序代码文件的函数指针指向应用程序中待修复的方法的函数指针;
[0029] 第二设置单元,用于设置应用程序执行到所述待修复的方法的函数指针时,跳转到从所述新版本的应用程序代码文件的函数指针处开始执行。
[0030] 可选的,所述新版本的应用程序代码文件为新版本的JavaScript应用程序代码文件;
[0031] 所述第一设置单元,包括:
[0032] 代码转换单元,用于将所述新版本的JavaScript应用程序代码文件转换成Objective-C语言代码文件;
[0033] 指针设置单元,用于设置所述Objective-C语言代码文件的函数指针指向应用程序中待修复的方法的函数指针。
[0034] 可选的,所述第二设置单元设置应用程序执行到所述待修复的方法的函数指针时,跳转到从所述新版本的应用程序代码文件的函数指针处开始执行时,具体用于:
[0035] 在运行到所述应用程序的Objective-C语言代码文件中的,待修复的方法的函数指针时,执行消息转发处理;其中,所述消息转发处理被设置为跳转到所述新版本的应用程序代码文件的函数指针处开始执行。
[0036] 可选的,所述装置还包括:
[0037] 代码校验单元,用于校验下载的所述新版本的应用程序代码文件是否合法,如果下载的所述新版本的应用程序代码文件合法,则将所述新版本的应用程序代码文件的函数指针指向应用程序中待修复的方法的函数指针。
[0038] 可选的,所述下载所述新版本的应用程序代码文件包括获取服务器下发的应用程序脚本文件和加密后的应用程序脚本文件的校验值;
[0039] 所述代码校验单元校验下载的所述新版本的应用程序代码文件是否合法时,具体用于:
[0040] 计算接收到的应用程序脚本文件的校验值;
[0041] 对所述加密后的应用程序脚本文件的校验值进行解码,得到所述服务器下发的应用程序脚本文件的校验值;
[0042] 对比计算得到的应用程序脚本文件的校验值与所述服务器下发的应用程序脚本文件的校验值是否相同;
[0043] 如果计算得到的应用程序脚本文件的校验值与所述服务器下发的应用程序脚本文件的校验值相同,则确定下载的所述新版本的应用程序代码文件合法。
[0044] 本申请通过对应用程序方法的函数指针指向进行设置,达到替换应用程序在运行过程中所执行的方法函数的目的,以此实现将应用程序中的待修复方法函数替换为新版本的方法函数,从而达到热修复应用程序的目的,上述修复过程不需要重新提交审核应用程序代码,程序修复周期短,修复更迅速,利于提升用户体验。附图说明
[0045] 为了更清楚地说明本申请实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据提供的附图获得其他的附图。
[0046] 图1是本申请实施例提供的一种应用程序修复的应用场景示意图;
[0047] 图2是本申请实施例提供的一种应用程序修复方法的流程示意图;
[0048] 图3是本申请实施例提供的另一种应用程序修复方法的流程示意图;
[0049] 图4是本申请实施例提供的又一种应用程序修复方法的流程示意图;
[0050] 图5是本申请实施例提供的一种应用程序修复装置的结构示意图;
[0051] 图6是本申请实施例提供的另一种应用程序修复装置的结构示意图;
[0052] 图7是本申请实施例提供的又一种应用程序修复装置的结构示意图。

具体实施方式

[0053] 本申请实施例技术方案适用于对应用程序代码进行修复的应用场景,采用本申请实施例可以实现对应用程序代码的热修复,其修复过程更迅速。
[0054] 图1示出了本申请实施例适用的一种应用场景示意图。参见图1所示,运行应用程序的终端设备与服务器连接。上述服务器用于提供应用程序代码或应用程序补丁代码,上述终端设备运行应用程序,当应用程序在运行过程中发现应用程序代码存在漏洞需要修复,或者服务器向运行于终端设备的应用程序推送补丁代码时,应用程序从服务器请求修复代码,实现对本地应用程序的修复。
[0055] 上述的服务器可以是硬件形式存在的服务器设备,例如工作站、计算机等,可选的,上述服务器还可以是设置于端的云服务器,或者是运行于任意处理设备上的服务程序等。上述的终端设备,可以是计算机、智能终端等硬件设备等。上述的应用程序,可以是单独存在的实现某种功能的应用程序,也可以是内嵌于大型系统程序中,具备某种特定功能的小型应用程序。理论上,可以运行于任意硬件设备或软件应用中的应用程序,都可以按照本申请实施例技术方案实现对应用程序代码的修复。
[0056] 具体的,执行本申请实施例所公开的应用程序修复方法的,可以是应用程序自身的修复程序,也可以是专设置的用于对应用程序进行修复的程序或装置。本申请实施例不限定执行所公开的应用程序修复方法的执行主体的具体形式,理论上,可以实现对应用程序进行修复的装置或程序,都可以通过执行本申请实施例所公开的应用程序修复方法实现对应用程序的修复。
[0057] 需要说明的是,本申请实施例应用Objective-C语言代码的消息转发机制实现对iOS系统应用程序的热修复,因此,本申请实施例技术方案是特别适用于iOS系统的,用于实现对iOS系统应用程序进行热修复的应用程序修复方法。其它类似于运行Objective-C语言代码的系统应用程序的热修复,也可以参照本申请实施例技术方案执行。
[0058] 下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
[0059] 本申请实施例公开了一种应用程序修复方法,参见图2所示,该方法包括:
[0060] S201、检测服务器上是否有新版本的应用程序代码文件;
[0061] 具体的,应用程序在启动运行的时候,向服务器发送代码请求,请求该应用程序的JavaScript代码文件,然后,应用程序将新请求的代码文件与本地应用程序代码文件进行对比,判断新请求的代码文件与本地代码文件的版本是否相同。
[0062] 如果新请求的代码文件与本地代码文件的版本相同,则可以确定该应用程序的代码文件没有更新。如果新请求的代码文件与本地代码文件不同,则可以确定该应用程序的代码文件有更新,也就是该应用程序代码有补丁需要执行。
[0063] 一种示例性的实现方式是,本地应用程序在启动的时候主动从服务器请求该应用程序的代码文件,然后执行代码文件版本对比。或者,也可以是程序开发人员在开发应用程序新版本代码后发布到服务器,服务器主动向本地应用程序推送新版本的代码文件,当应用程序启动接收到服务器发送的推送消息时,即可检测服务器上是否存在新版本的应用程序代码文件。
[0064] 上述的将新请求的代码文件与本地代码文件进行对比以判断应用程序代码版本是否有更新,其中一种示例性的实现方式是,应用程序主动识别请求的应用程序代码的版本,进而进行版本比较。或者,当应用程序向服务器发送请求时,也可以直接向服务器发送版本请求,直接请求服务器上的应用程序代码文件的版本,然后与本地应用程序代码文件版本进行对比,判断服务器上的应用程序代码是否有更新。
[0065] 如果所述服务器上有新版本的应用程序代码文件,则执行步骤S202、下载所述新版本的应用程序代码文件;
[0066] 具体的,当检测到服务器上有新版本的应用程序代码文件时,本地应用程序下载新版本的应用程序代码文件。
[0067] 需要说明的是,在应用程序热修复中,一般都是针对原有的应用程序代码开发补丁代码文件,用于解决原有应用程序的个别或部分问题或漏洞,在本地应用程序运行过程中,加载、安装上述的补丁代码文件,以达到对应用程序代码的修复。
[0068] 基于上述热修复技术的基本处理思想,上述的新版本的应用程序代码文件,并不是该应用程序的完整程序代码,而是用于对原有应用程序进行修复的代码,可以理解为与原有应用程序代码中有漏洞或有错误的代码部分对应的新的代码。
[0069] 需要说明的是,适应应用程序所运行的系统特性,针对下载的应用程序代码文件,需要适应性地进行语言转换。
[0070] 本申请实施例技术方案适用于iOS系统,由于iOS系统内部程序代码为Objective-C语言代码,而下载的新版本的应用程序代码文件为JavaScript代码文件,则为了使新版本的JavaScript代码文件能够在iOS系统中运行,应当将新版本的JavaScript代码文件转换为Objective-C语言代码。
[0071] S203、将所述新版本的应用程序代码文件的函数指针指向应用程序中待修复的方法的函数指针;
[0072] 具体的,上述函数指针,是指指向方法实现的首地址的指针,其定义为:id(*IMP)(id,SEL,...);第一个参数是指向self的指针(如果是实例方法,则是类实例的内存地址;如果是类方法,则是指向元类的指针),第二个参数是方法选择器(selector),接下来是方法的实际参数列表。方法选择器selector用于表示运行时方法的名字,又可表示为SEL。
[0073] 由于方法的函数指针指向方法的首地址,也就是指向实现方法的代码的运行首地址,因此可以理解,当应用程序的方法的函数指针指向发生改变时,具体执行的方法也会发生改变。在此基础上,本申请实施例将应用程序运行过程中所执行的待修复的函数,替换为下载的新版本的应用程序代码文件中的新的函数,具体为设置新版本的应用程序代码文件的函数指针指向应用程序中待修复的方法的函数指针,这样就达到了将应用程序运行过程中所运行的待修复的方法函数替换为新版本的方法函数。
[0074] 在Objective-C中,每个类都是这样一个结构体:
[0075]
[0076]
[0077] 其中methodList方法链表里存储的是Method类型:
[0078]
[0079] Method保存了一个方法的全部信息,包括SEL方法名,type各参数和返回值类型,IMP该方法具体实现的函数指针。
[0080] 通过Selector调用方法时,会从methodList链表里找到对应Method进行调用,这个methodList上的的元素是可以动态替换的,可以把某个Selector对应的函数指针IMP替换成新的,也可以拿到已有的某个Selector对应的函数指针IMP,让另一个Selector跟它对应,Runtime提供了一些接口执行上述处理。
[0081] 以替换UIViewController的-viewDidLoad:方法为例:
[0082]
[0083]
[0084] 这样就把UIViewController的-viewDidLoad方法给替换成自定义的方法,APP里调用UIViewController的viewDidLoad方法都会去到上述viewDidLoadIMP函数里,在这个新的IMP函数里调用JS传进来的方法,就实现了替换viewDidLoad方法为JS代码里的实现,同时为UIViewController新增了方法-ORIGViewDidLoad指向原来viewDidLoad的IMP,JS可以通过这个方法调用到原来的实现。
[0085] 在上述关于Objective-C中的类运行方法函数的特性介绍,本申请实施例对类中的方法函数进行指针指向设置,使新版本的应用程序代码中的函数代替需要修复的函数。
[0086] S204、设置应用程序执行到所述待修复的方法的函数指针时,跳转到从所述新版本的应用程序代码文件的函数指针处开始执行。
[0087] 具体的,当通过步骤S203设置新版本的应用程序代码文件的方法函数指针指向需要修复的方法函数指针后,本申请实施例进一步设置当应用程序执行到上述待修复的方法的指针处时,跳转到从新版本的应用程序代码文件的函数指针处开始执行,即不再执行原来的待修复的方法函数,而是转而执行新版本的应用程序代码文件中的方法函数。这样,在不需要重新装载新版本应用程序的前提下,直接在应用程序运行过程中更改其中所运行的方法函数,以达到修复应用程序的目的。
[0088] 另外需要说明的是,本申请实施例上述的应用程序的热修复过程,实际上是替换了应用程序运行过程中所执行的方法函数。但是新版本的方法函数并不能保证一定能够正确运行,为了满足应用程序继续运行原来的方法函数的需求,在上述步骤S203中,本申请实施在设置将新版本的应用程序代码文件的函数指针指向应用程序中待修复的方法的函数指针的同时,还再生成另一个方法函数,该方法函数就是应用程序原有的待修复方法函数,并且设置生成的方法函数的指针指向应用程序中的待修复方法函数。通过上述设置,指向应用程序待修复方法函数指针的,是两个函数指针,分别是新版本的方法函数指针和原始待修复的方法函数指针。
[0089] 当步骤S204设置当应用程序执行到所述待修复的方法的函数指针时,跳转到从所述新版本的应用程序代码文件的函数指针处开始执行,则应用程序不会执行原来的待修复的方法的函数,而是执行新版本的应用程序代码文件的函数。相反,如果在步骤S204中设置当应用程序执行到待修复的方法的函数指针时,跳转到从新生成的方法的函数指针处开始执行,则应用程序所执行的方法函数还是原来待修复的方法函数。
[0090] 通过上述介绍可见,本申请实施例通过对应用程序方法的函数指针指向进行设置,达到替换应用程序在运行过程中所执行的方法函数的目的,以此实现将应用程序中的待修复方法函数替换为新版本的方法函数,从而达到热修复应用程序的目的,上述修复过程不需要重新提交审核应用程序代码,程序修复周期短,修复更迅速,利于提升用户体验。
[0091] 可选的,在本申请的另一个实施例中,还公开了上述将新版本的应用程序代码文件的函数指针指向待修复的方法的函数指针的具体处理过程。
[0092] 参见图3所示,所述将所述新版本的应用程序代码文件的函数指针指向应用程序中待修复的方法的函数指针,包括:
[0093] S303、将所述新版本的JavaScript应用程序代码文件转换成Objective-C语言代码文件;
[0094] 具体的,本申请实施例利用Objective-C的runtime方法,将下载的新版本的JavaScript应用程序代码文件转化成Objective-C语言代码文件,转化后的代码文件可表示为SEL:JPXXX。其中,SEL表示方法的selector指针,XXX表示函数名。
[0095] S304、设置所述Objective-C语言代码文件的函数指针指向应用程序中待修复的方法的函数指针。
[0096] 具体的,本申请将上述转化得到的Objective-C语言代码文件的函数指针,指向原应用程序中待修复的方法的函数指针。
[0097] 同时,为了便于应用程序再次执行原待修复的方法的函数指针,本申请实施例还新增生成一个SEL:ORGIXXX IMP:YYY方法,该方法本质上还是上述待修复的方法,并且设置该方法的函数指针指向原应用程序中待修复的方法的函数指针。可以理解,此时指向待修复的方法的函数指针的,是两个函数指针,一个是新版本的方法的函数指针,一个是原来的就版本的方法的函数指针。在此基础上,可以设置应用程序运行到上述待修复的方法时,是执行新版本的方法,还是执行原来旧版本的方法。
[0098] 本实施例中的步骤S301、S302、S305分别对应图2所示的方法实施例中的步骤S201、S202、S204,其具体内容请参见图2所示的方法实施例的内容,此处不再赘述。
[0099] 在上述步骤S303、S304实现将所述新版本的应用程序代码文件的函数指针指向待修复的方法的函数指针的基础上,上述设置应用程序执行到所述待修复的方法的函数指针时,跳转到从所述新版本的应用程序代码文件的函数指针处开始执行,具体包括:
[0100] 在运行到所述应用程序的Objective-C语言代码文件中的,待修复的方法的函数指针时,执行消息转发处理;其中,所述消息转发处理被设置为跳转到所述新版本的应用程序代码文件的函数指针处开始执行。
[0101] 具体的,在Objective-C中,当对象收到无法解读的消息时,就会启动“消息转发”机制,即探索其他方法来执行,或解读消息。基于上述消息转发机制,本申请实施例在设置好新版本代码的方法的函数指针的指向后,进一步设置,在应用程序运行到其Objective-C语言代码文件中的,待修复的方法的函数指针时,执行消息转发机制,此时具体设置消息转发机制为跳转到新版本的应用程序代码文件的函数指针处开始执行,则此时应用程序就会跳过原有的待修复方法的函数,去执行新版本的代码文件中的函数。
[0102] 可以理解,上述过程实现了真正的方法替换过程,即实现了Objective-C语言代码文件在运行过程中替换其中的方法函数,转而执行下载的新版本方法函数,即达到了热修复应用程序的目的。
[0103] 可选的,在本申请的另一个实施例中还公开了,参见图4所示,上述应用程序修复方法在下载所述新版本的应用程序代码文件后,还包括:
[0104] S403、校验下载的所述新版本的应用程序代码文件是否合法;
[0105] 具体的,当应用程序从服务器下载新版本的应用程序代码文件时,可能发生中途被篡改的情况,为了保证应用程序所下载的应用程序代码文件是正确、合法的应用程序代码文件,也就是原存储于服务器的新版本的应用程序代码文件,本申请实施例设定当应用程序下载新版本的应用程序代码文件后,首先校验下载的新版本的应用程序代码文件是否合法,即检验下载的新版本的应用程序代码文件是否为存在于服务器中的新版本的应用程序代码。
[0106] 一种示例性的实现方式是,当应用程序从服务器下载新版本的应用程序代码文件时,服务器对新版本应用程序的脚本文件进行签名,具体为计算得到新版本的应用程序脚本文件的校验值,例如MD5值,然后利用自身的私钥对新版本的应用程序脚本文件的校验值进行加密,将加密后的应用程序脚本文件的校验值和应用程序脚本文件同时发送给本地应用程序。
[0107] 相应的,本地应用程序下载新版本的应用程序代码文件时,下载到的具体包括新版本的应用程序脚本文件和加密后的应用程序脚本文件的校验值。
[0108] 然后,本地应用程序计算下载到的新版本应用程序的脚本文件的校验值,即计算其MD5值。同时,本地应用程序利用自身的公钥对接收到的加密后的新版本应用程序的脚本文件的校验值进行解密处理,得到解密后的应用程序脚本文件校验值。接下来,本地应用程序对比判断计算得到的应用程序脚本文件的校验值,与解密得到的应用程序脚本文件的校验值是否相同,如果不相同,则说明下载的新版本的应用程序的代码文件不是服务器上的合法、正确的新版本的应用程序的代码文件;如果相同,则可以确定下载的新版本的应用程序的代码文件就是服务器上的合法、正确的新版本的应用程序的代码文件。
[0109] 如果下载的所述新版本的应用程序代码文件合法,则执行步骤S404、将所述新版本的应用程序代码文件的函数指针指向应用程序中待修复的方法的函数指针。
[0110] 本实施例中的步骤S401、S402、S404、S405分别对应图2所示的方法实施例中的步骤S201、S202、S203、S204,其具体内容请参见图2所示的方法实施例的内容,此处不再赘述。
[0111] 本申请另一实施例还公开了一种应用程序修复装置,参见图5所示,该装置包括:
[0112] 代码检测单元100,用于检测服务器上是否有新版本的应用程序代码文件;
[0113] 代码下载单元110,用于当所述服务器上有新版本的应用程序代码文件时,下载所述新版本的应用程序代码文件;
[0114] 第一设置单元120,用于将所述新版本的应用程序代码文件的函数指针指向应用程序中待修复的方法的函数指针;
[0115] 第二设置单元130,用于设置应用程序执行到所述待修复的方法的函数指针时,跳转到从所述新版本的应用程序代码文件的函数指针处开始执行。
[0116] 其中,所述新版本的应用程序代码文件为新版本的JavaScript应用程序代码文件;
[0117] 参见图6所示,在本申请的另一个实施例中公开了所述第一设置单元120,包括:
[0118] 代码转换单元1201,用于将所述新版本的JavaScript应用程序代码文件转换成Objective-C语言代码文件;
[0119] 指针设置单元1202,用于设置所述Objective-C语言代码文件的函数指针指向应用程序中待修复的方法的函数指针。
[0120] 其中,所述第二设置单元130设置应用程序执行到所述待修复的方法的函数指针时,跳转到从所述新版本的应用程序代码文件的函数指针处开始执行时,具体用于:
[0121] 在运行到所述应用程序的Objective-C语言代码文件中的,待修复的方法的函数指针时,执行消息转发处理;其中,所述消息转发处理被设置为跳转到所述新版本的应用程序代码文件的函数指针处开始执行。
[0122] 可选的,在本申请的另一个实施例中还公开了,参见图7所示,所述装置还包括:
[0123] 代码校验单元140,用于校验下载的所述新版本的应用程序代码文件是否合法,如果下载的所述新版本的应用程序代码文件合法,则将所述新版本的应用程序代码文件的函数指针指向应用程序中待修复的方法的函数指针。
[0124] 其中,所述下载所述新版本的应用程序代码文件包括获取服务器下发的应用程序脚本文件和加密后的应用程序脚本文件的校验值;
[0125] 所述代码校验单元140代码校验单元校验下载的所述新版本的应用程序代码文件是否合法时,具体用于:
[0126] 计算接收到的应用程序脚本文件的校验值;
[0127] 对所述加密后的应用程序脚本文件的校验值进行解码,得到所述服务器下发的应用程序脚本文件的校验值;
[0128] 对比计算得到的应用程序脚本文件的校验值与所述服务器下发的应用程序脚本文件的校验值是否相同;
[0129] 如果计算得到的应用程序脚本文件的校验值与所述服务器下发的应用程序脚本文件的校验值相同,则确定下载的所述新版本的应用程序代码文件合法。
[0130] 具体的,上述各个应用程序修复装置的各个单元的具体工作内容,请参见上述方法实施例的内容,此处不再赘述。
[0131] 对于前述的各方法实施例,为了简单描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本申请并不受所描述的动作顺序的限制,因为依据本申请,某些步骤可以采用其他顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作和模并不一定是本申请所必须的。
[0132] 需要说明的是,本说明书中的各个实施例均采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似的部分互相参见即可。对于装置类实施例而言,由于其与方法实施例基本相似,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
[0133] 本申请各实施例方法中的步骤可以根据实际需要进行顺序调整、合并和删减。
[0134] 本申请各实施例种装置及终端中的模块和子模块可以根据实际需要进行合并、划分和删减。
[0135] 本申请所提供的几个实施例中,应该理解到,所揭露的终端,装置和方法,可以通过其它的方式实现。例如,以上所描述的终端实施例仅仅是示意性的,例如,模块或子模块的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个子模块或模块可以结合或者可以集成到另一个模块,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或模块的间接耦合或通信连接,可以是电性,机械或其它的形式。
[0136] 作为分离部件说明的模块或子模块可以是或者也可以不是物理上分开的,作为模块或子模块的部件可以是或者也可以不是物理模块或子模块,即可以位于一个地方,或者也可以分布到多个网络模块或子模块上。可以根据实际的需要选择其中的部分或者全部模块或子模块来实现本实施例方案的目的。
[0137] 另外,在本申请各个实施例中的各功能模块或子模块可以集成在一个处理模块中,也可以是各个模块或子模块单独物理存在,也可以两个或两个以上模块或子模块集成在一个模块中。上述集成的模块或子模块既可以采用硬件的形式实现,也可以采用软件功能模块或子模块的形式实现。
[0138] 专业人员还可以进一步意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、计算机软件或者二者的结合来实现,为了清楚地说明硬件和软件的可互换性,在上述说明中已经按照功能一般性地描述了各示例的组成及步骤。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本申请的范围。
[0139] 结合本文中所公开的实施例描述的方法或算法的步骤可以直接用硬件、处理器执行的软件单元,或者二者的结合来实施。软件单元可以置于随机存储器(RAM)、内存、只读存储器(ROM)、电可编程ROM、电可擦除可编程ROM、寄存器、硬盘、可移动磁盘、CD-ROM、或技术领域内所公知的任意其它形式的存储介质中。
[0140] 最后,还需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
[0141] 对所公开的实施例的上述说明,使本领域专业技术人员能够实现或使用本申请。对这些实施例的多种修改对本领域的专业技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本申请的精神或范围的情况下,在其它实施例中实现。因此,本申请将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。
高效检索全球专利

专利汇是专利免费检索,专利查询,专利分析-国家发明专利查询检索分析平台,是提供专利分析,专利查询,专利检索等数据服务功能的知识产权数据服务商。

我们的产品包含105个国家的1.26亿组数据,免费查、免费专利分析。

申请试用

分析报告

专利汇分析报告产品可以对行业情报数据进行梳理分析,涉及维度包括行业专利基本状况分析、地域分析、技术分析、发明人分析、申请人分析、专利权人分析、失效分析、核心专利分析、法律分析、研发重点分析、企业专利处境分析、技术处境分析、专利寿命分析、企业定位分析、引证分析等超过60个分析角度,系统通过AI智能系统对图表进行解读,只需1分钟,一键生成行业专利分析报告。

申请试用

QQ群二维码
意见反馈