CN105589701B - 一种客户端应用程序局部更新方法及装置 - Google Patents
一种客户端应用程序局部更新方法及装置 Download PDFInfo
- Publication number
- CN105589701B CN105589701B CN201410561887.1A CN201410561887A CN105589701B CN 105589701 B CN105589701 B CN 105589701B CN 201410561887 A CN201410561887 A CN 201410561887A CN 105589701 B CN105589701 B CN 105589701B
- Authority
- CN
- China
- Prior art keywords
- java
- local
- client application
- replaced
- goal approach
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Landscapes
- Stored Programmes (AREA)
Abstract
本申请实施例公开了一种客户端应用程序局部更新方法及装置。利用Android系统框架的特性和JNI机制,客户端应用程序从更新包获取用于Java目标方法后,将Java目标方法传递至本地层并保存,并将Java目标方法与JNI本地回调方法关联,当客户端应用程序在Dalvik虚拟机上运行,需要调用待替换的Java方法时,不再调用原始的待替换的Java方法,而是调用JNI本地回调方法,JNI本地回调方法根据客户端应用程序传入的参数调用所述Java目标方法,完成对客户端应用程序代码的局部更新。本申请提出的客户端应用程序代码局部更新方法,可以精准到Java类的Method级别。
Description
技术领域
本发明涉及软件技术领域,尤其涉及一种客户端应用程序局部更新方法及装置。
背景技术
智能终端的普及不仅推动了移动互联网的发展,也带来了客户端应用程序的爆炸式增长。客户端应用程序是安装在智能终端上的应用程序,为用户提供上网、娱乐、商务和生活事件处理等功能。为了吸引用户,提高用户体验,客户端应用程序供应商不断开发新的客户端应用程序,或者对客户端应用程序不断添加新的功能。但在客户端应用程序的快速迭代开发中,经常会遇到由于测试不到位或者测试用例覆盖不全,导致客户端应用程序发布后才暴露出问题,或者后期服务端业务逻辑发生变更导致客户端应用程序的功能不可用,此时就不可避免地要对客户端应用程序进行更新。
客户端应用程序的更新一般分为两种:一种是全量更新,即重新发布一个完整的客户端应用程序版本,用户安装新的客户端应用程序来实现更新,但这种方式过程繁琐,更新周期长,适用于客户端应用程序改动很大的情况;另一种是局部更新,只对客户端应用程序的部分代码进行替换,这种方式过程简单,时间短,适用于客户端应用程序改动少的情况,这也是客户端应用程序最常出现的情况。
对基于Android系统(安卓)的智能终端而言,客户端应用程序使用java语言开发。最常用的局部更新技术便是使用Java的类动态加载技术,亦即使用Google公司提供的两个ClassLoader(类加载)类来实现类的加载替换,从而实现客户端应用程序的局部更新,这种方式虽然简单,但是只能做到类(Class)级别的替换。
发明内容
本申请提供一种客户端应用程序局部更新方法及装置,使得客户端应用程序的局部更新更为便利。
根据本申请实施例的第一方面,提供一种客户端应用程序局部更新方法,包括:
客户端应用程序将Java目标方法传递至本地层;
在本地层保存所述Java目标方法,将JNI本地回调方法与所述Java目标方法进行关联;
客户端应用程序在虚拟机上运行时,根据所述JNI本地回调方法调用所述Java目标方法。
可选的,所述的客户端应用程序局部更新方法,还包括:
客户端应用程序将待替换的Java方法传递至本地层;
在本地层保存所述待替换的Java方法,将JNI本地回调方法与所述待替换的Java方法进行关联;
客户端应用程序在虚拟机上运行时,当需要返回待替换的Java方法时,根据所述JNI本地回调方法调用所述待替换的Java方法。
可选的,客户端应用程序使用钩子方法将Java目标方法和待替换的Java方法传递至本地层。
可选的,所述的客户端应用程序局部更新方法,在客户端应用程序将Java目标方法传递至本地层之前,还包括:
当客户端应用程序查询到存在方法的更新时,从更新包中获取Java目标方法。
其中,根据所述JNI本地回调方法调用所述Java目标方法,包括:
调用所述JNI本地回调方法,获取待替换的Java方法或者Java目标方法的回调函数;
所述回调函数调用所述待替换的Java方法或者所述Java目标方法。
根据本申请实施例的第二方面,提供一种客户端应用程序局部更新装置,包括:
客户端应用程序方法传递模块,用于将Java目标方法传递至本地层;
方法保存模块,在本地层保存所述Java目标方法;
JNI本地回调方法模块,用于将JNI本地回调方法与所述Java目标方法进行关联;
客户端应用程序调用模块,用于客户端应用程序在虚拟机上运行时,根据所述JNI本地回调方法调用所述Java目标方法。
可选的,所述客户端应用程序方法传递模块,还用于将待替换的Java方法传递至本地层;
所述方法保存模块,还用于在本地层保存所述待替换的Java方法;
所述JNI本地回调方法模块,还用于将JNI本地回调方法与所述待替换的Java方法进行关联;
所述客户端应用程序调用模块,还用于客户端应用程序在虚拟机上运行,当需要返回待替换的Java方法时,根据所述JNI本地回调方法调用所述待替换的Java方法。
可选的,所述客户端应用程序方法传递模块使用钩子方法将Java目标方法和待替换的Java方法传递至本地层。
可选的,所述的客户端应用程序局部更新装置,还包括:
客户端应用程序更新查询模块,用于查询客户端应用程序是否需要进行更新;
客户端应用程序方法获取模块,用于当客户端应用程序更新查询模块查询到存在方法的更新时,从更新包中获取Java目标方法。
可选的,所述客户端应用程序调用模块,包括:
回调方法调用子模块,用于调用所述JNI本地回调方法,获取待替换的Java方法或者Java目标方法的回调函数;
回调子模块,用于使用所述回调函数调用所述待替换的Java方法或所述Java目标方法。
本申请实施例提供的技术方案可以包括以下有益效果:利用Android系统框架的特性和JNI机制,客户端应用程序从更新包获取用于Java目标方法后,将Java目标方法传递至本地层并保存,并将Java目标方法与JNI本地回调方法关联,所述JNI本地回调方法用于存储Java目标方法的回调函数,所述回调函数保存Java目标方法的函数指针。由此当客户端应用程序在Dalvik虚拟机上运行,需要调用待替换的Java方法时,不再调用原始的待替换的Java方法,而是调用JNI本地回调方法,JNI本地回调方法根据客户端应用程序传入的参数查找对应的Java目标方法的回调函数,所述回调函数根据Java目标方法的函数指针,调用所述Java目标方法,完成对客户端应用程序代码的局部更新。本申请提出的客户端应用程序代码局部更新方法,可以精准到Java类的方法(Method)级别,而且不需加入额外的脚本或桥接代码,能保持和原生开发相同的性能。
应当理解的是,以上的一般描述和后文的细节描述仅是示例性和解释性的,并不能限制本申请。
附图说明
为了更清楚地说明本申请实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,对于本领域普通技术人员而言,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1为本申请一示例性实施例示出的一种客户端应用程序局部更新方法的流程示意图。
图2为本申请另一示例性实施例示出的一种客户端应用程序局部更新方法的流程示意图。
图3为本申请一示例性实施例示出的一种客户端应用程序局部更新装置的框图。
图4为本申请另一示例性实施例示出的一种客户端应用程序局部更新装置的框图。
具体实施方式
这里将详细地对示例性实施例进行说明,其示例表示在附图中。下面的描述涉及附图时,除非另有表示,不同附图中的相同数字表示相同或相似的要素。以下示例性实施例中所描述的实施方式并不代表与本申请相一致的所有实施方式。相反,它们仅是与如所附权利要求书中所详述的、本申请的一些方面相一致的装置和方法的例子。
为了全面理解本申请,在以下详细描述中提到了众多具体的细节,但是本领域技术人员应该理解,本申请可以无需这些具体细节而实现。在其他实施例中,不详细描述公知的方法、过程、组件和装置,以免不必要地导致实施例模糊。
为更好地理解本申请,先对Android客户端应用程序运行原理作简单介绍。Android的客户端应用程序开发语言为Java。Android系统中,客户端应用程序的代码都运行于Dalvik虚拟机上,Dalvik虚拟机为Google公司设计的用于Android系统的Java虚拟机,为Android平台的核心组成部分之一,支持转换为dex(即Dalvik Executable的缩写,Dalvik可执行)格式的Java客户端应用程序代码的运行。dex格式是专为Dalvik设计的一种压缩格式,适合内存和处理器速度有限的系统。Dalvik经过优化,允许在有限的内存中同时运行多个虚拟机的实例,并且每一个Dalvik客户端应用程序作为一个独立进程执行。Android客户端应用程序的Java代码都是编译成dex文件之后打包安装在Android系统上,由Android系统的Dalvik虚拟机解释执行,包括类的加载、类的成员变量的赋值以及类的方法的调用等。但Dalvik虚拟机由C++代码实现的,因此Dalvik和Java实现的dex文件相互之间有很多JNI(Java Native Interface,Java本地接口)方法调用,其中,JNI方法是直接在本地操作系统上执行的,而不是由Dalvik虚拟机解释器执行,用于实现Java代码和其他语言的代码的交互,及Java层和本地层的交互。
图1为本申请一示例性实施例示出的一种客户端应用程序局部更新方法的流程示意图,如图1所示,所述客户端应用程序局部更新方法包括:
步骤S101,客户端应用程序将Java目标方法传递至本地层。所述Java目标方法为用于替换客户端应用程序中待替换的Java方法的新的Java方法。
步骤S102,在本地层保存所述Java目标方法,将JNI本地回调方法与所述Java目标方法进行关联。
步骤S103,客户端应用程序在虚拟机上运行时,根据所述JNI本地回调方法调用所述Java目标方法。
其中,Java目标方法和待替换的Java方法为Java类(Class)中的方法(Method)。通常客户端应用程序需要更新时,客户端应用程序供应商或开发者会发布更新包,客户端应用程序可以下载更新包并获取更新信息,所述更新信息包括更新包的版本号。客户端应用程序启动运行后,读取更新包,可以调用Android系统的JNI钩子方法(hook method),例如Xposed框架下XposedBridge私有的JNI方法hookMethodNative,将从更新包中获取的Java目标方法作为钩子方法的输入参数,钩子方法将Java目标方法的类型改变为Native(本地),从而将Java目标方法传递至本地层。在hookMethodNative的实现中,还会调用XposedBridge中的handleHookedMethod这个方法来传递Java目标方法的参数信息,handleHookedMethod利用Dalvik提供的Method结构体来传递参数信息。
将更新包中获取的Java目标方法传递至本地层,还可以通过Direct Buffer(直接缓冲区)来进行,即在本地内存创建了一个Java层和JNI层共享的内存区域,即DirectBuffer,Java层或者JNI层均可以访问该内存区域。客户端应用程序运行时,将更新包中获取的Java目标方法保存至Direct Buffer,JNI层再从Direct Buffer读取Java目标方法,并将Java目标方法定义为Native,从而将Java目标方法传递至本地层。由于构造和维护Direct Buffer代价比较大,使用JNI钩子方法有利于节省资源。
其中,Java目标方法传递至本地层,即Java目标方法改变为本地方法后,保存与本地层,例如保存于methodcache中,Java目标方法在客户端应用程序关闭前不会从methodcache中删除。同时,将JNI本地回调方法与Java目标方法关联。所述JNI本地回调方法为JNI本地方法,用于存储Java目标方法的回调函数,如果有多个Java目标方法,则每个Java目标方法的回调函数组成回调函数集合,JNI本地回调方法存储所述回调函数集合。将JNI本地回调方法与Java目标方法关联,即Java目标方法的回调函数添加到JNI本地回调方法的回调函数集合中。Java目标方法的回调函数可以自行编写,编写方式与常规的回调函数编写方式相同,回调函数与Java目标方法的Method ID对应,回调函数中保存Java目标方法的函数指针,。
其中,Java目标方法的方法名和待替换的Java方法的方法名相同。可以根据Java目标方法的方法名构建成Method ID,也可以根据Java目标方法的方法名和部分参数信息构建成Method ID,所述部分参数信息为Java目标方法中与被替换成的方法中相同的参数信息。待替换的Java方法的Method ID可以与Java目标方法的Method ID相同。JNI本地回调方法中,使用Java目标方法的Method ID与Java目标方法的回调函数对应。
其中,当客户端应用程序在Dalvik虚拟机上运行,需要调用原始的待替换的Java方法时,不再调原始的待替换的Java方法,而是调用JNI本地回调方法,并将待替换的Java方法的Method ID传给JNI本地回调方法,JNI本地回调方法根据所述Method ID值找到对应的回调函数,回调函数根据Java目标方法的函数指针调用Java目标方法,从而实现代码的局部更新。
本申请实施例一提供的客户端应用程序局部更新方法,基于Android系统框架的JNI机制,客户端应用程序从更新包获取Java目标方法后,将Java目标方法定义为本地方法,从而将Java目标方法传递至本地层,在本地层保存所述Java目标方法,将Java目标方法与JNI本地回调方法关联,所述JNI本地回调方法用于存储Java目标方法的回调函数。当客户端应用程序在Dalvik虚拟机上运行,需要调用待替换的Java方法时,不再调用原始的待替换的Java方法,而是调用JNI本地回调方法,JNI本地回调方法根据客户端应用程序传入的参数查找对应的Java目标方法的回调函数,所述回调函数根据Java目标方法的函数指针,调用所述Java目标方法,完成对客户端应用程序的局部代码更新。本申请实施例一提出的Android客户端应用程序代码局部更新方法,可以精准到Java类的方法(Method)级别,而且不需加入额外的脚本或桥接代码,能保持和原生开发相同的性能。
图2为本申请另一示例性实施例示出的一种Android客户端应用程序局部更新方法的流程示意图,如图2所示,所述方法包括:
步骤S201,当客户端应用程序需要进行更新时,从更新包中获取Java目标方法。
其中,通常当客户端应用程序供应商或者开发者发布了新的客户端应用程序版本,用户下载安装新的客户端应用程序版本后,客户端应用程序得到全量更新,这种情况下,如果没有发布新的客户端应用程序更新包,则由于客户端应用程序已经得到更新,不必再从更新包中获取Java目标方法来对客户端应用程序进行更新。因此,客户端应用程序运行时,可以先查询是否需要更新,例如,如果客户端应用程序全量更新时删除了之前的更新包,则可以查询是否存在更新包,如果不存在更新包,则不进行更新,如果存在更新包,则比较更新包的版本号和当前客户端应用程序的版本号,如果更新包的版本号大于当前客户端应用程序的版本号,则说明需要进行更新,否则,不存在更新;在有些实施例中,客户端应用程序的更新是下载新的更新包进行安装,新的更新包覆盖旧的更新包,因此可以直接比较更新包的版本号和当前客户端应用程序的版本号来判断是否需要进行更新。如果客户端应用程序全量更新时未删除之前的更新包,且保存了多个更新包,更新包更新时,是下载新的更新包进行安装,但并不覆盖和删除之前的更新包,则可以比较最新的更新包的版本号和当前客户端应用程序的版本号来判断是否存在方法的更新。当存在方法的更新时,从更新包,或者从多个更新包中最新的更新包,获取Java目标方法。客户端应用程序从更新包获取Java目标方法可以使用常规的客户端应用程序更新包处理方法。
当客户端应用程序查询到需要进行更新时,从更新包中获取Java目标方法,可以防止不必要的更新操作,节约系统资源。
步骤S202,客户端应用程序将待替换的Java方法和Java目标方法传递至本地层。
步骤S203,在本地层保存所述待替换的Java方法和所述Java目标方法,将JNI本地回调方法与所述待替换的Java方法和所述Java目标方法进行关联。
步骤S204,客户端应用程序在虚拟机上运行时,根据所述JNI本地回调方法调用所述Java目标方法。
步骤S205,当需要返回待替换的Java方法时,根据所述JNI本地回调方法调用所述待替换的Java方法。
其中,为Java目标方法和待替换的Java方法设置不同的MethodID。客户端应用程序在将Java目标方法和待替换的Java方法同时传递至本地层,传递的方法与步骤S101的方法相同,Java目标方法和待替换的Java方法都被定义为Native方法。待替换的Java方法和Java目标方法传递到本地层后在本地层保存,例如保存于methodcache中。同时,将JNI本地回调方法与Java目标方法和待替换的Java方法关联。所述JNI本地回调方法用于存储Java目标方法以及待替换的Java方法的回调函数。Java目标方法的回调函数中保存Java目标方法的函数指针,与Java目标方法的Method ID对应;待替换的Java方法的回调函数中保存待替换的Java方法的函数指针,与待替换的Java方法的回调函数的Method ID对应。
其中,当客户端应用程序运行中需要调用原始的待替换的Java方法时,不再调用原始的待替换的Java方法,而是调用JNI本地回调方法,默认情况下,即需要对待替换的Java方法进行更新的情况下,JNI本地回调方法默认根据客户端应用程序传入的MethodID,找到对应的Java目标方法的回调函数,Java目标方法的回调函数根据Java目标方法的函数指针调用Java目标方法,实现代码的局部更新。其中,客户端应用程序调用JNI本地回调方法时传给JNI本地回调方法的Method ID,可以与待替换的Java方法的Method ID相同,也可以与待替换的Java方法的Method ID以及Java目标方法的Method ID都不相同,但客户端应用程序调用JNI本地回调方法时传给JNI本地回调方法的Method ID,必须和待替换的Java方法的Method ID以及Java目标方法的Method ID拥有相同的字段,待替换的Java方法的Method ID与Java目标方法的Method ID也拥有该相同的字段,且该字段唯一,从而将户端软件调用JNI本地回调方法时传给JNI本地回调方法的Method ID、待替换的Java方法的Method ID以及Java目标方法的Method ID对应起来。当客户端应用程序根据所述JNI本地回调方法调用Java目标方法失败或者出错,或者Java目标方法存在错误导致Java目标方法不能成功执行,需要返回待替换的Java方法时,客户端应用程序根据失败或者错误信息,重新调用JNI本地回调方法,并向JNI本地回调方法传入Method ID和返回信息,所述返回信息可以为一个逻辑变量,例如,客户端应用程序调用Java目标方法失败或者出错,或者Java目标方法本身出错时,客户端应用程序设置返回信息为1。当JNI本地回调方法接收客户端应用程序传入的Method ID和返回信息,查找待替换的Java方法的回调函数,待替换的Java方法的回调函数根据待替换的Java方法的函数指针,调用待替换的Java方法。
需要说明的是,在本实施例中,JNI本地回调方法的输入参数设置为包括客户端应用程序传入的Method ID和返回信息,并根据客户端应用程序是否传入返回信息来判断是查找对应的Java目标方法的回调函数还是待替换的Java方法的回调函数,例如,默认情况下,客户端应用程序需要调用Java目标方法时,可以不向JNI本地回调方法传入返回信息,如果JNI本地回调方法接收的返回信息为空,则JNI本地回调方法使用默认模式,查找对应的Java目标方法的回调函数;默认情况下,客户端应用程序也可以像JNI本地回调方法传入返回信息,但默认情况下返回信息的值与需要返回待替换的Java方法时的返回信息的值不同,例如默认情况下,返回信息值为0,当JNI本地回调方法接收到的返回信息值为0时,使用默认模式,查找对应的Java目标方法的回调函数,当需要返回待替换的Java方法时,客户端应用程序将返回信息值设置为1,当JNI本地回调方法接收到的返回信息值为1时,查找对应的待替换的Java方法的回调函数。
本申请实施例一提供的客户端应用程序局部更新方法,不仅将Java目标方法传递至本地层并保存,也将待替换的Java方法传递至本地层并保存,并将待替换的Java方法也和JNI本地回调方法进行关联。从而在客户端应用程序局部代码更新失败,例如调用Java目标方法失败或出错,或者Java目标方法本身出错,需要返回待替换的Java方法时,可以通过调用JNI本地回调方法,实现对待替换的Java方法的调用。由此可以防止局部代码更新失败时客户端应用程序运行中断或出现严重程序错误,使局部代码更新失败时也能保持客户端应用程序的正常运行。
通过以上的方法实施例的描述,所属领域的技术人员可以清楚地了解到本申请可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,并存储在一个存储介质中,包括若干指令用以使得一台智能设备执行本申请各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:只读存储器(ROM)、随机存取存储器(RAM)、磁碟或者光盘等各种可以存储数据和程序代码的介质。
图3为本申请一示例性实施例示出的一种Android客户端应用程序局部更新装置的结构示意图。如图3所示,所述装置可以包括:
客户端应用程序方法传递模块U301,用于将Java目标方法传递至本地层;
方法保存模块U302,与U301连接,用于在本地层保存所述Java目标方法;
JNI本地回调方法模块U303,与U302连接,用于将JNI本地回调方法与所述Java目标方法进行关联;
客户端应用程序调用模块U304,与U303连接,用于客户端应用程序在虚拟机上运行时,根据所述JNI本地回调方法调用所述Java目标方法。
其中,所述客户端应用程序方法传递模块U301使用钩子方法将Java目标方法和待替换的Java方法传递至本地层,或者通过Direct Buffer来进行传递。所述客户端应用程序方法传递模块通过Direct Buffer来进行传递时,在本地内存创建了一个Java层和JNI层共享的内存区域,即Direct Buffer,客户端应用程序运行时,将更新包中获取的Java目标方法保存至Direct Buffer,再从JNI层访问Direct Buffer读取Java目标方法,并将Java目标方法定义为Native,从而将Java目标方法传递至本地层。
其中,所述客户端应用程序调用模块U304,可以包括:
回调方法调用子模块,用于调用所述JNI本地回调方法,获取待替换的Java方法或者Java目标方法的回调函数;
回调子模块,用于使用所述回调函数调用所述待替换的Java方法或所述Java目标方法。
图4为本申请另一示例性实施例示出的一种Android客户端应用程序局部更新装置的结构示意图。如图4所示,所述装置可以包括:
客户端应用程序更新查询模块U401,用于查询客户端应用程序是否需要进行更新;
客户端应用程序方法获取模块U402,与U401连接,用于当客户端应用程序更新查询模块查询到客户端应用程序需要进行更新时,从更新包中获取Java目标方法。
客户端应用程序方法传递模块U403,与U402连接,用于将待替换的Java方法和Java目标方法传递至本地层;
方法保存模块U404,与U403连接,用于在本地层保存所述待替换的Java方法和所述Java目标方法;
JNI本地回调方法模块U405,与U404连接,用于将JNI本地回调方法与所述待替换的Java方法和Java目标方法进行关联;
客户端应用程序调用模块U406,与U405连接,用于客户端应用程序在虚拟机上运行时,根据所述JNI本地回调方法调用所述Java目标方法,或者当需要返回待替换的Java方法时,根据所述JNI本地回调方法调用所述待替换的Java方法。
其中,所述客户端应用程序方法传递模块U403使用钩子方法将Java目标方法和待替换的Java方法传递至本地层,或者利用Direct Buffer来进行传递。
其中,所述客户端应用程序调用模块U406,可以包括:
回调方法调用子模块,用于调用所述JNI本地回调方法,获取待替换的Java方法或者Java目标方法的回调函数;
回调子模块,用于使用所述回调函数调用所述待替换的Java方法或者所述Java目标方法。
为了描述的方便,描述以上装置时以功能分为各种模块分别描述。当然,在实施本申请时可以把各模块的功能在同一个或多个软件和/或硬件中实现。
本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于装置或系统实施例而言,由于其基本相似于方法实施例,所以描述得比较简单,相关之处参见方法实施例的部分说明即可。以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的模块可以是或者也可以不是物理上分开的,作为模块显示的部件可以是或者也可以不是物理模块,即可以位于一个地方,或者也可以分布到多个网络模块上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。本领域普通技术人员在不付出创造性劳动的情况下,即可以理解并实施。
需要说明的是,在本文中,诸如“第一”和“第二”等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者逆序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、模块或者装置不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、模块或者装置所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、模块或者装置中还存在另外的相同要素。
以上所述仅是本申请的具体实施方式,使本领域技术人员能够理解或实现本申请。对这些实施例的多种修改对本领域的技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本申请的精神或范围的情况下,在其它实施例中实现。因此,本申请将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。
Claims (10)
1.一种客户端应用程序局部更新方法,其特征在于,包括:
客户端应用程序将Java目标方法传递至本地层;
在本地层保存所述Java目标方法,将JNI本地回调方法与所述Java目标方法进行关联;
客户端应用程序在虚拟机上运行时,根据所述JNI本地回调方法调用所述Java目标方法。
2.如权利要求1所述的客户端应用程序局部更新方法,其特征在于,还包括:
客户端应用程序将待替换的Java方法传递至本地层;
在本地层保存所述待替换的Java方法,将JNI本地回调方法与所述待替换的Java方法进行关联;
客户端应用程序在虚拟机上运行时,当需要返回待替换的Java方法时,根据所述JNI本地回调方法调用所述待替换的Java方法。
3.如权利要求2所述的客户端应用程序局部更新方法,其特征在于,客户端应用程序使用钩子方法将Java目标方法和待替换的Java方法传递至本地层。
4.如权利要求1所述的客户端应用程序局部更新方法,其特征在于,在客户端应用程序将Java目标方法传递至本地层之前,还包括:
当客户端应用程序需要进行更新时,从更新包中获取Java目标方法。
5.如权利要求1-3任一项所述的客户端应用程序局部更新方法,其特征在于,根据所述JNI本地回调方法调用所述Java目标方法,包括:
调用所述JNI本地回调方法,获取待替换的Java方法或者Java目标方法的回调函数;
所述回调函数调用所述待替换的Java方法或者所述Java目标方法。
6.一种客户端应用程序局部更新装置,其特征在于,包括:
客户端应用程序方法传递模块,用于将Java目标方法传递至本地层;
方法保存模块,在本地层保存所述Java目标方法;
JNI本地回调方法模块,用于将JNI本地回调方法与所述Java目标方法进行关联;
客户端应用程序调用模块,用于客户端应用程序在虚拟机上运行时,根据所述JNI本地回调方法调用所述Java目标方法。
7.如权利要求6所述的客户端应用程序局部更新装置,其特征在于,
所述客户端应用程序方法传递模块,还用于将待替换的Java方法传递至本地层;
方法保存模块,还用于在本地层保存所述待替换的Java方法;
所述JNI本地回调方法模块,还用于将JNI本地回调方法与所述待替换的Java方法进行关联;
所述客户端应用程序调用模块,还用于客户端应用程序在虚拟机上运行,当需要返回待替换的Java方法时,根据所述JNI本地回调方法调用所述待替换的Java方法。
8.如权利要求7所述的客户端应用程序局部更新装置,其特征在于,所述客户端应用程序方法传递模块使用钩子方法将Java目标方法和待替换的Java方法传递至本地层。
9.如权利要求6所述的客户端应用程序局部更新装置,其特征在于,还包括:
客户端应用程序更新查询模块,用于查询客户端应用程序是否需要进行更新;
客户端应用程序方法获取模块,用于当客户端应用程序更新查询模块查询到存在方法的更新时,从更新包中获取Java目标方法。
10.如权利要求6-8任一项所述的客户端应用程序局部更新装置,其特征在于,所述客户端应用程序调用模块,包括:
回调方法调用子模块,用于调用所述JNI本地回调方法,获取待替换的Java方法或者Java目标方法的回调函数;
回调子模块,用于使用所述回调函数调用所述待替换的Java方法或所述Java目标方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410561887.1A CN105589701B (zh) | 2014-10-21 | 2014-10-21 | 一种客户端应用程序局部更新方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410561887.1A CN105589701B (zh) | 2014-10-21 | 2014-10-21 | 一种客户端应用程序局部更新方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN105589701A CN105589701A (zh) | 2016-05-18 |
CN105589701B true CN105589701B (zh) | 2019-03-08 |
Family
ID=55929310
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201410561887.1A Active CN105589701B (zh) | 2014-10-21 | 2014-10-21 | 一种客户端应用程序局部更新方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN105589701B (zh) |
Families Citing this family (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105867988A (zh) * | 2016-06-24 | 2016-08-17 | 深圳云之家网络有限公司 | 一种基于Hook技术的Android App热更新的方法及系统 |
CN108304158B (zh) * | 2016-08-24 | 2021-12-10 | 北京顶象技术有限公司 | 一种动态库的代理方法及设备 |
CN108121561B (zh) * | 2016-11-28 | 2021-08-17 | 百度在线网络技术(北京)有限公司 | 应用程序修复方法、装置和系统 |
CN108287721A (zh) * | 2017-08-17 | 2018-07-17 | 北京微应软件科技有限公司 | 一种移动终端控制方法及装置 |
CN108874418B (zh) * | 2018-05-23 | 2022-04-05 | 北京五八信息技术有限公司 | Ui组件的更新方法、装置、终端及计算机可读存储介质 |
CN109144748B (zh) * | 2018-07-26 | 2021-12-07 | 创新先进技术有限公司 | 一种服务器、分布式服务器集群及其状态驱动方法 |
CN111352629A (zh) * | 2018-12-24 | 2020-06-30 | 北京奇虎科技有限公司 | 一种程序调用的优化方法及装置 |
CN110457151B (zh) * | 2019-07-10 | 2022-01-28 | 五八有限公司 | 热修复方法、装置及可读存储介质 |
CN111083563B (zh) * | 2019-12-30 | 2021-09-07 | 深圳市康冠智能科技有限公司 | 电视ui控件的调试方法、装置、电视机及存储介质 |
CN111966427B (zh) * | 2020-08-17 | 2022-06-21 | 四川长虹电器股份有限公司 | 一种Android native调用Java API的实现方法 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6199194B1 (en) * | 1998-09-25 | 2001-03-06 | Adaptec, Inc. | Method and system for programming firmware over a computer network |
CN102402427A (zh) * | 2010-09-09 | 2012-04-04 | 阿里巴巴集团控股有限公司 | 一种Java应用程序的更新方法及装置 |
CN103870316A (zh) * | 2014-04-11 | 2014-06-18 | 烽火通信科技股份有限公司 | 一种智能操作系统上的java虚拟机实现方法 |
CN103914637A (zh) * | 2013-01-07 | 2014-07-09 | 北京洋浦伟业科技发展有限公司 | 一种安卓平台的可执行程序加密方法 |
-
2014
- 2014-10-21 CN CN201410561887.1A patent/CN105589701B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6199194B1 (en) * | 1998-09-25 | 2001-03-06 | Adaptec, Inc. | Method and system for programming firmware over a computer network |
CN102402427A (zh) * | 2010-09-09 | 2012-04-04 | 阿里巴巴集团控股有限公司 | 一种Java应用程序的更新方法及装置 |
CN103914637A (zh) * | 2013-01-07 | 2014-07-09 | 北京洋浦伟业科技发展有限公司 | 一种安卓平台的可执行程序加密方法 |
CN103870316A (zh) * | 2014-04-11 | 2014-06-18 | 烽火通信科技股份有限公司 | 一种智能操作系统上的java虚拟机实现方法 |
Also Published As
Publication number | Publication date |
---|---|
CN105589701A (zh) | 2016-05-18 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN105589701B (zh) | 一种客户端应用程序局部更新方法及装置 | |
CN102567015B (zh) | 用于执行动态软件版本选择的方法和系统 | |
CN103353844B (zh) | 一种软件开发工具包升级方法和系统 | |
CN100535901C (zh) | 一种更新动态网页的方法及系统 | |
CN105893084B (zh) | 版本升级方法及终端设备 | |
US11513789B2 (en) | Application deployment method, apparatus, and system | |
CN103810001B (zh) | 用于向数据处理系统上部署虚拟设备的方法和系统 | |
CN102833350A (zh) | WebApp更新的处理方法和处理装置 | |
CN103841134A (zh) | 基于api发送、接收信息的方法、装置及系统 | |
US8897804B2 (en) | System and method for providing customer support using a location-aware portable device | |
US20130227085A1 (en) | Terminal and method for using cloud services | |
CN108491216A (zh) | 一种Android系统无感知应用安装升级的方法 | |
US9753750B2 (en) | Global feature library useable with continuous delivery | |
CN106357791A (zh) | 业务处理方法、装置及系统 | |
US20150186128A1 (en) | Preventing application downgrade in an application store | |
US9519600B2 (en) | Driver shimming | |
CN109213536A (zh) | 资源展示方法、资源展示类控件的配置方法、装置及设备 | |
CN103677937A (zh) | 升级软件和运行软件的方法及装置 | |
CN103561082B (zh) | 压缩请求的处理方法及服务器 | |
CN103150203B (zh) | 一种虚拟机控制系统、虚拟机控制器及控制方法 | |
CN101236510B (zh) | 一种ejb集群的失败恢复处理方法及系统 | |
CN106293790A (zh) | 基于Firefox操作系统的应用程序升级方法和装置 | |
CN104573496A (zh) | 一种禁止启动项启动的方法和装置 | |
CN106528219A (zh) | 应用程序中寄生工具包的升级方法及装置 | |
CN102902564B (zh) | 安装补丁的方法及装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |