一种更新软件的方法和设备与流程

文档序号:15736516发布日期:2018-10-23 21:34阅读:154来源:国知局

本申请涉及计算机技术领域,特别涉及一种更新软件的方法和设备。



背景技术:

软件升级,指软件从低版本向高版本的更新。由于高版本常常修复低版本的部分BUG(错误),所以经历了软件升级,一般都会比原版本的性能更好,得到优化的效果,用户也能有更好的体验。

除了修复低版本的BUG,如果有新的功能也可以通过软件升级方式进行扩展。

对于MacOS系统,提供了功能丰富的各种应用程序供用户下载使用。这些基于MacOS系统的应用程序如果有BUG或者新的功能也需要通过软件升级方式解决。

如果基于MacOS系统的应用程序出现BUG,比如设计编码导致的程序故障,只能重新下载程序,或者通过安装补丁解决。

这种方式会造成下载的数据量比较大,更新的效率比较低。



技术实现要素:

本申请提供一种更新软件的方法和设备,用以解决现有技术中存在的目前更新软件的效率低的问题。

本申请实施例提供的一种更新软件的方法,该方法包括:

客户端对抽象语法树抽象语法树文件进行反序列化得到树状结构的数据,其中所述抽象语法树文件中包括至少一个第一方法,不同的所述第一方法与所述客户端中的不同的第二方法对应;

针对任意一个第一方法,所述客户端根据树状结构的数据中所述第一方法的目标节点,确定用于执行对应的所述第二方法的功能的子树结构的数据;

所述客户端根据确定的子树结构的数据确定调用信息,以便在需要执行所述第二方法的功能时根据所述调用信息读取所述子树结构的数据。

本申请实施例提供的一种更新软件的设备,该设备包括:

序列化模块,用于对抽象语法树文件进行返序列化得到树状结构的数据,其中所述抽象语法树文件中包括至少一个第一方法,不同的所述第一方法与所述设备中的不同的第二方法对应;

子树确定模块,用于针对任意一个第一方法,根据树状结构的数据中所述第一方法的目标节点,确定用于执行对应的所述第二方法的功能的子树结构的数据;

处理模块,用于根据确定的子树结构的数据确定调用信息,以便在需要执行所述第二方法的功能时根据所述调用信息读取所述子树结构的数据。

本申请实施例客户端对AST(Abstract Syntax Tree,抽象语法树)文件进行返序列化得到树状结构的数据,根据树状结构的数据中所述第一方法的目标节点,确定用于执行对应的所述第二方法的功能的子树结构的数据,并根据所述子树结构的数据确定调用信息,以便在需要执行所述第二方法的功能时根据所述调用信息读取所述子树结构的数据。由于客户端可以在需要执行所述第二方法的功能时根据所述调用信息读取所述子树结构的数据,从而在有错误出现后只需要更新对应的方法,而不需要下载整个客户端,减少了下载的数据量,提高了更新的效率。

附图说明

为了更清楚地说明本申请实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简要介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域的普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。

图1为本申请实施例更新软件的方法流程示意图;

图2为本申请实施例树状结构的数据示意图;

图3为本申请实施例一种子树结构的数据示意图;

图4为本申请实施例另一种子树结构的数据示意图;

图5为本申请实施例更新软件的完整方法流程示意图;

图6为本申请实施例执行功能的方法流程示意图;

图7为本申请实施例更新软件的设备结构示意图。

具体实施方式

为了使本申请的目的、技术方案和优点更加清楚,下面将结合附图对本申请作进一步地详细描述,显然,所描述的实施例仅仅是本申请一部份实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其它实施例,都属于本申请保护的范围。

如图1所示,本申请实施例更新软件的方法包括:

步骤100、客户端对AST文件进行返序列化得到树状结构的数据,其中所述AST文件中包括至少一个第一方法,不同的所述第一方法与所述客户端中的不同的第二方法对应;

步骤101、针对任意一个第一方法,所述客户端根据树状结构的数据中所述第一方法的目标节点,确定用于执行对应的所述第二方法的功能的子树结构的数据;

步骤102、所述客户端并根据所述子树结构的数据确定调用信息,以便在需要执行所述第二方法的功能时根据所述调用信息读取所述子树结构的数据。

