补丁生成方法、装置、设备及存储介质转让专利

申请号 : CN202011543282.1

文献号 : CN112631640B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 宋玉成

申请人 : 苏州三六零智能安全科技有限公司

摘要 :

本发明涉及计算机技术领域,公开了一种补丁生成方法、装置、设备及存储介质,该方法包括:获取待更新文件与更新文件,并获取所述待更新文件与所述更新文件的区别信息;根据所述区别信息获取目标程序包;对所述目标程序包进行反编译,并根据所述区别信息与反编译结果获取目标区别代码;对所述目标区别代码进行反射处理,以生成反射代码;根据预设补丁模板代码与所述反射代码生成补丁。本发明通过获取更新文件与待更新文件的区别信息,进而根据区别信息得到程序包进行反编译,以生成补丁。提升了热修复过程中补丁生成的效率,节省了补丁生成的时间。

权利要求 :

1.一种补丁生成方法,其特征在于,所述补丁生成方法包括以下步骤:获取待更新文件与更新文件,并获取所述待更新文件与所述更新文件的区别信息,所述待更新文件为已安装的应用程序的当前安装版本文件,所述待更新文件中可能包含具有逻辑错误的代码,所述更新文件为不具有逻辑错误的,与所述待更新文件对应的所述应用程序的其他版本文件;

根据所述区别信息获取目标程序包;

对所述目标程序包进行反编译,并根据所述区别信息与反编译结果获取目标区别代码;

对所述目标区别代码进行反射处理,以生成反射代码;

根据预设补丁模板代码与所述反射代码生成补丁;

其中,所述获取待更新文件与更新文件,并获取所述待更新文件与所述更新文件的区别信息的步骤,具体包括:获取待更新文件与更新文件,并通过语法解析工具对所述待更新文件与所述更新文件进行分析,以获取区别代码及所述区别代码对应的区别位置;

将所述区别代码及所述区别位置作为所述区别信息;

所述根据所述区别信息获取目标程序包的步骤,具体包括:根据所述区别代码及所述区别位置确定对应的区别文件,并根据所述区别文件获取对应的目标程序包;

所述对所述目标程序包进行反编译,并根据所述区别信息与反编译结果获取目标区别代码的步骤,具体包括:获取所述目标程序包的原代码集合,并对所述原代码集合进行反编译,以生成反编汇代码集合,将所述反编汇代码集合作为反编译结果;

根据所述区别信息对所述反编汇代码合集进行检索,以获取目标区别代码。

2.如权利要求1所述的补丁生成方法,其特征在于,所述获取所述目标程序包的原代码集合,并对所述原代码集合进行反编译,以生成反编汇代码集合,将所述反编汇代码集合作为反编译结果的步骤,具体包括:获取所述目标程序包的java代码集合,并将所述java代码集合反编译为smali代码集合,将所述smali代码集合作为反编译结果。

3.如权利要求2所述的补丁生成方法,其特征在于,所述根据所述区别信息对所述反编汇代码合集进行检索,以获取目标区别代码的步骤,具体包括:根据区别信息获取为java代码的区别代码及所述区别代码对应的区别位置,并通过所述区别代码及所述区别位置对所述smali代码集合进行检索,获取为smali代码的目标区别代码。

4.如权利要求3所述的补丁生成方法,其特征在于,所述对所述目标区别代码进行反射处理,以生成反射代码的步骤,具体包括:解析所述目标区别代码,以获取所述目标区别代码中各行对应的函数信息;

对所述函数信息进行反射处理,以获取与目标区别代码执行相同功能的反射代码。

5.如权利要求4所述的补丁生成方法,其特征在于,所述根据预设补丁模板代码与所述反射代码生成补丁的步骤,具体包括:通过所述预设补丁模板代码对所述反射代码进行格式转换,以生成补丁代码,并将所述补丁代码打包生成补丁。

6.如权利要求1所述的补丁生成方法,其特征在于,所述根据预设补丁模板代码与所述反射代码生成补丁的步骤之后,还包括:通过所述补丁对所述待更新文件进行热修复。

7.如权利要求6所述的补丁生成方法,其特征在于,所述通过所述补丁对所述待更新文件进行热修复的步骤,具体包括:根据所述区别信息确定所述待更新文件中的区别代码对应的区别位置;

根据所述补丁获取补丁代码,并根据所述补丁代码及所述区别位置进行热修复。

8.如权利要求7所述的补丁生成方法,其特征在于,所述根据所述补丁获取补丁代码,并根据所述补丁代码及所述区别位置进行热修复的步骤,具体包括:根据所述补丁获取补丁代码;

根据所述区别位置确定待更新代码的目标位置信息;

根据所述目标位置信息与所述补丁代码对所述待更新代码进行替换,以使应用根据所述补丁代码进行运行实现热修复。

