热修复方法、装置、设备及计算机可读存储介质转让专利

申请号 : CN201910580421.9

文献号 : CN110321135B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 张迪尚会波许多凯支剑锟

申请人 : 百度在线网络技术(北京)有限公司

摘要 :

本公开提供一种热修复方法、装置、设备及计算机可读存储介质,程序运行时,调用一入口类覆写的框架层中最下层的类中的方法;根据覆写后的方法获取拦截器信息,并根据拦截器信息确定是否设置有拦截器;若是,则通过一调用实例执行入口类中包括的补丁逻辑;其中,入口类继承框架层中最下层的类,程序中的最顶层类继承入口类。本公开提供的方案,入口类可以覆写框架层中最下层的类中所有可覆写的方法,从而在程序运行时,无论调用到哪个覆写后的方法,都能够根据拦截器信息,确定是否需要执行补丁逻辑,从而实现热修复效果。且修复过程不需要使用系统隐藏API,兼容性较好。

权利要求 :

1.一种热修复方法,其特征在于,包括:程序运行时,调用一入口类覆写的框架层中最下层的类中的方法;

根据覆写后的方法获取拦截器信息,并根据所述拦截器信息确定是否设置有拦截器;

若是,则通过一调用实例执行所述入口类中包括的补丁逻辑,所述调用实例对应的类继承框架层中最下层的类;

其中,所述入口类继承所述框架层中最下层的类,所述程序中的最顶层类继承所述入口类。

2.根据权利要求1所述的热修复方法,其特征在于,所述框架层中最下层的类包括以下任意一种:活动、服务、广播接受者、内容提供者。

3.根据权利要求1所述的热修复方法,其特征在于,还包括:接收一补丁包,并根据所述补丁包生成包括补丁逻辑的补丁实例,将所述补丁实例的标识写入所述入口类的预设变量中。

4.根据权利要求3所述的热修复方法,其特征在于,在接收所述补丁包后,还包括:根据所述补丁包生成一拦截器实例,并设置拦截器参数为预设值;

所述根据覆写后的方法获取拦截器信息,包括:根据覆写后的方法获取所述拦截器参数;

所述根据所述拦截器信息确定是否设置有拦截器,包括:若所述拦截器参数是所述预设值,则确定设置有所述拦截器。

5.根据权利要求4所述的热修复方法,其特征在于,若所述拦截器参数不是所述预设值,则执行所述程序的原有逻辑。

6.根据权利要求3所述的热修复方法,其特征在于,还包括:接收所述补丁包后,根据所述补丁包生成所述调用实例。

7.根据权利要求1所述的热修复方法,其特征在于,接收所述程序对应的安装包,根据所述安装包安装包括所述入口类的所述程序,以使所述入口类覆写所述框架层中最下层的类中的方法。

8.一种热修复装置,其特征在于,包括:调用模块,用于在程序运行时,调用一入口类覆写的框架层中最下层的类中的方法;

确定模块,用于根据覆写后的方法获取拦截器信息,并根据所述拦截器信息确定是否设置有拦截器;

若是,则执行模块通过一调用实例执行所述入口类中包括的补丁逻辑,所述调用实例对应的调用类继承框架层中最下层的类;其中,所述入口类继承所述框架层中最下层的类,所述程序中的最顶层类继承所述入口类。

9.根据权利要求8所述的热修复装置,其特征在于,所述框架层中最下层的类包括以下任意一种:活动、服务、广播接受者、内容提供者。

10.根据权利要求8所述的热修复装置,其特征在于,还包括:接收模块,用于接收一补丁包;

实例化模块,用于根据所述补丁包生成包括补丁逻辑的补丁实例,将所述补丁实例的标识写入所述入口类的预设变量中。

11.根据权利要求10所述的热修复装置,其特征在于,所述实例化模块在所述接收模块接收所述补丁包后,还用于根据所述补丁包生成一拦截器实例,并设置拦截器参数为预设值;

所述调用模块具体用于:

根据覆写后的方法获取所述拦截器参数;

所述确定模块具体用于:

若所述拦截器参数是所述预设值,则确定设置有所述补丁包。

12.根据权利要求11所述的热修复装置,其特征在于,若所述拦截器参数不是所述预设值,则所述执行模块执行所述程序的原有逻辑。