本申请实施例客户端对AST文件进行返序列化得到树状结构的数据,根据树状结构的数据中所述第一方法的目标节点,确定用于执行对应的所述第二方法的功能的子树结构的数据,并根据所述子树结构的数据确定调用信息,以便在需要执行所述第二方法的功能时根据所述调用信息读取所述子树结构的数据。由于客户端可以在需要执行所述第二方法的功能时根据所述调用信息读取所述子树结构的数据,从而在有错误出现后只需要更新对应的方法,而不需要下载整个客户端,减少了下载的数据量,提高了更新的效率。

本申请实施例可以应用于采用AST文件和IMP(Implementation,实现)指针的系统,比如MacOS系统、iOS系统等。

可选的,本申请实施例的客户端在启动后会查看是否需要更新。具体方式有很多,比如如果插入外置存储器(例如U盘、移动硬盘等),客户端在启动后可以判断外置存储器中是否有AST文件,如果有,可以进一步判断AST文件对应的版本号是否与客户端对应的版本号匹配,如果匹配,则获取AST文件,并进行更新。

还比如客户端在启动后可以登录服务器判断客户端对应的版本号是否有需要更新的AST文件,如果有,则从服务器下载AST文件,并进行更新。

本申请实施例的AST文件中包括至少一个第一方法,这里的每个第一方法与所述客户端中的一个第二方法对应,且不同的第一方法对应的第二方法也不同。

第二方法是客户端中出现错误的方法,对应的第一方法是需要替换的方法,在完成方法更新后,如果需要用到第二方法的功能,就会执行第一方法。

本申请实施例的AST文件可以使用Objective-C语言编写,并通过开源编译器(例如Clang)进行编译后生成。

下面列举一个生成AST文件的例子。

维护人员可以使用Objective-C语言编写未更新的代码(即源代码),以及针对源代码进行更新的代码(即目标代码)。文件后缀名为.h和.m。

如果需要对客户端源代码已经存在的一个类的某个地热方法做替换,可以拷贝源代码中该类.h文件中所有内容到目标代码的头文件中。

之后使用Clang,通过makefile对上述目标代码进行编译,编译后就得到对应的AST文件。

需要说明的是,上述得到AST文件的内容只是举例说明,任何能够生成包含第一方法的AST文件的方式都适用本申请实施例。

下面详细介绍下更新的过程。

客户端启动并获取到需要更新的AST文件后,对AST文件进行反序列化得到树状结构的数据。

AST文件在通过Clang编译生成时,是结构化的字符文件,每个节点为一行字符串,父节点与子节点之间通过缩进判断,若相邻两个节点中后一个节点比前一节点缩进多一个单位,则表示后一节点是前一节点的子节点,如果相邻两个节点中后一个节点与前一节点的缩进相同,则表示两个节点一定拥有同一个父节点。

客户端将获取到需要更新的AST文件存储到内存后,读取AST文件之前建立一个空的根节点,并且建立一个由索引值促成的数组,初始值为[0],该索引值i表示是某个节点的第i个子节点。

以行为单位遍历AST文件,具体步骤如下:

1.判断该行存在多少个缩进单位,记为n,如n=0,则执行3,否则执行2。

2.判断n与上述索引值数组元素的关系:

i)若n>数组长度–1,则索引值数组增加一个元素0;

ii)若n<数组长度–1,则首先保留将索引值数组前n个元素,并将保留后的数组的最后一个元素自增1;

iii)若不满足i)和ii)则将数组的最后一个元素自增1。

3.生成一个空的节点,将该行字符串与节点绑定。

4.将上述节点作为子节点通过上述索引值插入对应的节点。

可选的,针对任意一个第一方法,所述客户端根据树状结构的数据中所述第一方法的目标节点,确定用于执行对应的所述第二方法的功能的子树结构的数据时,所述客户端确定所述树状结构的数据中以所述第一方法的所述目标节点为根节点的子树结构的数据;

所述客户端将确定的子树结构的数据作为用于执行对应的所述第二方法的功能的子树结构的数据。

这里以附图进行说明。

如图2所示,一种可能的树状结构的数据示意图。

如果AST文件中有一个第一方法,则树状结构的数据中有一个目标节点;

如果AST文件中有多个第一方法,则树状结构的数据中有多个目标节点。

也就是说,一个第一方法对应一个目标节点。

图2中是以AST文件中包括两个第一方法举例说明。

图2中节点3和节点4是目标节点。针对每个第一方法都会得到一个子树结构的数据。

客户端会将树状结构的数据中的每个目标节点作为一个根节点,确定所述树状结构的数据中以所述第一方法的所述目标节点为根节点的子树结构的数据。

比如以节点3作为根节点得到的子树结构的数据入图3所示。