9.一种补丁生成装置,其特征在于,所述补丁生成装置包括:分析模块,用于获取待更新文件与更新文件,并获取所述待更新文件与所述更新文件的区别信息,所述待更新文件为已安装的应用程序的当前安装版本文件,所述待更新文件中可能包含具有逻辑错误的代码,所述更新文件为不具有逻辑错误的,与所述待更新文件对应的所述应用程序的其他版本文件;

获取模块,用于根据所述区别信息获取目标程序包;

反编译模块,用于对所述目标程序包进行反编译,并根据所述区别信息与反编译结果获取目标区别代码;

反射模块,用于对所述目标区别代码进行反射处理,以生成反射代码;

补丁模块,用于根据预设补丁模板代码与所述反射代码生成补丁;

其中,所述获取待更新文件与更新文件,并获取所述待更新文件与所述更新文件的区别信息,具体包括:获取待更新文件与更新文件,并通过语法解析工具对所述待更新文件与所述更新文件进行分析,以获取区别代码及所述区别代码对应的区别位置;

将所述区别代码及所述区别位置作为所述区别信息;

所述根据所述区别信息获取目标程序包,具体包括:

根据所述区别代码及所述区别位置确定对应的区别文件,并根据所述区别文件获取对应的目标程序包;

所述对所述目标程序包进行反编译,并根据所述区别信息与反编译结果获取目标区别代码,具体包括:获取所述目标程序包的原代码集合,并对所述原代码集合进行反编译,以生成反编汇代码集合,将所述反编汇代码集合作为反编译结果;

根据所述区别信息对所述反编汇代码合集进行检索,以获取目标区别代码。

10.如权利要求9所述的补丁生成装置,其特征在于,所述获取所述目标程序包的原代码集合,并对所述原代码集合进行反编译,以生成反编汇代码集合,将所述反编汇代码集合作为反编译结果,具体包括:获取所述目标程序包的java代码集合,并将所述java代码集合反编译为smali代码集合,将所述smali代码集合作为反编译结果。

11.如权利要求10所述的补丁生成装置,其特征在于,所述根据所述区别信息对所述反编汇代码合集进行检索,以获取目标区别代码,具体包括:根据区别信息获取为java代码的区别代码及所述区别代码对应的区别位置,并通过所述区别代码及所述区别位置对所述smali代码集合进行检索,获取为smali代码的目标区别代码。

12.如权利要求11所述的补丁生成装置,其特征在于,所述对所述目标区别代码进行反射处理,以生成反射代码,具体包括:解析所述目标区别代码,以获取所述目标区别代码中各行对应的函数信息;

对所述函数信息进行反射处理,以获取与目标区别代码执行相同功能的反射代码。

13.一种补丁生成设备,其特征在于,所述补丁生成设备包括:存储器、处理器及存储在所述存储器上并可在所述处理器上运行的补丁生成程序,所述补丁生成程序配置有实现如权利要求1至8中任一项所述的补丁生成方法的步骤。

14.一种存储介质,其特征在于,所述存储介质上存储有补丁生成程序,所述补丁生成程序被处理器执行时实现如权利要求1至8中任一项所述的补丁生成方法的步骤。

说明书 :

补丁生成方法、装置、设备及存储介质

技术领域

[0001] 本发明涉及计算机技术领域,尤其涉及一种补丁生成方法、装置、设备及存储介质。

背景技术

[0002] 目前,应用程序修复主要有迭代修复、热修复等方式,迭代修复是获取下一版本的安装包,并重新安装以修复当前版本的bug;而热修复是通过补丁更新,及时进行修复,热修复可以在系统正常运行的状态下,将补丁应用到处于生产状态(非开发状态)的系统。为提升热修复的效率,需要快速便捷的补丁生成方法。
[0003] 上述内容仅用于辅助理解本发明的技术方案,并不代表承认上述内容是现有技术。

发明内容