13.根据权利要求10所述的热修复装置,其特征在于,所述实例化模块在所述接收模块接收所述补丁包后,还用于根据所述补丁包生成所述调用实例。

14.根据权利要求8所述的热修复装置,其特征在于,还包括:安装模块,用于接收所述程序对应的安装包,根据所述安装包安装包括所述入口类的所述程序,以使所述入口类覆写所述框架层中最下层的类中的方法。

15.一种热修复设备,其特征在于,包括:存储器;

处理器;以及

计算机程序;

其中,所述计算机程序存储在所述存储器中,并配置为由所述处理器执行以实现如权利要求1‑7任一种所述的方法。

16.一种计算机可读存储介质,其特征在于,其上存储有计算机程序,所述计算机程序被处理器执行以实现如权利要求1‑7任一种所述的方法。

说明书 :

热修复方法、装置、设备及计算机可读存储介质

技术领域

[0001] 本公开涉及修复技术,尤其涉及一种热修复方法、装置、设备及计算机可读存储介质。

背景技术

[0002] 目前,当一款应用上线后,若发现其存在bug(漏洞),则可以采用热修复的方式修复bug,无需重新更新整个应用,造成修复速度慢的问题。
[0003] 现有技术中,可以采用虚拟机级别进行native hook,实现方法替换;还可以下发全量dex,并通过添加到Classloader对应的dex elements数组的最前面实现优先加载替换的类达到修复的目的。
[0004] 但是,这些方法因为使用了系统隐藏API,会有兼容性问题。因此,现有技术中的热修复方案仍然存在一定的局限性。

发明内容

[0005] 本公开提供一种热修复方法、装置、设备及计算机可读存储介质,以解决现有技术中的热修复方案存在一定局限性的问题。
[0006] 本公开的第一个方面是提供一种热修复方法,包括:
[0007] 程序运行时,调用一入口类覆写的框架层中最下层的类中的方法;
[0008] 根据覆写后的方法获取拦截器信息,并根据所述拦截器信息确定是否设置有拦截器;
[0009] 若是,则通过一调用实例执行所述入口类中包括的补丁逻辑;
[0010] 其中,所述入口类继承框架层中最下层的类,所述程序中的最顶层类继承所述入口类。
[0011] 本公开的另一个方面是提供一种热修复装置,包括:
[0012] 调用模块,用于在程序运行时,调用一入口类覆写的框架层中最下层的类中的方法;
[0013] 确定模块,用于根据覆写后的方法获取拦截器信息,并根据所述拦截器信息确定是否设置有拦截器;
[0014] 若是,则执行模块通过一调用实例执行所述入口类中包括的补丁逻辑;其中,所述入口类继承框架层中最下层的类,所述程序中的最顶层类继承所述入口类。
[0015] 本公开的又一个方面是提供一种热修复设备,包括:
[0016] 存储器;
[0017] 处理器;以及
[0018] 计算机程序;
[0019] 其中,所述计算机程序存储在所述存储器中,并配置为由所述处理器执行以实现如上述第一方面所述的热修复方法。
[0020] 本公开的又一个方面是提供一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行以实现如上述第一方面所述的热修复方法。
[0021] 本公开提供的热修复方法、装置、设备及计算机可读存储介质的技术效果是:
[0022] 本公开提供的热修复方法、装置、设备及计算机可读存储介质,包括程序运行时,调用一入口类覆写的框架层中最下层的类中的方法;根据覆写后的方法获取拦截器信息,并根据拦截器信息确定是否设置有拦截器;若是,则通过一调用实例执行入口类中包括的补丁逻辑;其中,入口类继承框架层中最下层的类,程序中的最顶层类继承入口类。本公开提供的方法、装置、设备及计算机可读存储介质,入口类可以覆写框架层中最下层中所有可覆写的方法,从而在程序运行时,无论调用到哪个覆写后的方法,都能够根据拦截器信息,确定是否需要执行补丁逻辑,从而实现热修复效果。且修复过程不需要使用系统隐藏API,兼容性较好。而且修复过程不需要关心程序本身包括的类结构、继承关系等,从而实现更好的热修复效果。

附图说明