以节点4作为根节点得到的子树结构的数据入图4所示。

客户端可以从树状结构的数据中拷贝确定的每个子树结构的数据,得到独立的子树结构的数据。

在实施中,客户端可以将树状结构的数据中类型为ObjCMethodDecl(其他类型也适用,具体可以预先设置)的节点作为一个目标节点。

可选的,所述客户端根据确定的子树结构的数据确定调用信息时,根据确定的子树结构的数据确定用于读取子树结构的数据的实现指针;将所述实现指针置于调用信息中,以便在需要执行所述第二方法的功能时根据所述调用信息中的实现指针读取所述子树结构的数据。

也就是说,在得到子树结构的数据后,针对每个子树结构的数据会得到一个IMP指针,将得到的IMP指针置于调用信息中就完成将第一方法替换第二方法的过程。

具体的,针对任意一个第一方法,所述客户端根据所述AST文件中所述第一方法的方法名和方法类,生成所述第一方法对应的block;

所述客户端根据所述第一方法对应的block,生成对应的IMP指针;

所述客户端将所述IMP指针置于调用信息中。

第一方法的方法名和方法类可以在对应的子树结构的数据的根节点,即目标节点处获得。

可选的,所述客户端根据所述AST文件中所述第一方法的方法名和方法类,生成所述第一方法对应的block时,将方法名和方法类置于block中。即在block中会使用子树结构的数据的根节点(也就是说,block与子树结构的数据的根节点具有绑定关系)。

所述客户端根据所述第一方法对应的block,生成对应的IMP指针的方式根据应用的不同具体方式也不同。

以MacOS系统为例,调用原生系统API imp_implementationWithBlock方法,传入第一方法对应的block,即将block作为参数传递,就可以得到IMP指针:

IMP newIMP=imp_implementationWithBlock(block)。

可选的,所述客户端将所述IMP指针置于调用信息中。

以MacOS系统为例,调用信息可以是method_setImplementation(即原生系统API(Application Programming Interface,应用程序编程接口)),通过调用method_setImplementation,可以将新得到的IMP指针覆盖第一方法的方法类原来的IMP指针,从而实现第一方法替换第二方法。

其中,将所述IMP指针置于method_setImplementation时,还需要第二参数Method指针,Method指针通过将类名与方法置于class_getInstanceMethod方法得到。

即将所述IMP指针置于method_setImplementation时,可以通过调用class_getInstanceMethod(类,方法名)实现访问method_setImplementation(method,IMP指针)。

在将用于读取子树结构的数据的IMP指针置于调用信息中之后,如果用户在使用客户端时需要用到第二方法的功能,客户端会执行对应的第一方法。也就是说,替换的第一方法并不会马上执行,需要等到客户端调用第二方法时,才会执行对应的第一方法。

下面详细介绍下。

可选的,所述客户端在需要执行所述第二方法对应的功能时,确定所述调用信息中所述第二方法对应的IMP指针;

所述客户端根据IMP指针确定对应的block;

所述客户端确定的block读取与所述第二方法对应的第一方法的所述子树结构的数据,执行所述第二方法对应的功能。

在实施中,本申请实施例应用的系统会将该类的某个方法对应的IMP指针与方法名的映射关系保存到一个表里,当该类调用某个方法时,通过上述的这个表,查表可以得到IMP指针。

其中,客户端确定所述调用信息中所述第二方法对应的IMP指针时,可以通过系统确定;也可以由客户端通过查表确定。

在确定IMP指针后,客户端根据IMP指针确定对应的block。由于在生成IMP指针时是根据所述第一方法对应的block,实际上block和IMP指针已经有了绑定关系,所以根据IMP指针就可以确定对应的blcok。

由于第一方法对应的block与对应的子树结构的数据具有绑定关系,所以可以在block中获取到对应的子树结构的数据。

在找到子树结构的数据后,就可以读取子树结构的数据实现对应的功能。

其中,在找到子树结构的数据后,会对这个子树进行深度优先遍历。对遍历的每个树节点,根据节点的类型,进行不同的操作。

如进行不同的操作可以是生成一个变量并保存、计算一个表达式的值、进行一个方法调用等。

如图5所示,本申请实施例更新软件的完整方法包括:

步骤500、客户端启动。

步骤501、客户端登录服务器判断客户端对应的版本号是否有需要更新的AST文件,如果有,则执行步骤502;否则,跳出本流程。

步骤502、客户端从服务器下载AST文件。