[0004] 本发明的主要目的在于提供一种补丁生成方法、装置、设备及存储介质,旨在解决现有技术中补丁生成效率较低的技术问题。
[0005] 为实现上述目的,本发明提供一种补丁生成方法,所述补丁生成方法包括以下步骤:
[0006] 获取待更新文件与更新文件,并获取所述待更新文件与所述更新文件的区别信息;
[0007] 根据所述区别信息获取目标程序包;
[0008] 对所述目标程序包进行反编译,并根据所述区别信息与反编译结果获取目标区别代码;
[0009] 对所述目标区别代码进行反射处理,以生成反射代码;
[0010] 根据预设补丁模板代码与所述反射代码生成补丁。
[0011] 可选地,所述获取待更新文件与更新文件,并获取所述待更新文件与所述更新文件的区别信息的步骤,具体包括:
[0012] 获取待更新文件与更新文件,并通过语法解析工具对所述待更新文件与所述更新文件进行分析,以获取区别代码及所述区别代码对应的区别位置;
[0013] 将所述区别代码及所述区别位置作为所述区别信息。
[0014] 可选地,所述根据所述区别信息获取目标程序包的步骤,具体包括:
[0015] 根据所述区别代码及所述区别位置确定对应的区别文件,并根据所述区别文件获取对应的目标程序包。
[0016] 可选地,所述对所述目标程序包进行反编译,并根据所述区别信息与反编译结果获取目标区别代码的步骤,具体包括:
[0017] 获取所述目标程序包的原代码集合,并对所述原代码集合进行反编译,以生成反编汇代码集合,将所述反编汇代码集合作为反编译结果;
[0018] 根据所述区别信息对所述反编汇代码合集进行检索,以获取目标区别代码。
[0019] 可选地,所述获取所述目标程序包的原代码集合,并对所述原代码集合进行反编译,以生成反编汇代码集合,将所述反编汇代码集合作为反编译结果的步骤,具体包括:
[0020] 获取所述目标程序包的java代码集合,并将所述java代码集合反编译为smali代码集合,将所述smali代码集合作为反编译结果。
[0021] 可选地,所述根据所述区别信息对所述反编汇代码合集进行检索,以获取目标区别代码的步骤,具体包括:
[0022] 根据区别信息获取为java代码的区别代码及所述区别代码对应的区别位置,并通过所述区别代码及所述区别位置对所述smali代码集合进行检索,获取为smali代码的目标区别代码。
[0023] 可选地,所述对所述目标区别代码进行反射处理,以生成反射代码的步骤,具体包括:
[0024] 解析所述目标区别代码,以获取所述目标区别代码中各行对应的函数信息;
[0025] 对所述函数信息进行反射处理,以获取与目标区别代码执行相同功能的反射代码。
[0026] 可选地,所述根据预设补丁模板代码与所述反射代码生成补丁的步骤,具体包括:
[0027] 通过所述预设补丁模板代码对所述反射代码进行格式转换,以生成补丁代码,并将所述补丁代码打包生成补丁。
[0028] 可选地,所述根据预设补丁模板代码与所述反射代码生成补丁的步骤之后,还包括:
[0029] 通过所述补丁对所述待更新文件进行热修复。
[0030] 可选地,所述通过所述补丁对所述待更新文件进行热修复的步骤,具体包括:
[0031] 根据所述区别信息确定所述待更新文件中的区别代码对应的区别位置;
[0032] 根据所述补丁获取补丁代码,并根据所述补丁代码及所述区别位置进行热修复。
[0033] 可选地,所述根据所述补丁获取补丁代码,并根据所述补丁代码及所述区别位置进行热修复的步骤,具体包括:
[0034] 根据所述补丁获取补丁代码;
[0035] 根据所述区别位置确定待更新代码的目标位置信息;
[0036] 根据所述目标位置信息与所述补丁代码对所述待更新代码进行替换,以使应用根据所述补丁代码进行运行实现热修复。
[0037] 此外,为实现上述目的,本发明还提出一种补丁生成装置,所述补丁生成装置包括:
[0038] 分析模块,用于获取待更新文件与更新文件,并获取所述待更新文件与所述更新文件的区别信息;
[0039] 获取模块,用于根据所述区别信息获取目标程序包;
[0040] 反编译模块,用于对所述目标程序包进行反编译,并根据所述区别信息与反编译结果获取目标区别代码;
[0041] 反射模块,用于对所述目标区别代码进行反射处理,以生成反射代码;
[0042] 补丁模块,用于根据预设补丁模板代码与所述反射代码生成补丁。
[0043] 可选地,所述分析模块,还用于获取待更新文件与更新文件,并通过语法解析工具对所述待更新文件与所述更新文件进行分析,以获取区别代码及所述区别代码对应的区别位置;
[0044] 将所述区别代码及所述区别位置作为所述区别信息。
[0045] 可选地,所述获取模块,还用于根据所述区别代码及所述区别位置确定对应的区别文件,并根据所述区别文件获取对应的目标程序包。
[0046] 可选地,所述反编译模块,还用于获取所述目标程序包的原代码集合,并对所述原代码集合进行反编译,以生成反编汇代码集合,将所述反编汇代码集合作为反编译结果;
[0047] 根据所述区别信息对所述反编汇代码合集进行检索,以获取目标区别代码。
[0048] 可选地,所述反编译模块,还用于获取所述目标程序包的java代码集合,并将所述java代码集合反编译为smali代码集合,将所述smali代码集合作为反编译结果。
[0049] 可选地,所述反编译模块,还用于根据区别信息获取为java代码的区别代码及所述区别代码对应的区别位置,并通过所述区别代码及所述区别位置对所述smali代码集合进行检索,获取为smali代码的目标区别代码。
[0050] 可选地,所述反射模块,还用于解析所述目标区别代码,以获取所述目标区别代码中各行对应的函数信息;
[0051] 对所述函数信息进行反射处理,以获取与目标区别代码执行相同功能的反射代码。
[0052] 此外,为实现上述目的,本发明还提出一种补丁生成设备,所述补丁生成设备包括存储器、处理器及存储在所述存储器上并可在所述处理器上运行的补丁生成程序,所述补丁生成程序配置为实现如上文所述的补丁生成方法的步骤。
[0053] 此外,为实现上述目的,本发明还提出一种存储介质,所述存储介质上存储有补丁生成程序,所述补丁生成程序被处理器执行时实现如上文所述的补丁生成方法的步骤。
[0054] 本发明中,获取待更新文件与更新文件,并获取所述待更新文件与所述更新文件的区别信息;根据所述区别信息获取目标程序包;对所述目标程序包进行反编译,并根据所述区别信息与反编译结果获取目标区别代码;对所述目标区别代码进行反射处理,以生成反射代码;根据预设补丁模板代码与所述反射代码生成补丁。本发明通过获取更新文件与待更新文件的区别信息,进而根据区别信息得到程序包进行反编译,以生成补丁。提升了热修复过程中补丁生成的效率,节省了补丁生成的时间。

