一种安卓应用的热修复方法、装置、服务器和系统的制作方法

文档序号:10724637阅读:335来源:国知局
一种安卓应用的热修复方法、装置、服务器和系统的制作方法
【专利摘要】本发明公开了一种安卓应用的热修复方法、装置、服务器和系统。该方法包括:获取指定安卓应用的补丁包,所述补丁包中包括指定安卓应用中的修复后的指定的类文件;当指定安卓应用启动时,加载所述补丁包;当指定安卓应用需要调用指定的类文件时,从所述补丁包中调用修复后的指定的类文件以执行相应功能。可知,本方案与现有技术相比,该修复过程无需经历发布方重新打包指定安卓应用、测试、向各个应用市场和渠道换包、提示用户升级、提示用户下载、利用新安装包覆盖安装指定安卓应用等一系列步骤,在不改动原安卓应用的基础上,利用一个补丁包即可实现安卓应用的热修复,极大地降低了安卓应用的修复成本。
【专利说明】
一种安卓应用的热修复方法、装置、服务器和系统
技术领域
[0001]本发明涉及互联网技术领域,具体涉及一种安卓应用的热修复方法、装置、服务器和系统。
【背景技术】
[0002]现有技术中,当一个安卓应用在发布之后,突然发现该安卓应用中出现严重问题需要进行紧急修复,这时候开发方就会忙得焦头烂额:需要对该安卓应用进行修复,将修复后的安卓应用整体打包成安卓应用安装包,对安卓应用安装包进行测试,测试通过后向各个应用市场和渠道换包,提示用户升级,提示用户下载修复后的安卓应用安装包,对该修复后的安卓应用安装包进行安装以覆盖修复前的安卓应用;有时候仅仅是为了修改一行代码,也要付出巨大的成本进行换包和重新发布;而对于用户来说,一款安卓应用的反复升级、重新下载安装的过程也将大大降低用户的使用体验。

【发明内容】