步骤503、客户端对AST文件进行返序列化得到树状结构的数据。

步骤504、客户端从树状结构的数据中选择一个之前未选择的目标节点。

步骤505、客户端确定所述树状结构的数据中以选择的所述目标节点为根节点的子树结构的数据。

步骤506、所述客户端将确定的子树结构的数据作为用于执行对应的所述第二方法的功能的子树结构的数据。

步骤507、所述客户端判断是否还有未选择的目标节点,如果是,则返回步骤504;否则,执行步骤508。

步骤508、所述客户端从所述AST文件中选择一个之前未选择的所述第一方法的方法名和方法类。

步骤509、所述客户端根据选择的所述第一方法的方法名和方法类,生成所述第一方法对应的block。

步骤510、所述客户端根据所述第一方法对应的block,生成对应的IMP指针。

步骤511、所述客户端将所述IMP指针置于调用信息中。

步骤512、所述客户端判断所述AST文件中是否没有未选择的所述第一方法的方法名和方法类,如果是,则结束本流程,否则,返回步骤508。

如图6所示,本申请实施例执行功能的方法包括:

步骤600、客户端确定需要执行所述第二方法对应的功能。

步骤601、客户端从所述调用信息中查找第二方法对应的IMP指针。

步骤602、客户端根据查找到的IMP指针确定对应的block。

步骤603、客户端从所有子树结构的数据中查找包含确定的block中的方法名和方法类的子树结构的数据。

步骤604、客户端根据查找到的所述子树结构的数据,执行所述第二方法对应的功能。

基于同一发明构思,本申请实施例中还提供了一种更新软件的设备,由于该设备解决问题的原理与本申请实施例更新软件的方法相似,因此该设备的实施可以参见方法的实施,重复之处不再赘述。

如图7所示,本申请实施例更新软件的设备包括:

序列化模块700,用于对AST文件进行返序列化得到树状结构的数据,其中所述AST文件中包括至少一个第一方法,不同的所述第一方法与所述设备中的不同的第二方法对应;

子树确定模块701,用于针对任意一个第一方法,根据树状结构的数据中所述第一方法的目标节点,确定用于执行对应的所述第二方法的功能的子树结构的数据;

处理模块702,用于根据所述子树结构的数据确定调用信息,以便在需要执行所述第二方法的功能时根据所述调用信息读取所述子树结构的数据。

本申请实施例可以应用于采用AST文件和IMP指针的系统,比如MacOS系统、iOS系统等。

本申请实施例的AST文件中包括至少一个第一方法,这里的每个第一方法与所述客户端中的一个第二方法对应,且不同的第一方法对应的第二方法也不同。

第二方法是设备中出现错误的方法,对应的第一方法是需要替换的方法,在完成方法更新后,如果需要用到第二方法的功能,就会执行第一方法。

本申请实施例的AST文件可以使用Objective-C语言编写,并通过开源编译器(例如Clang)进行编译后生成。

下面详细介绍下更新的过程。

可选的,所述序列化模块700还用于:

在启动时根据版本号在确定需要更新后获取所述AST文件。

可选的,所述子树确定模块701具体用于:

针对任意一个第一方法,确定所述树状结构的数据中以所述第一方法的所述目标节点为根节点的子树结构的数据;

将确定的子树结构的数据作为用于执行对应的所述第二方法的功能的子树结构的数据。

这里以附图进行说明。

如图2所示,一种可能的树状结构的数据示意图。

如果AST文件中有一个第一方法,则树状结构的数据中有一个目标节点;

如果AST文件中有多个第一方法,则树状结构的数据中有多个目标节点。

也就是说,一个第一方法对应一个目标节点。

图2中是以AST文件中包括两个第一方法举例说明。

图2中节点3和节点4是目标节点。针对每个第一方法都会得到一个子树结构的数据。

子树确定模块701会将树状结构的数据中的每个目标节点作为一个根节点,确定所述树状结构的数据中以所述第一方法的所述目标节点为根节点的子树结构的数据。

比如以节点3作为根节点得到的子树结构的数据入图3所示。

以节点4作为根节点得到的子树结构的数据入图4所示。

子树确定模块701可以从树状结构的数据中拷贝确定的每个子树结构的数据,得到独立的子树结构的数据。

在实施中,子树确定模块701可以将树状结构的数据中类型为ObjCMethodDecl(其他类型也适用,具体可以预先设置)的节点作为一个目标节点。

可选的,所述处理模块702具体用于:

根据确定的子树结构的数据确定用于读取子树结构的数据的实现指针;