[0023] 图1为本发明一示例性实施例示出的热修复方法的流程图;
[0024] 图1A为本发明一示例性实施例示出的入口类的继承关系示意图;
[0025] 图2为本发明另一示例性实施例示出的热修复方法的流程图;
[0026] 图3为本发明一示例性实施例示出的热修复装置的结构图;
[0027] 图4为本发明另一示例性实施例示出的热修复装置的结构图;
[0028] 图5为本发明一示例性实施例示出的热修复设备的结构图。

具体实施方式

[0029] 当一个应用程序上线后,若检测出有bug存在,则可以将bug修复后的安装包重新上传到应用商店中,用户可以自行下载新的安装包,进而修复旧版本的bug。但是,这种方式需要用户主动下载安装包,导致更新速度慢。因此,现有技术中出现了热修复技术,主要有如下三种方案:
[0030] (1)虚拟机级别进行native hook,实现方法替换;
[0031] (2)下发全量dex,并通过添加到Classloader对应的dex elements数组的最前面实现优先加载替换的类达到修复的目的;
[0032] 其中方案1)、2)因为使用了系统隐藏API,会有兼容性问题。
[0033] 此外,还存在一种对编译后应用程序中的类方法进行插桩,在有patch时执行patch逻辑,无patch时执行原逻辑其中,插桩方案是一种轻量的热修复方案,通过在类的每个方法中插入判断逻辑,当有patch加载时,执行patch中的逻辑,当无patch时,执行原逻辑来达到修复问题的目标。
[0034] 但是,对应用程序中的方法进行插桩修复,在遇到类结构大量变化,虚函数继承关系、匿名内部类变化等场景下就没法修复了。
[0035] 因此,本发明实施例提供了一种全新的基于组件入口类的插桩方案,通过对应用入口组件类的插桩,且不需要使用任何非公开的api,达到全量热修复的效果。
[0036] 首先对本方案中的一些名词进行解释:
[0037] 程序:它以某些程序设计语言编写,运行于某种目标结构体系上。例如手机上安装的应用程序、计算机中安装的程序等。
[0038] 类:类(Class)是面向对象程序设计(OOP,Object‑Oriented Programming)实现信息封装的基础。类是一种用户定义类型,也称类类型。每个类包含数据说明和一组操作数据或传递消息的函数。
[0039] 实例:在面向对象程序设计中,“类”在实例化之后叫做一个“实例”。“类”是静态的,不占进程内存,而“实例”拥有动态内存。实例和对象基本上是同义词,它们常常可以互换使用。对象代表了类的一个特定的实例。对象具有身份(identity)和属性值(attribute values)2个特征。实例是对象的具体表示,操作可以作用于实例,实例可以有状态地存储操作结果。实例被用来模拟现实世界中存在的、具体的或原型的东西。
[0040] 继承:继承是面向对象软件技术当中的一个概念,与多态、封装共为面向对象的三个基本特征。继承可以使得子类具有父类的属性和方法或者重新定义、追加属性和方法等。
[0041] 覆写:当子类定义了和父类在方法名称、返回值类型、参数类型及个数完全相同的方法的时候,称为方法的覆写。
[0042] 四大组件:Android开发的四大组件分别是:活动(activity),用于表现功能;服务(service),后台运行服务,不提供界面呈现;广播接受者(Broadcast Receive),勇于接收广播;内容提供者(Content Provider),支持多个应用中存储和读取数据,相当于数据库。
[0043] 图1为本发明一示例性实施例示出的热修复方法的流程图。
[0044] 如图1所示,本实施例提供的热修复方法包括:
[0045] 步骤101,程序运行时,调用一入口类覆写的框架层中最下层的类中的方法。
[0046] 其中,该程序可以安装在具备计算功能的电子设备中,例如手机、计算机等。该电子设备具备联网功能,能够接收服务器下发的补丁,并通过补丁修复程序的漏洞问题。
[0047] 具体的,程序中设置一入口类,用于覆写框架层中最下层的类中的方法。
[0048] 其中,入口类继承框架层中最下层的类,应用程序中的最顶层类继承入口类。
[0049] 本实施例提供的方法中,用户可以操作电子设备使其下载程序对应的安装包。例如,可以操作电子设备从应用商店中下载安装包,并操作电子设备安装相应的程序。
[0050] 具体的,电子设备可以解压安装包,并写入相应的可执行文件,这些可执行文件中包括一入口类。该入口类能够覆写框架层中最下层的类中的方法。
[0051] 图1A为本发明一示例性实施例示出的入口类的继承关系示意图。
[0052] 进一步的,入口类继承框架层中最下层的类,程序中的最顶层类继承入口类。该框架层中最下层的类例可以是四大组件类,具体可以是活动(activity)、服务(service)、广播接受者(Broadcast Receive)、内容提供者(Content Provider)中的任一种。
[0053] 如图1A所示,入口类genesis继承Activity类,程序中的最顶层类BaseActivity继承该入口类genesis。可选的,在程序中还可以设置MainActivity、BrowserActivity或其他继承BaseActivity的类。
[0054] 其中,子类可以继承父类中包括的方法,还可以覆写父类中的方法。入口类可以覆写其父类的方法,即框架层中最下层的类的方法,还可以在覆写后的方法中加入获取拦截器信息的机制。
[0055] 进一步的,用户可以操作电子设备,使其通过网络下载程序对应的安装包,并操作电子设备安装该程序。在安装程序时,根据安装包中的内容能够在电子设备中写入一入口类,该入口类能够覆写框架层中最下层的类中的方法。
[0056] 实际应用时,一程序中的类需要继承框架层中最下层的类,并通过调用框架层中最下层的类中的方法来实现目标逻辑。例如,需要实现恢复界面功能时,可以通过应用程序中的类设置这一功能对应的逻辑,该逻辑可以通过调用Activity中的方法来实现,例如调用方法onCreate或方法onRestoreInstanceState。
[0057] 其中,一般情况下,程序在运行时会执行其内部逻辑,例如可以读取类M中的包括的内容,其中设置有框架层中最下层的类中的方法。电子设备在运行时,将类M进行实例化,得到实例m,并执行其中包括的方法。
[0058] 具体的,本实施例提供的方法中,通过入口类覆写了框架层中最下层的类中的方法,当程序运行时,在需要调用框架层中最下层的类中的方法时,可以调用入口类覆写后的方法。
[0059] 步骤102,根据覆写后的方法获取拦截器信息,并根据拦截器信息确定是否设置有拦截器。
[0060] 进一步的,入口类覆写后的方法中,加入了获取拦截器信息的机制。例如,拦截器信息可以是一个变量的值,则覆写后的方法中包括读取该变量值的步骤。
[0061] 进一步的,覆写后的方法还可以设置有根据拦截器信息确定是否设置有补丁包的机制。例如,可以判断读取的变量值是否为预设值,若是,则认为设置有拦截器,否则,认为没有设置拦截器。
[0062] 实际应用时,当终端接收到一补丁包后,可以根据该补丁包设置拦截器信息,例如,将一变量设置为预设值。
[0063] 若是,则执行步骤103。
[0064] 步骤103,通过一调用实例执行所述入口类中包括的补丁逻辑。
[0065] 实际应用时,若电子设备接收到程序对应的补丁包,则可以根据补丁包获取更新后的补丁逻辑,该补丁逻辑能够修复程序原有的bug。
[0066] 其中,电子设备可以将补丁逻辑存储在入口类中。
[0067] 具体的,若电子设备接收到程序对应的补丁包,还可以在电子设备中安装一拦截器,具体可以通过将拦截器信息对应的变量值设置为预设值的方式,安装该拦截器。即电子设备安装补丁时,同时将一预设变量设置为预设值。
[0068] 进一步的,电子设备在运行程序时,由于入口类覆写了框架层中最下层的类中的方法,使得在程序运行时,直接读取覆写后的同名方法,例如需要执行框架层中最下层的类中的方法A,则直接调用覆写后的同名方法A,从而能够基于覆写后的方法获取拦截器信息。
[0069] 实际应用时,在覆写后的方法中,还可以对拦截器信息进行处理,根据拦截器信息确定是否设置有拦截器,若是,则可以执行入口类中包括的补丁逻辑。该补丁逻辑是电子设备打补丁时存储在入口类中的。
[0070] 进一步的,在执行入口类中包括的补丁逻辑时,具体可以通过调用实例运行补丁逻辑中包括的相应方法。调用实例对应的调用类chg继承入口类的父类,即框架层中最下层的类。例如,入口类继承了Activity,且覆写了其中可覆写的方法,则调用类chg也继承Activity类。
[0071] 当执行补丁逻辑时,可以通过调用实例运行补丁逻辑中包括的相应方法。例如,补丁逻辑中需要调用方法A,则可以通过调用实例获取框架层中最下层的类中对应的方法A,而不会执行入口类覆写后的同名方法A,从而使补丁逻辑能够正常被执行。
[0072] 具体的,本实施例提供的方法,可以覆写框架层中最下层的类中的方法,从而在执行框架层中最下层的类中的方法时,判断程序是否安装有补丁,从而实现热修复的效果。
[0073] 进一步的,本实施例提供的方法,入口类可以覆写框架层中最下层的类中所有可覆写的方法,从而在程序运行时,无论调用到哪个覆写后的方法,都能够根据拦截器信息,确定是否需要执行补丁逻辑。
[0074] 实际应用时,补丁逻辑可以用于替换程序中全部的原有逻辑,若安装有补丁,则基于本实施例提供的方法,不再执行程序的原有逻辑,而转为执行补丁逻辑,从而能够实现全量修复的效果。
[0075] 其中,若确定没安装拦截器,则可以执行程序原有逻辑。
[0076] 本实施例提供的方法用于热修复,该方法由设置有本实施例提供的方法的设备执行,该设备通常以硬件和/或软件的方式来实现。
[0077] 本实施例提供的热修复方法,程序运行时,调用一入口类覆写的框架层中最下层的类中的方法;根据覆写后的方法获取拦截器信息,并根据所述拦截器信息确定是否设置有拦截器;若是,则通过一调用实例执行所述入口类中包括的补丁逻辑;其中,所述入口类继承框架层中最下层的类,所述程序中的最顶层类继承所述入口类。本实施例提供的方法,入口类可以覆写框架层中最下层的类中所有可覆写的方法,从而在程序运行时,无论调用到哪个覆写后的方法,都能够根据拦截器信息,确定是否需要执行补丁逻辑,从而实现热修复效果。且修复过程不需要使用系统隐藏API,兼容性较好。而且修复过程不需要关心程序本身包括的类结构、继承关系等,从而实现更好的热修复效果。
[0078] 图2为本发明另一示例性实施例示出的热修复方法的流程图。
[0079] 如图2所示,本实施例提供的方法,包括:
[0080] 步骤201,接收程序对应的安装包,根据安装包安装包括入口类的程序,以使入口类覆写框架层中最下层的类中的方法。
[0081] 其中,入口类继承框架层中最下层的类,应用程序中的最顶层类继承入口类。
[0082] 其中,本实施例提供的方法中,用户可以操作电子设备使其下载程序对应的安装包。例如,可以操作电子设备从应用商店中下载安装包,并操作电子设备安装相应的程序。
[0083] 具体的,电子设备可以解压安装包,并写入相应的可以执行文件,这些可执行文件中包括一入口类。该入口类能够覆写框架层中最下层的类中的方法。框架层中最下层的类例如可以是四大组件类中的一种。
[0084] 步骤202,接收一补丁包。
[0085] 具体的,当程序上线后,若发现程序存在bug,则开发人员可以设置一补丁包,并通过服务器下发至电子设备中。
[0086] 进一步的,电子设备能够接收服务器下发的补丁包。该补丁包是上述程序对应的补丁包。
[0087] 步骤202之后,可以执行步骤2031、2032、2033的步骤。
[0088] 步骤2031,根据补丁包生成包括补丁逻辑的补丁实例,将补丁实例的标识写入入口类的预设变量中。
[0089] 实际应用时,电子设备接收到补丁包后,可以对其进行解压,获取其中包括补丁逻辑的补丁类。该补丁逻辑可以包括程序原有的正常逻辑,以及用于修复程序bug的逻辑。
[0090] 该补丁包中包括上述补丁类。
[0091] 其中,当程序运行时,可以实例化补丁类得到补丁实例,并将补丁实例的标识写入入口类的预设变量中,例如,在入口类中设置一变量$buddy,并将补丁实例赋值$buddy。
[0092] 步骤2032,根据补丁包生成一拦截器实例,并设置拦截器参数为预设值。
[0093] 其中,补丁包中还包括拦截器类iter,电子设备在运行程序时,可以根据补丁包中的拦截器类生成拦截器实例,并同时将拦截器参数ic设置为预设值,例如设置为1。
[0094] 具体的,拦截器参数ic默认值可以是null。
[0095] 步骤2033,根据补丁包生成一调用实例。
[0096] 进一步的,补丁包中还可以包括调用类chg,电子设备运行程序时,可以根据补丁包中的调用类chg生成一调用实例。该调用类继承框架层中最下层的类,例如Activity类。
[0097] 实际应用时,由于补丁逻辑被写入入口类,导致其父类为入口类。确入口类覆写了框架层中最下层的类中的方法,当执行补丁逻辑时,若调用框架层中最下层的类中的方法,则会调用覆写后的同名方法。因此,本实施例提供的方法的补丁包中还设置有调用类,当执行补丁逻辑时,可以通过调用类调用框架层中最下层的类中的方法。
[0098] 步骤2031‑2033的执行时序不做限制。
[0099] 步骤204,程序运行时,调用一入口类覆写的框架层中最下层的类中的方法。
[0100] 步骤204与步骤101的实现方式类似,不再赘述。
[0101] 步骤205,根据覆写后的方法获取拦截器参数。
[0102] 步骤206,若拦截器参数是预设值,则确定设置有拦截器,通过一调用实例执行入口类中包括的补丁逻辑。
[0103] 程序运行时调用入口类覆写后的方法,并根据覆写后的方法获取拦截器参数。
[0104] 其中,程序运行时若需要调用四大组件中的方法,则具体可以调用入口类覆写后的方法,在覆写后的方法中,加入了获取拦截器参数的机制。
[0105] 具体的,若电子设备没有收到补丁包,则拦截器参数为默认值,例如是null。若电子设备接收到补丁包,则其在运行程序时,会实例化补丁包中的拦截器类,并将拦截器参数设置为预设值。
[0106] 因此,可以通过获取拦截器参数,并根据拦截器参数确定程序是否设置有拦截器,进而确定是否接收过补丁包。并根据拦截器参数确定执行补丁逻辑还是程序的原有逻辑,这一机制也可以设置在入口类中。
[0107] 其中,若获取的拦截器参数是预设值,则可以认为程序当前具有补丁,则可以执行补丁逻辑。具体的,在实例化补丁中的补丁类时,将补丁实例写入到入口类中了,因此,可以获取入口类中的补丁逻辑,具体可以读取变量buddy的内容,从而获取补丁逻辑,并执行补丁逻辑。
[0108] 进一步的,在执行入口类中包括的补丁逻辑时,具体可以通过调用实例运行补丁逻辑中包括的相应方法。调用实例对应的调用类chg继承入口类的父类,例如,入口类继承了框架层中最下层的类中的Activity,且覆写了其中可覆写的方法,则调用类chg也继承Activity类。
[0109] 当执行补丁逻辑时,可以通过调用实例运行补丁逻辑中包括的相应方法。例如,补丁逻辑中需要调用方法A,则可以通过调用实例获取框架层中最下层的类中对应的方法A,而不会执行入口类覆写后的同名方法A,从而使补丁逻辑能够正常被执行。
[0110] 步骤207,若拦截器参数不是预设值,则执行程序的原有逻辑。
[0111] 实际应用时,若获取的拦截器参数不是预设值,则可以认为程序当前不具有补丁,则可以执行程序的原有逻辑。例如,没发现该程序具有bug,则不会向电子设备下发上述补丁。
[0112] 其中,拦截器参数能够体现电子设备中是否具有程序对应的补丁,因此,可以根据拦截器参数的值,确定执行逻辑。具体为,若电子设备中有程序的补丁,则执行补丁逻辑,若电子设备中没有程序的补丁,则执行程序原有逻辑。
[0113] 本实施例提供的热修复方法,电子设备接收程序的补丁包后,若运行该程序,则可以生成一拦截器实例,并将拦截器参数设置为预设值。当调用入口类覆写的方法时,可以根据拦截器参数确定是否执行补丁逻辑。因此,本方案的修复过程不使用任何Android非公开api,无兼容问题。
[0114] 图3为本发明一示例性实施例示出的热修复装置的结构图。
[0115] 如图3所示,本实施例提供的热修复装置,包括:
[0116] 调用模块31,用于在程序运行时,调用一入口类覆写的框架层中最下层的类中的方法;
[0117] 确定模块32,用于根据覆写后的方法获取拦截器信息,并根据所述拦截器信息确定是否设置有拦截器;
[0118] 若是,则执行模块33通过一调用实例执行所述入口类中包括的补丁逻辑;其中,所述入口类继承框架层中最下层的类,所述程序中的最顶层类继承所述入口类。
[0119] 本实施例提供的热修复装置,包括调用模块,用于在程序运行时,调用一入口类覆写的框架层中最下层的类中的方法;确定模块,用于根据覆写后的方法获取拦截器信息,并根据拦截器信息确定是否设置有拦截器;若是,则执行模块通过一调用实例执行入口类中包括的补丁逻辑;其中,入口类继承框架层中最下层的类,程序中的最顶层类继承入口类。。本实施例提供的装置,入口类可以覆写框架层中最下层的类中所有可覆写的方法,从而在程序运行时,无论调用到哪个覆写后的方法,都能够根据拦截器信息,确定是否需要执行补丁逻辑,从而实现热修复效果。且修复过程不需要使用系统隐藏API,兼容性较好。而且修复过程不需要关心程序本身包括的类结构、继承关系等,从而实现更好的热修复效果。
[0120] 本实施例提供的热修复装置的具体原理和实现方式均与图1所示的实施例类似,此处不再赘述。
[0121] 图4为本发明另一示例性实施例示出的热修复装置的结构图。
[0122] 如图4所示,在上述实施例的基础上,本实施例提供的热修复装置,可选的,所述框架层中最下层的类包括以下任意一种:
[0123] 活动、服务、广播接受者、内容提供者。
[0124] 还包括:
[0125] 接收模块34,用于接收一补丁包;
[0126] 实例化模块35,用于根据所述补丁包生成包括补丁逻辑的补丁实例,将所述补丁实例的标识写入所述入口类的预设变量中。
[0127] 可选的,所述实例化模块35在所述接收模块34接收所述补丁包后,还用于根据所述补丁包生成一拦截器实例,并设置拦截器参数为预设值;
[0128] 所述调用模块31具体用于:
[0129] 根据覆写后的方法获取所述拦截器参数;
[0130] 所述确定模块具体用于:
[0131] 若所述拦截器参数是所述预设值,则确定设置有所述拦截器。
[0132] 可选的,若所述拦截器参数不是所述预设值,则所述执行模块33执行所述程序的原有逻辑。
[0133] 可选的,所述实例化模块35在所述接收模块34接收所述补丁包后,还用于根据所述补丁包生成一调用实例;
[0134] 可选的,还包括:
[0135] 安装模块36,用于接收所述程序对应的安装包,根据所述安装包安装包括所述入口类的所述程序,以使所述入口类覆写所述框架层中最下层的类中的方法
[0136] 本实施例提供的装置的具体原理和实现方式均与图2所示的实施例类似,此处不再赘述。
[0137] 图5为本发明一示例性实施例示出的热修复设备的结构图。
[0138] 如图5所示,本实施例提供的热修复设备包括:
[0139] 存储器51;
[0140] 处理器52;以及
[0141] 计算机程序;
[0142] 其中,所述计算机程序存储在所述存储器51中,并配置为由所述处理器52执行以实现如上所述的任一种热修复方法。
[0143] 本实施例还提供一种计算机可读存储介质,其上存储有计算机程序,[0144] 所述计算机程序被处理器执行以实现如上所述的任一种热修复方法。
[0145] 本领域普通技术人员可以理解:实现上述各方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成。前述的程序可以存储于一计算机可读取存储介质中。该程序在执行时,执行包括上述各方法实施例的步骤;而前述的存储介质包括:ROM、RAM、磁碟或者光盘等各种可以存储程序代码的介质。
[0146] 最后应说明的是:以上各实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述各实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分或者全部技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的范围。