[0003]鉴于上述问题,提出了本发明以便提供一种克服上述问题或者至少部分地解决上述问题的安卓应用的热修复方法、装置、服务器和系统。
[0004]依据本发明的一个方面,提供了一种安卓应用的热修复方法,该方法包括:
[0005]获取指定安卓应用的补丁包,所述补丁包中包括:指定安卓应用中的修复后的指定的类文件;
[0006]当指定安卓应用启动时,加载所述补丁包;
[0007]当指定安卓应用需要调用指定的类文件时,从所述补丁包中调用修复后的指定的类文件以执行相应功能。
[0008]可选地,加载所述补丁包包括:
[0009]根据所述补丁包所在的文件目录,构造类加载器,通过该类加载器加载所述补丁包。
[0010]可选地,所述加载所述补丁包还包括:
[0011]获取对所述补丁包进行加载的过程对应的第一加载集合,所述补丁包为该第一加载集合中的唯一元素;
[0012]获取对指定安卓应用中的各执行文件进行加载的过程对应的第二加载集合,指定安卓应用中的各执行文件为该第二加载集合中的元素;
[0013]将第一加载集合和第二加载集合合并为一个加载集合,使得所述补丁包作为该加载集合中的第一个元素。
[0014]可选地,所述当指定安卓应用需要调用指定的类文件时,从所述补丁包中调用修复后的指定的类文件以执行相应功能包括:
[0015]当指定安卓应用需要调用一个类文件时,按照所述加载集合的元素顺序,依次从每个元素中查找所需要调用的类文件;
[0016]如果查找到需要调用的类文件,停止查找,直接调用该类文件执行相应功能;
[0017]如果未查找到需要调用的类文件,跳转到下一个元素查找需要调用的类文件,直至查找到为止。
[0018]可选地,该方法进一步包括:
[0019]在指定安卓应用启动之前,获取一个第三方执行文件,将该第三方执行文件放入指定安卓应用的指定文件目录中;在指定安卓应用的各执行文件中的各类文件中,注入指示该类文件对所述第三方执行文件进行引用的代码;
[0020]在指定安卓应用启动时,先加载所述第三方文件,再加载指定安卓应用中的各执行文件。
[0021]可选地,所述在指定安卓应用的各执行文件中的各类文件中,注入指示该类文件对所述第三方执行文件进行引用的代码包括:
[0022]设置一个排除列表;
[0023]获取指定安卓应用中的每个类文件,判断该类文件是否命中所述排除列表,如果否,在该类文件中注入指示该类文件对所述第三方执行文件进行引用的代码;如果是,不在该类文件中注入代码。
[0024]可选地,所述排除列表中包括:
[0025]指定安卓应用中的Applicat1n类文件的子类文件。
[0026]可选地,所述补丁包中的修复后的指定的类文件不包括所述排除列表中的类文件。
[0027]可选地,所述补丁包中的每个修复后的指定的类文件中包括:该修复后的指定的类文件的标识信息;
[0028]则在从所述补丁包中调用修复后的指定的类文件执行相应功能之前,该方法进一步包括:判断该修复后的指定的类文件的标识信息与相应的指定的类文件的标识信息是否相同,是则调用该修复后的指定的类文件,否则停止调用该修复后的指定的类文件。
[0029]可选地,所述补丁包中的每个修复后的指定的类文件中包括:该修复后的指定的类文件关于安卓应用的描述信息;
[0030]则在从所述补丁包中调用修复后的指定的类文件执行相应功能之前,该方法进一步包括:判断指定安卓应用是否符合该修复后的指定的类文件关于安卓应用的描述信息,是则调用该修复后的指定的类文件,否则停止调用该修复后的指定的类文件。
[0031]可选地,所述补丁包是在服务器生成并下发到本地的。
[0032]可选地,该方法进一步包括:
[0033]如果指定安卓应用在启动后的预设时间内发生崩溃,卸载所述补丁包。
[0034]依据本发明的另一个方面,提供了一种安卓应用的热修复方法,该方法包括:
[0035]生成修复后的指定安卓应用,获取修复后的指定安卓应用中的各类文件;
[0036]保留修复前的指定安卓应用,获取修复前的指定安卓应用中的各类文件;
[0037]将修复后的指定安卓应用中的各类文件与修复前的指定安卓应用中的各类文件进行比较;
[0038]对于每个类文件,如果该类文件的内容在修复前后发生变化,则该类文件为指定的类文件;
[0039]将各经修复的指定的类文件放入补丁文件中,生成补丁包;
[0040]将所述补丁包下发至客户端,由客户端加载所述补丁包以对指定安卓应用进行修复。
[0041 ]可选地,如果修复前的指定安卓应用中的类文件进行了混淆,则该方法进一步包括:保留修复前的指定安卓应用中的类文件的混淆映射关系;
[0042]所述将修复后的指定安卓应用中的各类文件与修复前的指定安卓应用中的各类文件进行比较包括:
[0043]对于修复后的指定安卓应用中的每个类文件,根据所述混淆映射关系,确定对应的修复前的指定安卓应用中的类文件,比较类文件的内容在修复前后是否发生变化。
[0044]可选地,如果修复前的指定安卓应用中的每个类文件的内容以MD5值表示,该方法进一步包括:计算修复后的指定安卓应用中的每个类文件的内容的MD5值;
[0045]则所述将修复后的指定安卓应用中的各类文件与修复前的指定安卓应用中的各类文件进行比较包括:对于修复后的指定安卓应用中的每个类文件,将该类文件的MD5值与相应的修复前的指定安卓应用中的类文件的MD5值进行比较。
[0046]依据本发明的又一个方面,提供了一种安卓应用的热修复装置,该装置包括:
[0047]获取单元,适于获取指定安卓应用的补丁包,所述补丁包中包括:指定安卓应用中的修复后的指定的类文件;
[0048]加载单元,适于当指定安卓应用启动时,加载所述补丁包;
[0049]调用单元,适于当指定安卓应用需要调用指定的类文件时,从所述补丁包中调用修复后的指定的类文件以执行相应功能。
[0050]可选地,所述加载单元,适于根据所述补丁包所在的文件目录,构造类加载器,通过该类加载器加载所述补丁包。
[0051 ] 可选地,所述加载单元,还适于获取对所述补丁包进行加载的过程对应的第一加载集合,所述补丁包为该第一加载集合中的唯一元素;获取对指定安卓应用中的各执行文件进行加载的过程对应的第二加载集合,指定安卓应用中的各执行文件为该第二加载集合中的元素;将第一加载集合和第二加载集合合并为一个加载集合,使得所述补丁包作为该加载集合中的第一个元素。
[0052]可选地,所述调用单元,适于当指定安卓应用需要调用一个类文件时,按照所述加载集合的元素顺序,依次从每个元素中查找所需要调用的类文件;如果查找到需要调用的类文件,停止查找,直接调用该类文件执行相应功能;如果未查找到需要调用的类文件,跳转到下一个元素查找需要调用的类文件,直至查找到为止。
[0053]可选地,该装置进一步包括:预处理单元;
[0054]预处理单元,适于在指定安卓应用启动之前,获取一个第三方执行文件,将该第三方执行文件放入指定安卓应用的指定文件目录中;在指定安卓应用的各执行文件中的各类文件中,注入指示该类文件对所述第三方执行文件进行引用的代码;
[0055]所述加载单元,进一步适于在指定安卓应用启动时,先加载所述第三方文件,再加载指定安卓应用中的各执行文件。
[0056]可选地,所述预处理单元,适于设置一个排除列表;获取指定安卓应用中的每个类文件,判断该类文件是否命中所述排除列表,如果否,在该类文件中注入指示该类文件对所述第三方执行文件进行引用的代码;如果是,不在该类文件中注入代码。
[0057]可选地,所述排除列表中包括:
[0058]指定安卓应用中的Applicat1n类文件的子类文件。
[0059]可选地,所述补丁包中的修复后的指定的类文件不包括所述排除列表中的类文件。
[0060]可选地,所述补丁包中的每个修复后的指定的类文件中包括:该修复后的指定的类文件的标识信息;
[0061]则所述调用单元,进一步适于在从所述补丁包中调用修复后的指定的类文件执行相应功能之前,判断该修复后的指定的类文件的标识信息与相应的指定的类文件的标识信息是否相同,是则调用该修复后的指定的类文件,否则停止调用该修复后的指定的类文件。
[0062]可选地,所述补丁包中的每个修复后的指定的类文件中包括:该修复后的指定的类文件关于安卓应用的描述信息;
[0063]则所述调用单元,进一步适于在从所述补丁包中调用修复后的指定的类文件执行相应功能之前,判断指定安卓应用是否符合该修复后的指定的类文件关于安卓应用的描述信息,是则调用该修复后的指定的类文件,否则停止调用该修复后的指定的类文件。
[0064]可选地,所述补丁包是在服务器生成并下发到本地的。
[0065]可选地,该装置进一步包括:
[0066]卸载单元,适于当指定安卓应用在启动后的预设时间内发生崩溃时,卸载所述补丁包。
[0067]依据本发明的再一个方面,提供了一种安卓应用的热修复服务器,该服务器包括:
[0068]修复处理单元,适于生成修复后的指定安卓应用,获取修复后的指定安卓应用中的各类文件;以及适于保留修复前的指定安卓应用,获取修复前的指定安卓应用中的各类文件;
[0069]补丁包生成单元,适于将修复后的指定安卓应用中的各类文件与修复前的指定安卓应用中的各类文件进行比较;对于每个类文件,如果该类文件的内容在修复前后发生变化,则该类文件为指定的类文件;将各经修复的指定的类文件放入补丁文件中,生成补丁包;
[0070]补丁包下发单元,适于将所述补丁包下发至客户端,由客户端加载所述补丁包以对指定安卓应用进行修复。
[0071]可选地,所述修复处理单元,进一步适于当修复前的指定安卓应用中的类文件进行了混淆时,保留修复前的指定安卓应用中的类文件的混淆映射关系;
[0072]所述补丁包生成单元,适于对于修复后的指定安卓应用中的每个类文件,根据所述混淆映射关系,确定对应的修复前的指定安卓应用中的类文件,比较类文件的内容在修复前后是否发生变化。
[0073]可选地,所述修复处理单元,进一步适于当修复前的指定安卓应用中的每个类文件的内容以MD5值表示时,计算修复后的指定安卓应用中的每个类文件的内容的MD5值;
[0074]所述补丁包生成单元,适于对于修复后的指定安卓应用中的每个类文件,将该类文件的MD5值与相应的修复前的指定安卓应用中的类文件的MD5值进行比较。
[0075]依据本发明的再一个方面,提供了一种安卓应用的热修复系统,该系统包括:如上任一项所述的装置,以及,如上任一项所述的服务器。
[0076]由上述内容可知,当指定安卓应用中指定的类文件出现问题需要被修复时,依据本发明提供的技术方案,直接获取包含指定安卓应用中的修复后的指定的类文件的补丁包,当安卓应用需要调用指定的类文件时,从该补丁包中调用相应的修复后的指定的类文件,实现了安卓应用的正常运行。与现有技术相比,该修复过程无需经历发布方重新打包指定安卓应用、测试、向各个应用市场和渠道换包、提示用户升级、提示用户下载、利用新安装包覆盖安装指定安卓应用等一系列步骤,在不改动原安卓应用的基础上,利用一个补丁包即可实现安卓应用的热修复,极大地降低了安卓应用的修复成本,且修复过程用户无感知,既符合开发需求,也符合用户需求。
[0077]上述说明仅是本发明技术方案的概述,为了能够更清楚了解本发明的技术手段,而可依照说明书的内容予以实施,并且为了让本发明的上述和其它目的、特征和优点能够更明显易懂,以下特举本发明的【具体实施方式】。
【附图说明】
[0078]通过阅读下文优选实施方式的详细描述,各种其他的优点和益处对于本领域普通技术人员将变得清楚明了。附图仅用于示出优选实施方式的目的,而并不认为是对本发明的限制。而且在整个附图中,用相同的参考符号表示相同的部件。在附图中:
[0079]图1示出了根据本发明一个实施例的一种安卓应用的热修复方法的流程图;
[0080]图2示出了根据本发明另一个实施例一种安卓应用的热修复方法的流程图;
[0081]图3示出了根据本发明一个实施例的一种安卓应用的热修复装置的示意图;
[0082]图4示出了根据本发明另一个实施例的一种安卓应用的热修复装置的示意图
[0083]图5示出了根据本发明一个实施例的一种安卓应用的热修复服务器的示意图
[0084]图6示出了根据本发明一个实施例的一种安卓应用的热修复系统的示意图。
【具体实施方式】
[0085]下面将参照附图更详细地描述本公开的示例性实施例。虽然附图中显示了本公开的示例性实施例,然而应当理解,可以以各种形式实现本公开而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了能够更透彻地理解本公开,并且能够将本公开的范围完整的传达给本领域的技术人员。
[0086]图1示出了根据本发明一个实施例的一种安卓应用的热修复方法的流程图,从客户端侧说明本方案的实施过程。如图1所示,该方法包括:
[0087]步骤SI10,获取指定安卓应用的补丁包,所述补丁包中包括:指定安卓应用中的修复后的指定的类文件。
[0088]步骤S120,当指定安卓应用启动时,加载所述补丁包。
[0089]步骤S130,当指定安卓应用需要调用指定的类文件时,从所述补丁包中调用修复后的指定的类文件以执行相应功能。
[0090]可见,当指定安卓应用中指定的类文件出现问题需要被修复时,依据图1所示的方法,直接获取包含指定安卓应用中的修复后的指定的类文件的补丁包,当安卓应用需要调用指定的类文件时,从该补丁包中调用相应的修复后的指定的类文件,实现了安卓应用的正常运行。与现有技术相比,该修复过程无需经历发布方重新打包指定安卓应用、测试、向各个应用市场和渠道换包、提示用户升级、提示用户下载、利用新安装包覆盖安装指定安卓应用等一系列步骤,在不改动原安卓应用的基础上,以补丁的方式动态修复安卓应用的紧急问题,极大地降低了安卓应用的修复成本。
[0091]在本发明的一个实施例中,步骤S120中加载所述补丁包包括:根据所述补丁包所在的文件目录,构造类加载器,通过该类加载器加载所述补丁包。例如,指定安卓应用中的某个执行文件中的指定的类文件a.class存在漏洞,为修复该漏洞,获取指定安卓应用的补丁包patch.dex,该patch.dex中包括经修复后的指定的类文件a.class,构造类加载器ClassLoader,通过 DexClassLoader 对象,将补丁包 patch.dex 加载进来。
[0092]在补丁包被加载之后,为了要让该补丁包发挥动态修复的功能,本方案要在指定安卓应用需要调用指定的类文件时,确保指定安卓应用调用的是补丁包中的指定的类文件,而不调用指定安卓应用中原有的执行文件中的指定的类文件。为实现这个目的,需要理解安卓系统的工作原理:
[0093]在安卓系统中,类加载器可以加载多个执行文件,该类加载器所加载的多个执行文件排列成一个有序的加载集合,该类加载器所加载的每个执行文件相当于是该加载集合中的一个元素,当这个加载集合中的不同的执行文件中有重复的类文件时,当需要调用该类文件时,系统会优先选择加载集合中的顺序在前的执行文件中的类文件进行调用。依据此原理,为了使得补丁包中的指定的类文件被优先选择调用,加载后的补丁包应当占据相应的加载集合中的排序在前的元素位置。
[0094]因此,在上述实施例的基础上,进一步地,步骤SI20中加载所述补丁包还包括:获取对所述补丁包进行加载的过程对应的第一加载集合,所述补丁包为该第一加载集合中的唯一元素;获取对指定安卓应用中的各执行文件进行加载的过程对应的第二加载集合,指定安卓应用中的各执行文件为该第二加载集合中的元素;将第一加载集合和第二加载集合合并为一个加载集合,使得所述补丁包作为该加载集合中的第一个元素。例如,对补丁包patch.dex进行加载的过程对应的第一加载集合为有序数组dexElementsl: {patch.dex},补丁包patch.dex中包含修复后的a.class,对指定安卓应用中的各原有的执行文件进行加载的过程对应的第二加载集合为有序数组dexElements2: {classes I.dex,classes2.dex,(:1388683.(161厂"},其中(31388682.(161中包含原有的未修复的3.(31388,有序数组dexElements2在指定安卓应用启动的时候即加载完成;在获取到补丁包patch.dex并进行加载之后,将有序数组dexElementsl和有序数组dexElementd合并为一个加载集合,使得补丁包patch.dex作为该加载集合的第一个元素,即加载集合为:{patch.dex,classes 1.dex ,classes2.dex, classes3.dex,...},这样在需要时安卓系统会优先选择调用patch.dex中的a.class来代替对classes2.dex中的a.class的调用。其中,具体地,可以利用安卓系统的反射机制通过调用DexUtils.1njectDexAtFirstO方法将补丁包插入到加载集合dexElements的最前面。
[0095]则图1所示方法的步骤S130当指定安卓应用需要调用指定的类文件时,从所述补丁包中调用修复后的指定的类文件以执行相应功能包括:当指定安卓应用需要调用一个类文件时,按照所述加载集合的元素顺序,依次从每个元素中查找所需要调用的类文件;如果查找到需要调用的类文件,停止查找,直接调用该类文件执行相应功能;如果未查找到需要调用的类文件,跳转到下一个元素查找需要调用的类文件,直至查找到为止。例如,利用上文例子中构建的加载集合{patch.dex,classes I.dex,c lasse s2.dex, classes3.dex,…},指定安卓应用在运行过程中,当需要调用一个类文件时,按照该加载集合的元素顺序,先从patch.dex中查找需要调用的类文件,未查找到则再从classesl.dex中查找需要调用的类文件,以此类推,直至查找到则停止查找;当指定安卓应用需要调用a.class时,以目前的加载集合的顺序,总归先从patch.dex开始查找a.class,保证补丁包中的修复后的类文件被调用。
[0096]依据上述实施方式,本方案将指定安卓应用中出现问题的类文件打包到一个dex文件中,得到一个补丁包patch.dex,通过加载、反射,将该patch.dex插入到ClassLoader对应的加载集合的最前面。在一个具体的实施例中,当调用补丁包中的指定的类a.class的时候,指定安卓应用的运行出现问题,原因在于:指定安卓应用调用原有的执行文件classes2.dex中的b.class,由于b.class引用了a.class,则指定安卓应用需要进一步调用
a.class,此时由于补丁包位于加载集合的前面,贝Ij直接调用补丁包patch.dex中的经修复后的 a.class,其中,b.class 弓 I 用了 a.class,b.class 在 classes2.dex 中,a.class 在patch.dex中,指定安卓应用调用的具有引用关系的两个类文件所在的执行文件不相同,安卓系统报错,调用失败。为解决该问题,本方案深入研究了安卓系统的运行机制,发现:安卓应用在调用类文件时,安卓系统对被调用的具有引用关系的类文件所在的执行文件是否相同进行检查的前提是:如果引用者(即上文例子中的b.class)这个类被打上了 CLASS_ISPREVERIFIED标识,那么安卓系统就会对该类文件与其所引用的类文件是否在同一个执行文件进行检查。
[0097]然而该CLASS_ISPREVERIFIED标识是在指定安卓应用启动时,安卓系统对指定安卓系统中的类文件是否都引用同一执行文件中的类文件进行校验后打上的,通常情况下未变动的安卓应用中的具有引用关系的类文件当然是满足这个校验条件的,因此都将被打上CLASS_ISPREVERIFIED标识。则为了避免在指定安卓应用调用补丁包中的类文件时报错,在本发明的一个实施例中,要防止指定安卓应用启动时各类文件被打上C L A S S _ISPREVERIFIED标识,图1所示的方法进一步包括:
[0098]在指定安卓应用启动之前,获取一个第三方执行文件,将该第三方执行文件放入指定安卓应用的指定文件目录中;在指定安卓应用的各执行文件中的各类文件中,注入指示该类文件对所述第三方执行文件进行引用的代码;在指定安卓应用启动时,先加载所述第三方文件,再加载指定安卓应用中的各执行文件。例如,获取一个第三方执行文件hack.dex,该第三方执行文件可以为空实现,将该hack.dex放入指定安卓应用的指定文件目录中,在指定安卓应用的所有类文件的构造函数里面均注入一段代码,该段代码指示类文件对hack, dex进行引用,在指定安卓应用启动时,先通过调用1adPatch方法将hack, dex动态加载进来,再加载指定安卓应用的各执行文件,这样,在安卓系统进行启动校验时,每个类文件对hack, dex有引用关系,hack.dex却与各类文件不在同一执行文件中,因此,各类文件不符合校验条件,不会被打上CLASS_ISPREVERIFIED标识,这样,在后续指定安卓应用调用补丁包中的类文件时就不会出现报错了。
[0099]上述过程中,在指定安卓应用的各执行文件中的各类文件中,注入指示该类文件对所述第三方执行文件进行引用的代码包括:设置一个排除列表;获取指定安卓应用中的每个类文件,判断该类文件是否命中所述排除列表,如果否,在该类文件中注入指示该类文件对所述第三方执行文件进行引用的代码;如果是,不在该类文件中注入代码。
[0?00]其中,Applicat1n作为安卓应用的入口,加载第三方执行文件hack.dex是在八卩卩1;^31:;[011中011063七6中执行的,即Appl icat1n是在加载第三方执行文件hack.dex之前已经被加载,如果在Applicat1n类文件的子类文件中注入指示引用第三方执行文件的代码,会导致第三方执行文件被标记为不存在,即使后续加载了hack.dex,也不能改变其不存在的标记,因此,不能在Applicat1n类的子类文件中注入所述代码,即所述排除列表中包括:指定安卓应用中的Appl icat1n类文件的子类文件。
[0101]则在本发明的一个实施例中,由于排除列表中的类文件中未注入指示引用第三方执行文件的代码,该类文件在安卓系统进行开启校验时必然被打上CLASS_ISPREVERIFIED标识,不能再通过调用补丁包中的相应类文件来对该类文件进行修复,即所述补丁包中的修复后的指定的类文件不包括所述排除列表中的类文件。
[0102]在本发明的一个实施例中,所述补丁包中的每个修复后的指定的类文件中包括:该修复后的指定的类文件的标识信息;则在从所述补丁包中调用修复后的指定的类文件执行相应功能之前,图1所示的方法进一步包括:判断该修复后的指定的类文件的标识信息与相应的指定的类文件的标识信息是否相同,是则调用该修复后的指定的类文件,否则停止调用该修复后的指定的类文件。可见,本实施例实质上通过类文件的唯一标识来对类文件进行确认,类文件的标识信息可以是该类文件的数字签名,如该类文件的MD5,在调用补丁包patch, dex中的经修复的a.class时,验证该经修复的a.class的MD5与指定安卓应用中的原有的a..class的MD5是否一致,是则,通过调用patch.dex中的a.class来代替对指定安卓应用中原有的a.class的调用,对出现问题的a.class进行修复。
[0103]在本发明的一个实施例中,所述补丁包中的每个修复后的指定的类文件中包括:该修复后的指定的类文件关于安卓应用的描述信息;则在从所述补丁包中调用修复后的指定的类文件执行相应功能之前,图1所示的方法进一步包括:判断指定安卓应用是否符合该修复后的指定的类文件关于安卓应用的描述信息,是则调用该修复后的指定的类文件,否则停止调用该修复后的指定的类文件。可见,本实施例实质上是通过补丁包中的类文件的关于安卓应用的描述信息来确认该补丁包的目标修复应用,补丁包中的类文件的关于安卓应用的描述信息可以是在类文件的头部注释的安卓应用的版本号、安卓应用的模块名称等。指定安卓应用在加载补丁包之后,如果判断出该补丁包中的类文件关于安卓应用的描述信息与指定安卓应用不一致,则将该加载的补丁包删除。
[0104]在本发明的一个实施例中,所述补丁包可以是在服务器生成并下发到本地的,所述补丁包也可以是在客户端本地生成的,视具体情况而定。以及,第三方执行文件可以是在服务器生成并下发到本地的,第三方执行文件也可以是在客户端本地生成的,视具体情况而定。
[0105]在本发明的一个实施例中,图1所示的方法进一步包括:如果指定安卓应用在启动后的预设时间内发生崩溃,卸载所述补丁包。例如,指定安卓应用启动后,加载补丁包patch.dex,通过调用patch.dex中的经修复的类文件来对指定安卓应用中的原类文件进行修复,然而,如果在启动后的20秒之内指定安卓应用发生崩溃,S卩认为是补丁包patch.dex所造成的,将该补丁包patch.dex删除,将指定安卓应用回滚到原来的状态。可见,本发明所提供的热修复技术对于安卓应用来说是可逆的。
[0106]图2示出了根据本发明另一个实施例一种安卓应用的热修复方法的流程图,从服务器侧说明本方案的实施过程。如图2所示,该方法包括:
[0107]步骤S210,生成修复后的指定安卓应用,获取修复后的指定安卓应用中的各类文件。
[0108]步骤S220,保留修复前的指定安卓应用,获取修复前的指定安卓应用中的各类文件。
[0109]步骤S230,将修复后的指定安卓应用中的各类文件与修复前的指定安卓应用中的各类文件进行比较。
[0110]步骤S240,对于每个类文件,如果该类文件的内容在修复前后发生变化,则该类文件为指定的类文件。
[0111]步骤S250,将各经修复的指定的类文件放入补丁文件中,生成补丁包。
[0112]其中,经修复的指定的类文件即是修复后的指定安卓应用中的指定的类文件。
[0113]步骤S260,将所述补丁包下发至客户端,由客户端加载所述补丁包以对指定安卓应用进行修复。
[0114]可见,图2所示的方法在服务器侧生成图1所示方法的各实施例中用到的补丁包,生成补丁包的原理是:比较修复前的指定安卓应用中的类文件和修复后的指定安卓应用中的类文件,对于同一个类文件,如果该类文件的内容在修复前后发生变化,说明该类文件在修复前出现了问题,修复后的指定安卓应用中的该类文件是经修复的类文件,对所有经过修复的类文件进行打包,生成补丁包,将生成的补丁包下发至客户端进行修复。与现有技术相比,本方案无需对修复后的指定安卓应用进行整体的打包、测试、渠道下发等,而是利用修复前后的指定安卓应用中的类文件的增量来定位需要进行捕捉的类文件,生成相应的补丁包,使得客户端利用该补丁包进行针对性地修复,十分省时省力,既符合开发需求,也能增强用户体验。
[0115]在本发明的一个实施例中,如果修复前的指定安卓应用中的类文件进行了混淆,则图2所示的方法进一步包括:保留修复前的指定安卓应用中的类文件的混淆映射关系;则步骤S230中将修复后的指定安卓应用中的各类文件与修复前的指定安卓应用中的各类文件进行比较包括:对于修复后的指定安卓应用中的每个类文件,根据所述混淆映射关系,确定对应的修复前的指定安卓应用中的类文件,比较类文件的内容在修复前后是否发生变化。例如,修复前的指定安卓应用中的类文件通过progard混淆器进行了混淆,生成一个类文件的混淆映射关系mapping,该mapping中指示了混淆前后类文件的变换关系,如mapping中指示了原a.class变换为X.class,原b.class变换为m.class,获取到修复后的指定安卓应用中的各类文件为:经修复的a.class、经修复的b.class,在对修复前后的a.class进行比较时,先要根据mapping获知X.class对应修复前的a.class,再判断修复前后的a.class的内容是否发生变化,对于b.class的比较同理,不再赘述。进一步地,在将补丁包下发到客户端后,在客户端对补丁包中的类文件进行查找调用时,需要根据mapping来确定与指定安卓应用中的混淆后的指定的类文件一致的补丁包中的经修复的指定的类文件。
[0116]在本发明的一个实施例中,如果修复前的指定安卓应用中的每个类文件的内容以MD5值表示,图2所示的方法进一步包括:计算修复后的指定安卓应用中的每个类文件的内容的MD5值;则步骤S230将修复后的指定安卓应用中的各类文件与修复前的指定安卓应用中的各类文件进行比较包括:对于修复后的指定安卓应用中的每个类文件,将该类文件的MD5值与相应的修复前的指定安卓应用中的类文件的MD5值进行比较。
[0117]图3示出了根据本发明一个实施例的一种安卓应用的热修复装置的示意图。如图3所示,该安卓应用的热修复装置300包括:
[0118]获取单元310,适于获取指定安卓应用的补丁包,所述补丁包中包括:指定安卓应用中的修复后的指定的类文件。
[0119]加载单元320,适于当指定安卓应用启动时,加载所述补丁包。
[0120]调用单元330,适于当指定安卓应用需要调用指定的类文件时,从所述补丁包中调用修复后的指定的类文件以执行相应功能。
[0121]可见,当指定安卓应用中指定的类文件出现问题需要被修复时,图3所示的装置直接获取包含指定安卓应用中的修复后的指定的类文件的补丁包,当安卓应用需要调用指定的类文件时,从该补丁包中调用相应的修复后的指定的类文件,实现了安卓应用的正常运行。与现有技术相比,该修复过程无需经历发布方重新打包指定安卓应用、测试、向各个应用市场和渠道换包、提示用户升级、提示用户下载、利用新安装包覆盖安装指定安卓应用等一系列步骤,在不改动原安卓应用的基础上,以补丁的方式动态修复安卓应用的紧急问题,极大地降低了安卓应用的修复成本。
[0122]在本发明的一个实施例中,所述加载单元310,适于根据所述补丁包所在的文件目录,构造类加载器,通过该类加载器加载所述补丁包。
[0123]进一步地,所述加载单元320,还适于获取对所述补丁包进行加载的过程对应的第一加载集合,所述补丁包为该第一加载集合中的唯一元素;获取对指定安卓应用中的各执行文件进行加载的过程对应的第二加载集合,指定安卓应用中的各执行文件为该第二加载集合中的元素;将第一加载集合和第二加载集合合并为一个加载集合,使得所述补丁包作为该加载集合中的第一个元素。
[0124]具体地,所述调用单元330,适于当指定安卓应用需要调用一个类文件时,按照所述加载集合的元素顺序,依次从每个元素中查找所需要调用的类文件;如果查找到需要调用的类文件,停止查找,直接调用该类文件执行相应功能;如果未查找到需要调用的类文件,跳转到下一个元素查找需要调用的类文件,直至查找到为止。
[0125]在本发明的一个实施例中,所述补丁包中的每个修复后的指定的类文件中包括:该修复后的指定的类文件的标识信息;则所述调用单元330,进一步适于在从所述补丁包中调用修复后的指定的类文件执行相应功能之前,判断该修复后的指定的类文件的标识信息与相应的指定的类文件的标识信息是否相同,是则调用该修复后的指定的类文件,否则停止调用该修复后的指定的类文件。
[0126]在本发明的一个实施例中,所述补丁包中的每个修复后的指定的类文件中包括:该修复后的指定的类文件关于安卓应用的描述信息;则所述调用单元330,进一步适于在从所述补丁包中调用修复后的指定的类文件执行相应功能之前,判断指定安卓应用是否符合该修复后的指定的类文件关于安卓应用的描述信息,是则调用该修复后的指定的类文件,否则停止调用该修复后的指定的类文件。
[0127]在本发明的一个实施例中,所述补丁包是在服务器生成并下发到本地的。
[0128]图4示出了根据本发明另一个实施例的一种安卓应用的热修复装置的示意图。如图4所示,该安卓应用的热修复装置400包括:获取单元410、加载单元420、调用单元430、预处理单元440和卸载单元450。
[0129]其中,获取单元410、加载单元420、调用单元430包含与图3所示的获取单元310、加载单元320、调用单元330对应相同的功能,相同的部分在此不再赘述。
[0130]预处理单元440,适于在指定安卓应用启动之前,获取一个第三方执行文件,将该第三方执行文件放入指定安卓应用的指定文件目录中;在指定安卓应用的各执行文件中的各类文件中,注入指示该类文件对所述第三方执行文件进行弓I用的代码。
[0131]加载单元420,进一步适于在指定安卓应用启动时,先加载所述第三方文件,再加载指定安卓应用中的各执行文件。
[0132]卸载单元450,适于当指定安卓应用在启动后的预设时间内发生崩溃时,卸载所述补丁包。
[0133]在一个具体的例子中,所述预处理单元440,适于设置一个排除列表;获取指定安卓应用中的每个类文件,判断该类文件是否命中所述排除列表,如果否,在该类文件中注入指示该类文件对所述第三方执行文件进行引用的代码;如果是,不在该类文件中注入代码。其中,所述排除列表中包括:指定安卓应用中的Applicat1n类文件的子类文件。
[0134]则在本实施例中,所述补丁包中的修复后的指定的类文件不包括所述排除列表中的类文件。
[0135]需要说明的是,图3-图4所示装置的各实施例与图1所示方法的各实施例对应相同,上文中已有详细说明,在此不再赘述。
[0136]图5示出了根据本发明一个实施例的一种安卓应用的热修复服务器的示意图。如图5所示,该安卓应用的热修复服务器500包括:
[0137]修复处理单元510,适于生成修复后的指定安卓应用,获取修复后的指定安卓应用中的各类文件;以及适于保留修复前的指定安卓应用,获取修复前的指定安卓应用中的各类文件。
[0138]补丁包生成单元520,适于将修复后的指定安卓应用中的各类文件与修复前的指定安卓应用中的各类文件进行比较;对于每个类文件,如果该类文件的内容在修复前后发生变化,则该类文件为指定的类文件;将各经修复的指定的类文件放入补丁文件中,生成补丁包。
[0139]补丁包下发单元530,适于将所述补丁包下发至客户端,由客户端加载所述补丁包以对指定安卓应用进行修复。
[0140]可见,图5所示的服务器生成前文各实施例中客户端用到的补丁包,生成补丁包的原理是:比较修复前的指定安卓应用中的类文件和修复后的指定安卓应用中的类文件,对于同一个类文件,如果该类文件的内容在修复前后发生变化,说明该类文件在修复前出现了问题,修复后的指定安卓应用中的该类文件是经修复的类文件,对所有经过修复的类文件进行打包,生成补丁包,将生成的补丁包下发至客户端进行修复。与现有技术相比,本方案无需对修复后的指定安卓应用进行整体的打包、测试、渠道下发等,而是利用修复前后的指定安卓应用中的类文件的增量来定位需要进行捕捉的类文件,生成相应的补丁包,使得客户端利用该补丁包进行针对性地修复,十分省时省力,既符合开发需求,也能增强用户体验。
[0141]在本发明的一个实施例中,修复处理单元510,进一步适于当修复前的指定安卓应用中的类文件进行了混淆时,保留修复前的指定安卓应用中的类文件的混淆映射关系;补丁包生成单元520,适于对于修复后的指定安卓应用中的每个类文件,根据所述混淆映射关系,确定对应的修复前的指定安卓应用中的类文件,比较类文件的内容在修复前后是否发生变化。
[0142]在本发明的一个实施例中,修复处理单元510,进一步适于当修复前的指定安卓应用中的每个类文件的内容以MD5值表示时,计算修复后的指定安卓应用中的每个类文件的内容的MD5值;补丁包生成单元520,适于对于修复后的指定安卓应用中的每个类文件,将该类文件的MD5值与相应的修复前的指定安卓应用中的类文件的MD5值进行比较。
[0143]需要说明的是,图5所示服务器的具体实施例与图2所示方法的各实施例对应相同,上文中已进行了详细说明,在此不再赘述。
[OH4]图6不出了根据本发明一个实施例的一种安卓应用的热修复系统的不意图。如图6所示,该安卓应用的热修复系统600包括:安卓应用的热修复装置610,以及,安卓应用的热修复服务器620。
[0145]其中,安卓应用的热修复装置610与上文中的安卓应用的热修复装置300/400具有相同的功能,安卓应用的热修复服务器620与上文中的安卓应用的热修复服务器500具有相同的功能,在此不再赘述。
[0146]综上所述,当指定安卓应用中指定的类文件出现问题需要被修复时,依据本发明提供的技术方案,直接获取包含指定安卓应用中的修复后的指定的类文件的补丁包,当安卓应用需要调用指定的类文件时,从该补丁包中调用相应的修复后的指定的类文件,实现了安卓应用的正常运行。与现有技术相比,该修复过程无需经历发布方重新打包指定安卓应用、测试、向各个应用市场和渠道换包、提示用户升级、提示用户下载、利用新安装包覆盖安装指定安卓应用等一系列步骤,在不改动原安卓应用的基础上,利用一个补丁包即可实现安卓应用的热修复,极大地降低了安卓应用的修复成本,且修复过程用户无感知,既符合开发需求,也符合用户需求。
[0147]需要说明的是:
[0148]在此提供的算法和显示不与任何特定计算机、虚拟装置或者其它设备固有相关。各种通用装置也可以与基于在此的示教一起使用。根据上面的描述,构造这类装置所要求的结构是显而易见的。此外,本发明也不针对任何特定编程语言。应当明白,可以利用各种编程语言实现在此描述的本发明的内容,并且上面对特定语言所做的描述是为了披露本发明的最佳实施方式。
[0149]在此处所提供的说明书中,说明了大量具体细节。然而,能够理解,本发明的实施例可以在没有这些具体细节的情况下实践。在一些实例中,并未详细示出公知的方法、结构和技术,以便不模糊对本说明书的理解。
[0150]类似地,应当理解,为了精简本公开并帮助理解各个发明方面中的一个或多个,在上面对本发明的示例性实施例的描述中,本发明的各个特征有时被一起分组到单个实施例、图、或者对其的描述中。然而,并不应将该公开的方法解释成反映如下意图:即所要求保护的本发明要求比在每个权利要求中所明确记载的特征更多的特征。更确切地说,如下面的权利要求书所反映的那样,发明方面在于少于前面公开的单个实施例的所有特征。因此,遵循【具体实施方式】的权利要求书由此明确地并入该【具体实施方式】,其中每个权利要求本身都作为本发明的单独实施例。
[0151]本领域那些技术人员可以理解,可以对实施例中的设备中的模块进行自适应性地改变并且把它们设置在与该实施例不同的一个或多个设备中。可以把实施例中的模块或单元或组件组合成一个模块或单元或组件,以及此外可以把它们分成多个子模块或子单元或子组件。除了这样的特征和/或过程或者单元中的至少一些是相互排斥之外,可以采用任何组合对本说明书(包括伴随的权利要求、摘要和附图)中公开的所有特征以及如此公开的任何方法或者设备的所有过程或单元进行组合。除非另外明确陈述,本说明书(包括伴随的权利要求、摘要和附图)中公开的每个特征可以由提供相同、等同或相似目的的替代特征来代替。
[0152]此外,本领域的技术人员能够理解,尽管在此所述的一些实施例包括其它实施例中所包括的某些特征而不是其它特征,但是不同实施例的特征的组合意味着处于本发明的范围之内并且形成不同的实施例。例如,在下面的权利要求书中,所要求保护的实施例的任意之一都可以以任意的组合方式来使用。
[0153]本发明的各个部件实施例可以以硬件实现,或者以在一个或者多个处理器上运行的软件模块实现,或者以它们的组合实现。本领域的技术人员应当理解,可以在实践中使用微处理器或者数字信号处理器(DSP)来实现根据本发明实施例的安卓应用的热修复装置、服务器和系统中的一些或者全部部件的一些或者全部功能。本发明还可以实现为用于执行这里所描述的方法的一部分或者全部的设备或者装置程序(例如,计算机程序和计算机程序产品)。这样的实现本发明的程序可以存储在计算机可读介质上,或者可以具有一个或者多个信号的形式。这样的信号可以从因特网网站上下载得到,或者在载体信号上提供,或者以任何其他形式提供。
[0154]应该注意的是上述实施例对本发明进行说明而不是对本发明进行限制,并且本领域技术人员在不脱离所附权利要求的范围的情况下可设计出替换实施例。在权利要求中,不应将位于括号之间的任何参考符号构造成对权利要求的限制。单词“包含”不排除存在未列在权利要求中的元件或步骤。位于元件之前的单词“一”或“一个”不排除存在多个这样的元件。本发明可以借助于包括有若干不同元件的硬件以及借助于适当编程的计算机来实现。在列举了若干装置的单元权利要求中,这些装置中的若干个可以是通过同一个硬件项来具体体现。单词第一、第二、以及第三等的使用不表示任何顺序。可将这些单词解释为名称。
[0155]本发明公开了Al、一种安卓应用的热修复方法,其中,该方法包括:
[0156]获取指定安卓应用的补丁包,所述补丁包中包括:指定安卓应用中的修复后的指定的类文件;
[0157]当指定安卓应用启动时,加载所述补丁包;
[0158]当指定安卓应用需要调用指定的类文件时,从所述补丁包中调用修复后的指定的类文件以执行相应功能。
[0159]A2、如Al所述的方法,其中,加载所述补丁包包括:
[0160]根据所述补丁包所在的文件目录,构造类加载器,通过该类加载器加载所述补丁包。
[0161]A3、如A2所述的方法,其中,所述加载所述补丁包还包括:
[0162]获取对所述补丁包进行加载的过程对应的第一加载集合,所述补丁包为该第一加载集合中的唯一元素;
[0163]获取对指定安卓应用中的各执行文件进行加载的过程对应的第二加载集合,指定安卓应用中的各执行文件为该第二加载集合中的元素;
[0164]将第一加载集合和第二加载集合合并为一个加载集合,使得所述补丁包作为该加载集合中的第一个元素。
[0165]A4、如A3所述的方法,其中,所述当指定安卓应用需要调用指定的类文件时,从所述补丁包中调用修复后的指定的类文件以执行相应功能包括:
[0166]当指定安卓应用需要调用一个类文件时,按照所述加载集合的元素顺序,依次从每个元素中查找所需要调用的类文件;
[0167]如果查找到需要调用的类文件,停止查找,直接调用该类文件执行相应功能;
[0168]如果未查找到需要调用的类文件,跳转到下一个元素查找需要调用的类文件,直至查找到为止。
[0169]A5、如Al所述的方法,其中,该方法进一步包括:
[0170]在指定安卓应用启动之前,获取一个第三方执行文件,将该第三方执行文件放入指定安卓应用的指定文件目录中;在指定安卓应用的各执行文件中的各类文件中,注入指示该类文件对所述第三方执行文件进行引用的代码;
[0171]在指定安卓应用启动时,先加载所述第三方文件,再加载指定安卓应用中的各执行文件。
[0172]A6、如A5所述的方法,其中,所述在指定安卓应用的各执行文件中的各类文件中,注入指示该类文件对所述第三方执行文件进行引用的代码包括:
[0173]设置一个排除列表;
[0174]获取指定安卓应用中的每个类文件,判断该类文件是否命中所述排除列表,如果否,在该类文件中注入指示该类文件对所述第三方执行文件进行引用的代码;如果是,不在该类文件中注入代码。
[0175]A7、如A6所述的方法,其中,所述排除列表中包括:
[ΟΙ76]指定安卓应用中的Appl icat1n类文件的子类文件。
[0177]A8、如A6所述的方法,其中,
[0178]所述补丁包中的修复后的指定的类文件不包括所述排除列表中的类文件。
[0179]A9、如Al所述的方法,其中,
[0180]所述补丁包中的每个修复后的指定的类文件中包括:该修复后的指定的类文件的标识信息;
[0181]则在从所述补丁包中调用修复后的指定的类文件执行相应功能之前,该方法进一步包括:判断该修复后的指定的类文件的标识信息与相应的指定的类文件的标识信息是否相同,是则调用该修复后的指定的类文件,否则停止调用该修复后的指定的类文件。
[0182]A10、如Al所述的方法,其中,
[0183]所述补丁包中的每个修复后的指定的类文件中包括:该修复后的指定的类文件关于安卓应用的描述信息;
[0184]则在从所述补丁包中调用修复后的指定的类文件执行相应功能之前,该方法进一步包括:判断指定安卓应用是否符合该修复后的指定的类文件关于安卓应用的描述信息,是则调用该修复后的指定的类文件,否则停止调用该修复后的指定的类文件。
[0185]Al 1、如Al所述的方法,其中,
[0186]所述补丁包是在服务器生成并下发到本地的。
[0187]Al 2、如Al所述的方法,其中,该方法进一步包括:
[0188]如果指定安卓应用在启动后的预设时间内发生崩溃,卸载所述补丁包。
[0189]本发明还公开了B13、一种安卓应用的热修复方法,其中,该方法包括:
[0190]生成修复后的指定安卓应用,获取修复后的指定安卓应用中的各类文件;
[0191]保留修复前的指定安卓应用,获取修复前的指定安卓应用中的各类文件;
[0192]将修复后的指定安卓应用中的各类文件与修复前的指定安卓应用中的各类文件进行比较;
[0193]对于每个类文件,如果该类文件的内容在修复前后发生变化,则该类文件为指定的类文件;
[0194]将各经修复的指定的类文件放入补丁文件中,生成补丁包;
[0195]将所述补丁包下发至客户端,由客户端加载所述补丁包以对指定安卓应用进行修复。
[0196]B14、如B13所述的方法,其中,如果修复前的指定安卓应用中的类文件进行了混淆,则该方法进一步包括:保留修复前的指定安卓应用中的类文件的混淆映射关系;
[0197]所述将修复后的指定安卓应用中的各类文件与修复前的指定安卓应用中的各类文件进行比较包括:
[0198]对于修复后的指定安卓应用中的每个类文件,根据所述混淆映射关系,确定对应的修复前的指定安卓应用中的类文件,比较类文件的内容在修复前后是否发生变化。
[0199]B15、如B13或B14所述的方法,其中,如果修复前的指定安卓应用中的每个类文件的内容以MD5值表示,该方法进一步包括:计算修复后的指定安卓应用中的每个类文件的内容的MD5值;
[0200]则所述将修复后的指定安卓应用中的各类文件与修复前的指定安卓应用中的各类文件进行比较包括:对于修复后的指定安卓应用中的每个类文件,将该类文件的MD5值与相应的修复前的指定安卓应用中的类文件的MD5值进行比较。
[0201]本发明还公开了C16、一种安卓应用的热修复装置,其中,该装置包括:
[0202]获取单元,适于获取指定安卓应用的补丁包,所述补丁包中包括:指定安卓应用中的修复后的指定的类文件;
[0203]加载单元,适于当指定安卓应用启动时,加载所述补丁包;
[0204]调用单元,适于当指定安卓应用需要调用指定的类文件时,从所述补丁包中调用修复后的指定的类文件以执行相应功能。
[0205]C17、如C16所述的装置,其中,
[0206]所述加载单元,适于根据所述补丁包所在的文件目录,构造类加载器,通过该类加载器加载所述补丁包。
[0207]C18、如C17所述的装置,其中,
[0208]所述加载单元,还适于获取对所述补丁包进行加载的过程对应的第一加载集合,所述补丁包为该第一加载集合中的唯一元素;获取对指定安卓应用中的各执行文件进行加载的过程对应的第二加载集合,指定安卓应用中的各执行文件为该第二加载集合中的元素;将第一加载集合和第二加载集合合并为一个加载集合,使得所述补丁包作为该加载集合中的第一个元素。
[0209]C19、如C18所述的装置,其中,
[0210]所述调用单元,适于当指定安卓应用需要调用一个类文件时,按照所述加载集合的元素顺序,依次从每个元素中查找所需要调用的类文件;如果查找到需要调用的类文件,停止查找,直接调用该类文件执行相应功能;如果未查找到需要调用的类文件,跳转到下一个元素查找需要调用的类文件,直至查找到为止。
[0211]C20、如C16所述的装置,其中,该装置进一步包括:预处理单元;
[0212]预处理单元,适于在指定安卓应用启动之前,获取一个第三方执行文件,将该第三方执行文件放入指定安卓应用的指定文件目录中;在指定安卓应用的各执行文件中的各类文件中,注入指示该类文件对所述第三方执行文件进行引用的代码;
[0213]所述加载单元,进一步适于在指定安卓应用启动时,先加载所述第三方文件,再加载指定安卓应用中的各执行文件。
[0214]C21、如C20所述的装置,其中,
[0215]所述预处理单元,适于设置一个排除列表;获取指定安卓应用中的每个类文件,判断该类文件是否命中所述排除列表,如果否,在该类文件中注入指示该类文件对所述第三方执行文件进行引用的代码;如果是,不在该类文件中注入代码。
[0216]C22、如C21所述的装置,其中,所述排除列表中包括:
[02M] 指定安卓应用中的Appl icat1n类文件的子类文件。
[0218]C23、如C21所述的装置,其中,
[0219]所述补丁包中的修复后的指定的类文件不包括所述排除列表中的类文件。
[0220]C24、如C16所述的装置,其中,
[0221]所述补丁包中的每个修复后的指定的类文件中包括:该修复后的指定的类文件的标识信息;
[0222]则所述调用单元,进一步适于在从所述补丁包中调用修复后的指定的类文件执行相应功能之前,判断该修复后的指定的类文件的标识信息与相应的指定的类文件的标识信息是否相同,是则调用该修复后的指定的类文件,否则停止调用该修复后的指定的类文件。
[0223]C25、如C16所述的装置,其中,
[0224]所述补丁包中的每个修复后的指定的类文件中包括:该修复后的指定的类文件关于安卓应用的描述信息;
[0225]则所述调用单元,进一步适于在从所述补丁包中调用修复后的指定的类文件执行相应功能之前,判断指定安卓应用是否符合该修复后的指定的类文件关于安卓应用的描述信息,是则调用该修复后的指定的类文件,否则停止调用该修复后的指定的类文件。
[0226]C26、如C16所述的装置,其中,
[0227]所述补丁包是在服务器生成并下发到本地的。
[0228]C27、如C16所述的装置,其中,该装置进一步包括:
[0229]卸载单元,适于当指定安卓应用在启动后的预设时间内发生崩溃时,卸载所述补丁包。
[0230]本发明还公开了D28、一种安卓应用的热修复服务器,其中,该服务器包括:
[0231]修复处理单元,适于生成修复后的指定安卓应用,获取修复后的指定安卓应用中的各类文件;以及适于保留修复前的指定安卓应用,获取修复前的指定安卓应用中的各类文件;
[0232]补丁包生成单元,适于将修复后的指定安卓应用中的各类文件与修复前的指定安卓应用中的各类文件进行比较;对于每个类文件,如果该类文件的内容在修复前后发生变化,则该类文件为指定的类文件;将各经修复的指定的类文件放入补丁文件中,生成补丁包;
[0233]补丁包下发单元,适于将所述补丁包下发至客户端,由客户端加载所述补丁包以对指定安卓应用进行修复。
[0234]D29、如D28所述的服务器,其中,
[0235]所述修复处理单元,进一步适于当修复前的指定安卓应用中的类文件进行了混淆时,保留修复前的指定安卓应用中的类文件的混淆映射关系;
[0236]所述补丁包生成单元,适于对于修复后的指定安卓应用中的每个类文件,根据所述混淆映射关系,确定对应的修复前的指定安卓应用中的类文件,比较类文件的内容在修复前后是否发生变化。
[0237]D30、如D28或D29所述的服务器,其中,
[0238]所述修复处理单元,进一步适于当修复前的指定安卓应用中的每个类文件的内容以MD5值表示时,计算修复后的指定安卓应用中的每个类文件的内容的MD5值;
[0239]所述补丁包生成单元,适于对于修复后的指定安卓应用中的每个类文件,将该类文件的MD5值与相应的修复前的指定安卓应用中的类文件的MD5值进行比较。
[0240]本发明还公开了E31、一种安卓应用的热修复系统,其中,该系统包括:如C16-C27中任一项所述的装置,以及,如D28-D30中任一项所述的服务器。
【主权项】
1.一种安卓应用的热修复方法,其中,该方法包括: 获取指定安卓应用的补丁包,所述补丁包中包括:指定安卓应用中的修复后的指定的类文件; 当指定安卓应用启动时,加载所述补丁包; 当指定安卓应用需要调用指定的类文件时,从所述补丁包中调用修复后的指定的类文件以执行相应功能。2.如权利要求1所述的方法,其中,加载所述补丁包包括: 根据所述补丁包所在的文件目录,构造类加载器,通过该类加载器加载所述补丁包。3.如权利要求2所述的方法,其中,所述加载所述补丁包还包括: 获取对所述补丁包进行加载的过程对应的第一加载集合,所述补丁包为该第一加载集合中的唯一元素; 获取对指定安卓应用中的各执行文件进行加载的过程对应的第二加载集合,指定安卓应用中的各执行文件为该第二加载集合中的元素; 将第一加载集合和第二加载集合合并为一个加载集合,使得所述补丁包作为该加载集合中的第一个元素。4.一种安卓应用的热修复方法,其中,该方法包括: 生成修复后的指定安卓应用,获取修复后的指定安卓应用中的各类文件; 保留修复前的指定安卓应用,获取修复前的指定安卓应用中的各类文件; 将修复后的指定安卓应用中的各类文件与修复前的指定安卓应用中的各类文件进行比较; 对于每个类文件,如果该类文件的内容在修复前后发生变化,则该类文件为指定的类文件; 将各经修复的指定的类文件放入补丁文件中,生成补丁包; 将所述补丁包下发至客户端,由客户端加载所述补丁包以对指定安卓应用进行修复。5.如权利要求4所述的方法,其中,如果修复前的指定安卓应用中的类文件进行了混淆,则该方法进一步包括:保留修复前的指定安卓应用中的类文件的混淆映射关系; 所述将修复后的指定安卓应用中的各类文件与修复前的指定安卓应用中的各类文件进行比较包括: 对于修复后的指定安卓应用中的每个类文件,根据所述混淆映射关系,确定对应的修复前的指定安卓应用中的类文件,比较类文件的内容在修复前后是否发生变化。6.一种安卓应用的热修复装置,其中,该装置包括: 获取单元,适于获取指定安卓应用的补丁包,所述补丁包中包括:指定安卓应用中的修复后的指定的类文件; 加载单元,适于当指定安卓应用启动时,加载所述补丁包; 调用单元,适于当指定安卓应用需要调用指定的类文件时,从所述补丁包中调用修复后的指定的类文件以执行相应功能。7.如权利要求6所述的装置,其中, 所述加载单元,适于根据所述补丁包所在的文件目录,构造类加载器,通过该类加载器加载所述补丁包。8.一种安卓应用的热修复服务器,其中,该服务器包括: 修复处理单元,适于生成修复后的指定安卓应用,获取修复后的指定安卓应用中的各类文件;以及适于保留修复前的指定安卓应用,获取修复前的指定安卓应用中的各类文件; 补丁包生成单元,适于将修复后的指定安卓应用中的各类文件与修复前的指定安卓应用中的各类文件进行比较;对于每个类文件,如果该类文件的内容在修复前后发生变化,则该类文件为指定的类文件;将各经修复的指定的类文件放入补丁文件中,生成补丁包; 补丁包下发单元,适于将所述补丁包下发至客户端,由客户端加载所述补丁包以对指定安卓应用进行修复。9.如权利要求8所述的服务器,其中, 所述修复处理单元,进一步适于当修复前的指定安卓应用中的类文件进行了混淆时,保留修复前的指定安卓应用中的类文件的混淆映射关系; 所述补丁包生成单元,适于对于修复后的指定安卓应用中的每个类文件,根据所述混淆映射关系,确定对应的修复前的指定安卓应用中的类文件,比较类文件的内容在修复前后是否发生变化。10.—种安卓应用的热修复系统,其中,该系统包括:如权利要求6-7中任一项所述的装置,以及,如权利要求8-9中任一项所述的服务器。
【文档编号】G06F9/445GK106095502SQ201610411014
【公开日】2016年11月9日
【申请日】2016年6月13日 公开号201610411014.1, CN 106095502 A, CN 106095502A, CN 201610411014, CN-A-106095502, CN106095502 A, CN106095502A, CN201610411014, CN201610411014.1
【发明人】刘刚, 王楠
【申请人】北京奇虎科技有限公司, 奇智软件(北京)有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1