将所述实现指针置于调用信息中,以便在需要执行所述第二方法的功能时根据所述调用信息中的实现指针读取所述子树结构的数据。

具体的,针对任意一个第一方法,所述处理模块702根据所述AST文件中所述第一方法的设备名和设备类,生成所述第一方法对应的block;

根据所述第一方法对应的block,生成对应的IMP指针;

将所述IMP指针置于调用信息中。

第一方法的方法名和方法类可以在对应的子树结构的数据的根节点,即目标节点处获得。

可选的,所述处理模块702根据所述AST文件中所述第一方法的方法名和方法类,生成所述第一方法对应的block时,将方法名和方法类置于block中。即在block中会使用子树结构的数据的根节点(也就是说,block与子树结构的数据的根节点具有绑定关系)。

所述客户端根据所述第一方法对应的block,生成对应的IMP指针的方式根据应用的不同具体方式也不同。

以MacOS系统为例,处理模块702调用原生系统APIimp_implementationWithBlock方法,传入第一方法对应的block,即将block作为参数传递,就可以得到IMP指针:

IMP newIMP=imp_implementationWithBlock(block)。

可选的,所述处理模块702将所述IMP指针置于调用信息中。

以MacOS系统为例,调用信息可以是method_setImplementation(即原生系统API),通过调用method_setImplementation,可以将新得到的IMP指针覆盖第一方法的方法类原来的IMP指针,从而实现第一方法替换第二方法。

其中,将所述IMP指针置于method_setImplementation时,可以通过调用class_getInASTnceMethod实现访问method_setImplementation。

即将所述IMP指针置于method_setImplementation时,可以通过调用class_getInstanceMethod(类,方法名)实现访问method_setImplementation(method,IMP指针)。

可选的,所述处理模块702还用于:

在需要执行所述第二方法对应的功能时,确定所述调用信息中所述第二方法对应的IMP指针;

根据IMP指针确定对应的block;

确定的block读取与所述第二方法对应的第一方法的所述子树结构的数据,执行所述第二方法对应的功能。

在实施中,本申请实施例应用的系统会将该类的某个方法对应的IMP指针与方法名的映射关系保存到一个表里,当该类调用某个方法时,通过上述的这个表,查表可以得到IMP指针。

其中,所述处理模块702确定所述调用信息中所述第二方法对应的IMP指针时,,可以通过系统确定;也可以由客户端通过查表确定。

在确定IMP指针后,所述处理模块702根据IMP指针确定对应的block。由于在生成IMP指针时是根据所述第一方法对应的block,实际上block和IMP指针已经有了绑定关系,所以根据IMP指针就可以确定对应的blcok。

由于第一方法对应的block与对应的子树结构的数据具有绑定关系,所以可以在block中获取到对应的子树结构的数据。

在找到子树结构的数据后,就可以读取子树结构的数据实现对应的功能。

其中,在找到子树结构的数据后,会对这个子树进行深度优先遍历。对遍历的每个树节点,根据节点的类型,进行不同的操作。

如进行不同的操作可以是生成一个变量并保存、计算一个表达式的值、进行一个方法调用等。

以上参照示出根据本申请实施例的方法、装置(系统)和/或计算机程序产品的框图和/或流程图描述本申请。应理解,可以通过计算机程序指令来实现框图和/或流程图示图的一个块以及框图和/或流程图示图的块的组合。可以将这些计算机程序指令提供给通用计算机、专用计算机的处理器和/或其它可编程数据处理装置,以产生机器,使得经由计算机处理器和/或其它可编程数据处理装置执行的指令创建用于实现框图和/或流程图块中所指定的功能/动作的方法。

相应地,还可以用硬件和/或软件(包括固件、驻留软件、微码等)来实施本申请。更进一步地,本申请可以采取计算机可使用或计算机可读存储介质上的计算机程序产品的形式,其具有在介质中实现的计算机可使用或计算机可读程序代码,以由指令执行系统来使用或结合指令执行系统而使用。在本申请上下文中,计算机可使用或计算机可读介质可以是任意介质,其可以包含、存储、通信、传输、或传送程序,以由指令执行系统、装置或设备使用,或结合指令执行系统、装置或设备使用。

显然,本领域的技术人员可以对本申请进行各种改动和变型而不脱离本申请的精神和范围。这样,倘若本申请的这些修改和变型属于本申请权利要求及其等同技术的范围之内,则本申请也意图包含这些改动和变型在内。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1