附图说明

[0055] 图1是本发明实施例方案涉及的硬件运行环境的补丁生成设备的结构示意图;
[0056] 图2为本发明补丁生成方法第一实施例的流程示意图;
[0057] 图3为本发明补丁生成方法第二实施例的流程示意图;
[0058] 图4为本发明补丁生成方法第三实施例的流程示意图;
[0059] 图5为本发明补丁生成方法第四实施例的流程示意图;
[0060] 图6为本发明补丁生成装置第一实施例的结构框图。
[0061] 本发明目的的实现、功能特点及优点将结合实施例,参照附图做进一步说明。

具体实施方式

[0062] 应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
[0063] 参照图1,图1为本发明实施例方案涉及的硬件运行环境的补丁生成设备结构示意图。
[0064] 如图1所示,该补丁生成设备可以包括:处理器1001,例如中央处理器(Central Processing Unit,CPU),通信总线1002、用户接口1003,网络接口1004,存储器1005。其中,通信总线1002用于实现这些组件之间的连接通信。用户接口1003可以包括显示屏(Display),可选用户接口1003还可以包括标准的有线接口、无线接口,对于用户接口1003的有线接口在本发明中可为USB接口。网络接口1004可选的可以包括标准的有线接口、无线接口(如无线保真(WIreless‑FIdelity,WI‑FI)接口)。存储器1005可以是高速的随机存取存储器(Random Access Memory,RAM)存储器,也可以是稳定的存储器(Non‑volatile Memory,NVM),例如磁盘存储器。存储器1005可选的还可以是独立于前述处理器1001的存储装置。
[0065] 本领域技术人员可以理解,图1中示出的结构并不构成对补丁生成设备的限定,可以包括比图示更多或更少的部件,或者组合某些部件,或者不同的部件布置。
[0066] 如图1所示,作为一种计算机存储介质的存储器1005中可以包括操作系统、网络通信模块、用户接口模块以及补丁生成程序。
[0067] 在图1所示的补丁生成设备中,网络接口1004主要用于连接后台服务器,与所述后台服务器进行数据通信;用户接口1003主要用于连接用户设备;所述补丁生成设备通过处理器1001调用存储器1005中存储的补丁生成程序,并执行本发明实施例提供的补丁生成方法。
[0068] 基于上述硬件结构,提出本发明补丁生成方法的实施例。
[0069] 参照图2,图2为本发明补丁生成方法第一实施例的流程示意图,提出本发明补丁生成方法第一实施例。
[0070] 在第一实施例中,所述补丁生成方法包括以下步骤:
[0071] 步骤S10:获取待更新文件与更新文件,并获取所述待更新文件与所述更新文件的区别信息。
[0072] 需要说明的是,本实施例的执行主体为补丁生成装置,本实施例适用于热修复。现有技术中,若应用程序的当前版本应用程序包(Android application package,apk)已经被用户安装在移动终端的系统中,所述当前版本应用程序包中部分代码存在逻辑错误;存在的修复方式有:迭代修复与热修复。迭代修复是编译出修复上述逻辑错误的更新版本应用程序包,并将所述应用程序包安装在移动终端上,这种方式需要用户主动获取更新版本的应用程序包,并重新安装应用程序包,需要等待版本覆盖时间。而热修复,相对于迭代修复,获取到出现错误的代码,根据所述代码生成补丁包,向用户推送补丁包对已安装的应用程序进行修复,仅需进行补丁更新,无需重新安装整个应用程序,避免了重新向渠道更新apk版本。
[0073] 易于理解的是,所述待更新文件可以为已安装的应用程序的当前安装版本文件,所述待更新文件中可能包含具有逻辑错误的代码,所述更新文件为不具有逻辑错误的,与所述待更新文件对应的所述应用程序的其他版本文件。所述待更新文件为多个文件,对应的,所述更新文件也为多个文件。所述区别信息为所述待更新文件与所述更新文件进行比对后,得到的更新文件与待更新文件之间的区别代码、区别代码的在文件中的位置信息、区别代码对应的区别文件。
[0074] 步骤S20:根据所述区别信息获取目标程序包。
[0075] 易于理解的是,根据区别信息中包含的各种信息,可以得到更新文件中区别代码对应的区别文件,再根据所述区别文件得到区别文件对应的apk包,也即,所述目标程序包对应于所述更新文件,所述目标程序包中的代码并不存在逻辑错误。
[0076] 步骤S30:对所述目标程序包进行反编译,并根据所述区别信息与反编译结果获取目标区别代码。
[0077] 应当理解的是,对所述目标程序包进行反编译,得到了作为反编译结果的反编译的代码集合,所述反编译的代码集合与反编译前的目标程序包的代码集合执行的功能相同,因此可以根据所述区别信息对反编译结果进行检索,得到区别信息中区别代码对应的反编译的目标区别代码。具体实施中,反编译前后所使用的代码的类型不同。
[0078] 步骤S40:对所述目标区别代码进行反射处理,以生成反射代码。
[0079] 易于理解的是,由于在系统外部不便于对apk包内部的代码进行处理(可能存在没有访问权限的情况),因此通过反射处理将所述目标区别代码反射提取出来。所述反射处理的主要目的是将所述目标区别代码反射为与所述目标区别代码功能相同,但是以反射实现功能的代码。具体实施中,反射处理后的代码相对于反射处理前的代码较为复杂。
[0080] 步骤S50:根据预设补丁模板代码与所述反射代码生成补丁。
[0081] 易于理解的是,所述预设补丁模板根据待更新文件的需求进行设置,所生成的补丁可以被打包成jar包或者apk补丁,所述补丁中包含用于替换待更新文件中具有逻辑错误的代码的正确代码。
[0082] 本实施例中,通过获取存在区别的代码,并将所述代码通过反编译与反射处理从系统内部提取出来,生成补丁包。相对于现有技术生成补丁的方式,响应快,生成补丁的效率高,有利于提升热修复的效率。
[0083] 参照图3,图3为本发明补丁生成方法第二实施例的流程示意图,基于上述图2所示的第一实施例,提出本发明补丁生成方法的第二实施例。本实施例基于第一实施例进行说明。
[0084] 在第二实施例中,所述步骤S10具体包括:
[0085] 步骤S101:获取待更新文件与更新文件,并通过语法解析工具对所述待更新文件与所述更新文件进行分析,以获取区别代码及所述区别代码对应的区别位置。
[0086] 步骤S102:将所述区别代码及所述区别位置作为所述区别信息。
[0087] 应当理解的是,语法解析工具分别对待更新文件、更新文件的源代码进行解析,并将代码中的函数的信息保存在一个预设列表中,进一步地,可以采用diff工具对源代码进行再次解析,并将代码中的函数信息保存在另一预设列表中。对比两个预设列表,可以获取到区别代码及所述区别代码对应的区别文职信息等信息。
[0088] 具体实施中,例如:获取到多个待更新文件及其对应的多个更新文件,其中待更新文件a对应于更新文件A,将待更新文件a解析后,将其源代码储存在第一预设列表,将更新文件A解析后,将其源代码储存在第二预设列表,对比两个预设列表,得到具有区别的源代码及所述源代码所属的位置、对应的文件,例如:对待更新文件a与更新文件A的源代码进行逐行比对,得到更新文件A的第二行代码为补丁生成Y,待更新文件a的第二行代码为补丁生成X,则分别获取上述第二行代码作为区别信息,并将区别信息存储。本实施例仅为解释说明,具体实施中,代码并不为本实施例中的格式与内容。
[0089] 进一步地,为得到目标程序包,所述步骤S20具体包括:
[0090] 步骤S201:根据所述区别代码及所述区别位置确定对应的区别文件,并根据所述区别文件获取对应的目标程序包。
[0091] 易于理解的是,所述待更新文件与所述更新文件均为多个文件,而解析后得到的是所有文件的源代码的集合,需要获取到具有区别的源代码对应的更新文件中的区别文件,并根据区别文件找到对应的目标程序包。需要说明的是,所述目标程序包为所述更新文件对应的程序包,所述目标程序包对应的代码为正确的代码。
[0092] 进一步地,为提升补丁生成的效率,所述步骤S30具体包括:
[0093] 步骤S301:获取所述目标程序包的原代码集合,并对所述原代码集合进行反编译,以生成反编汇代码集合,将所述反编汇代码集合作为反编译结果。
[0094] 进一步地,具体实施中,所述步骤S301具体包括:获取所述目标程序包的java代码集合,并将所述java代码集合反编译为smali代码集合,将所述smali代码集合作为反编译结果。
[0095] 需要说明的是,更新文件对应的代码可以为java代码,通过语法解析工具结合diff工具找到相对于待更新文件出现变化的java代码,并根据出现变化的java代码获取代码所属的文件,及文件对应的jar包或者apk包。具体实施中,解析一遍java代码形式的源代码,将代码中的函数的信息保存到list A中,再使用diff patch到源代码上,再次解析源代码,将代码中的函数信息保存到list B,对比两个list,即可获取到出现变化的代码。
[0096] 步骤S302:根据所述区别信息对所述反编汇代码合集进行检索,以获取目标区别代码。
[0097] 进一步地,具体实施中,所述步骤S301具体包括:根据区别信息获取为java代码的区别代码及所述区别代码对应的区别位置,并通过所述区别代码及所述区别位置对所述smali代码集合进行检索,获取为smali代码的目标区别代码。
[0098] 易于理解的是,smali代码所用的语法是一种宽松式的Jasmin/dedexer语法,而且它实现了.dex格式所有功能(注解,调试信息,线路信息等)。相对于使用java代码进行反编译,将java代码反编译为smali代码,在后续的补丁生成过程中更方便对代码进行处理。
[0099] 本实施例中,通过获取存在区别的代码,并将所述代码通过反编译与反射处理从系统内部提取出来,生成补丁包。相对于现有技术生成补丁的方式,响应快,生成补丁的效率高,有利于提升热修复的效率。
[0100] 参照图4,图4为本发明补丁生成方法第三实施例的流程示意图,基于上述第二实施例,提出本发明补丁生成方法的第三实施例。本实施例基于第二实施例进行说明。在第三实施例中,所述步骤S40具体包括:
[0101] 步骤S401:解析所述目标区别代码,以获取所述目标区别代码中各行对应的函数信息。
[0102] 需要说明的是,具体实施中,例如:以行为单位,对提取到的目标区别代码,也即smali代码形式的目标区别代码,进行解析,例如:对方法调用的行,获取该行使用到的寄存器、方法名称以及对应类名称,使用封装好的反射方法,声明部分临时使用的寄存器,包括方法名称、类名称、方法类型数组等。
[0103] 步骤S402:对所述函数信息进行反射处理,以获取与目标区别代码执行相同功能的反射代码。
[0104] 易于理解的是,基于上述举例进行进一步地说明,例如:声明部分临时使用的寄存器之后,还包括:原函数的寄存器保存到调用方法使用的对象数组中,生成功能与原方法相同,但是以反射实现功能的代码。
[0105] 进一步地,所述步骤S50具体包括:
[0106] 步骤S501:通过所述预设补丁模板代码对所述反射代码进行格式转换,以生成补丁代码,并将所述补丁代码打包生成补丁。
[0107] 具体实施中,根据预设补丁模版生成补丁的工作可以由插件进行完成,根据反射得到的代码,及待更新文件的实际需求进行模板设置,以生成补丁。
[0108] 本实施例中,通过获取存在区别的代码,并将所述代码通过反编译与反射处理从系统内部提取出来,生成补丁包。相对于现有技术生成补丁的方式,响应快,生成补丁的效率高,有利于提升热修复的效率。
[0109] 参照图5,图5为本发明补丁生成方法第四实施例的流程示意图,基于上述第三实施例,提出本发明补丁生成方法的第四实施例。本实施例基于第三实施例进行说明。
[0110] 在第三实施例中,所述步骤S50之后还包括:
[0111] 步骤S60:通过所述补丁对所述待更新文件进行热修复。
[0112] 需要说明的是,热修复的主要方式是向用户推送热修复补丁,具体实施中,例如:用户使用手机中的某一应用程序,应用程序主动向用户推送热修复补丁,用户下载热修复补丁,热修复补丁可以在设备运行正常业务时对所述应用程序进行修复,用户无需重启设备或重装整个应用程序。
[0113] 进一步地,所述步骤S60具体包括:
[0114] 根据所述区别信息确定所述待更新文件中的区别代码对应的区别位置;根据所述补丁获取补丁代码,并根据所述补丁代码及所述区别位置进行热修复。
[0115] 易于理解的是,为取代具有逻辑错误的代码在所有代码中执行的功能,需要获取到所述具有逻辑错误的代码,即区别位置,进一步地,根据所述区别位置即补丁中获取到的补丁代码,也即用于修复的没有逻辑错误的争取代码,对区别位置的逻辑错误代码进行修复。
[0116] 进一步地,为防止修复过程中影响实际运行,所述根据所述补丁获取补丁代码,并根据所述补丁代码及所述区别位置进行热修复的步骤,具体包括:
[0117] 根据所述补丁获取补丁代码;根据所述区别位置确定待更新代码的目标位置信息;根据所述目标位置信息与所述补丁代码对所述待更新代码进行替换,以使应用根据所述补丁代码进行运行实现热修复。
[0118] 需要说明的是,上述替换,并不是直接擦写掉原本的待更新代码,而是提供一份补丁代码,将所述补丁代码位于待更新代码的位置,使得应用运行时,执行所述补丁代码,绕过所述待更新代码。由于待更新代码并没有被删除,因此过程中不影响当前业务的运行,无需重启设备或重装整个应用程序。
[0119] 具体实施中,修复可以通过native底层替换、类加载、Instant Run等方式实施;例如:通过native底层替换进行热修复,java代码的最小组织方式是Method方法,每个.dex格式的文件最多可以包含65536(0xffff)个方法,每个方法在虚拟机中存在与之对应的结构体指针,结构体包含的内容为执行入口、访问权限、所属类和代码执行地址等;虚拟机可以根据结构体对方法进行操作。进行热修复时,通过将原来指向错误逻辑的待更新代码的指针,变为指向正确逻辑的补丁代码,就达到了修复的目的。
[0120] 例如:通过类加载方式进行热修复,将补丁代码打包为.dex文件,并将所述文件插入到待更新文件中待更新代码数组的第一个元素,因为加载类是依次进行的,因此虚拟机在第一个数组找到类后就不会再加载待更新代码。但,类加载方案存在缺陷,由于类加载后无法卸载,所以类加载方案必须重启应用程序,让待更新代码对应的类重新加载后才能生效。
[0121] 例如:通过Instant Run方式进行热修复,在编译时通过插桩在每一个方法中插入补丁代码,修改代码逻辑,在需要时绕过错误方法,调用patch类的正确方法。
[0122] 本实施例中,通过获取存在区别的代码,并将所述代码通过反编译与反射处理从系统内部提取出来,生成补丁包。相对于现有技术生成补丁的方式,响应快,生成补丁的效率高,有利于提升热修复的效率。
[0123] 此外,本发明实施例还提出一种存储介质,所述存储介质上存储有补丁生成程序,所述补丁生成程序被处理器执行时实现如上文所述的补丁生成方法的步骤。
[0124] 由于本存储介质采用了上述所有实施例的全部技术方案,因此至少具有上述实施例的技术方案所带来的所有有益效果,在此不再一一赘述。
[0125] 此外,参照图6,本发明实施例还提出一种补丁生成装置,所述补丁生成装置包括:
[0126] 分析模块10,用于获取待更新文件与更新文件,并获取所述待更新文件与所述更新文件的区别信息。
[0127] 需要说明的是,本实施例适用于热修复。现有技术中,若应用程序的当前版本应用程序包(Android application package,apk)已经被用户安装在移动终端的系统中,所述当前版本应用程序包中部分代码存在逻辑错误;存在的修复方式有:迭代修复与热修复。迭代修复是编译出修复上述逻辑错误的更新版本应用程序包,并将所述应用程序包安装在移动终端上,这种方式需要用户主动获取更新版本的应用程序包,并重新安装应用程序包,需要等待版本覆盖时间。而热修复,相对于迭代修复,获取到出现错误的代码,根据所述代码生成补丁包,向用户推送补丁包对已安装的应用程序进行修复,仅需进行补丁更新,无需重新安装整个应用程序,避免了重新向渠道更新apk版本。
[0128] 易于理解的是,所述待更新文件可以为已安装的应用程序的当前安装版本文件,所述待更新文件中可能包含具有逻辑错误的代码,所述更新文件为不具有逻辑错误的,与所述待更新文件对应的所述应用程序的其他版本文件。所述待更新文件为多个文件,对应的,所述更新文件也为多个文件。所述区别信息为所述待更新文件与所述更新文件进行比对后,得到的更新文件与待更新文件之间的区别代码、区别代码的在文件中的位置信息、区别代码对应的区别文件。
[0129] 获取模块20,用于根据所述区别信息获取目标程序包。
[0130] 易于理解的是,根据区别信息中包含的各种信息,可以得到更新文件中区别代码对应的区别文件,再根据所述区别文件得到区别文件对应的apk包,也即,所述目标程序包对应于所述更新文件,所述目标程序包中的代码并不存在逻辑错误。
[0131] 反编译模块30,用于对所述目标程序包进行反编译,并根据所述区别信息与反编译结果获取目标区别代码。
[0132] 应当理解的是,对所述目标程序包进行反编译,得到了作为反编译结果的反编译的代码集合,所述反编译的代码集合与反编译前的目标程序包的代码集合执行的功能相同,因此可以根据所述区别信息对反编译结果进行检索,得到区别信息中区别代码对应的反编译的目标区别代码。具体实施中,反编译前后所使用的代码的类型不同。
[0133] 反射模块40,用于对所述目标区别代码进行反射处理,以生成反射代码。
[0134] 易于理解的是,由于在系统外部不便于对apk包内部的代码进行处理(可能存在没有访问权限的情况),因此通过反射处理将所述目标区别代码反射提取出来。所述反射处理的主要目的是将所述目标区别代码反射为与所述目标区别代码功能相同,但是以反射实现功能的代码。具体实施中,反射处理后的代码相对于反射处理前的代码较为复杂。
[0135] 补丁模块50,用于根据预设补丁模板代码与所述反射代码生成补丁。
[0136] 易于理解的是,所述预设补丁模板根据待更新文件的需求进行设置,所生成的补丁可以被打包成jar包或者apk补丁,所述补丁中包含用于替换待更新文件中具有逻辑错误的代码的正确代码。
[0137] 本实施例中,通过获取存在区别的代码,并将所述代码通过反编译与反射处理从系统内部提取出来,生成补丁包。相对于现有技术生成补丁的方式,响应快,生成补丁的效率高,有利于提升热修复的效率。
[0138] 基于本发明上述补丁生成装置第一实施例,提出本发明补丁生成装置的第二实施例。
[0139] 在本实施例中,进一步地,所述分析模块,还用于获取待更新文件与更新文件,并通过语法解析工具对所述待更新文件与所述更新文件进行分析,以获取区别代码及所述区别代码对应的区别位置;
[0140] 将所述区别代码及所述区别位置作为所述区别信息。
[0141] 进一步地,所述获取模块,还用于根据所述区别代码及所述区别位置确定对应的区别文件,并根据所述区别文件获取对应的目标程序包。
[0142] 进一步地,所述反编译模块,还用于获取所述目标程序包的原代码集合,并对所述原代码集合进行反编译,以生成反编汇代码集合,将所述反编汇代码集合作为反编译结果;
[0143] 根据所述区别信息对所述反编汇代码合集进行检索,以获取目标区别代码。
[0144] 进一步地,所述反编译模块,还用于获取所述目标程序包的java代码集合,并将所述java代码集合反编译为smali代码集合,将所述smali代码集合作为反编译结果。
[0145] 进一步地,所述反编译模块,还用于根据区别信息获取为java代码的区别代码及所述区别代码对应的区别位置,并通过所述区别代码及所述区别位置对所述smali代码集合进行检索,获取为smali代码的目标区别代码。
[0146] 进一步地,所述反射模块,还用于解析所述目标区别代码,以获取所述目标区别代码中各行对应的函数信息;
[0147] 对所述函数信息进行反射处理,以获取与目标区别代码执行相同功能的反射代码。
[0148] 进一步地,所述装置还用于通过所述预设补丁模板代码对所述反射代码进行格式转换,以生成补丁代码,并将所述补丁代码打包生成补丁。
[0149] 进一步地,所述装置还用于通过所述补丁对所述待更新文件进行热修复。
[0150] 进一步地,所述装置还用于根据所述区别信息确定所述待更新文件中的区别代码对应的区别位置;
[0151] 根据所述补丁获取补丁代码,并根据所述补丁代码及所述区别位置进行热修复。
[0152] 进一步地,所述装置还用于根据所述补丁获取补丁代码;
[0153] 根据所述区别位置确定待更新代码的目标位置信息;
[0154] 根据所述目标位置信息与所述补丁代码对所述待更新代码进行替换,以使应用根据所述补丁代码进行运行实现热修复。
[0155] 本发明所述补丁生成装置的其他实施例或具体实现方式可参照上述各方法实施例,此处不再赘述。
[0156] 需要说明的是,在本文中,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者系统不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者系统所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括该要素的过程、方法、物品或者系统中还存在另外的相同要素。
[0157] 上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。在列举了若干装置的权利要求中,这些装置中的若干个可以是通过同一个硬件项来具体体现。词语第一、第二、以及第三等的使用不表示任何顺序,可将这些词语解释为标识。
[0158] 通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到上述实施例方法可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质(如只读存储器镜像(Read Only Memory image,ROM)/随机存取存储器(Random Access Memory,RAM)、磁碟、光盘)中,包括若干指令用以使得一台终端设备(可以是手机,计算机,服务器,空调器,或者网络设备等)执行本发明各个实施例所述的方法。
[0159] 以上仅为本发明的优选实施例,并非因此限制本发明的专利范围,凡是利用本发明说明书及附图内容所作的等效结构或等效流程变换,或直接或间接运用在其他相关的技术领域,均同理包括在本发明的专利保护范围内。