著录项信息
专利名称 | APK文件的快速加载方法 |
申请号 | CN201510657289.9 | 申请日期 | 2015-10-12 |
法律状态 | 授权 | 申报国家 | 中国 |
公开/公告日 | 2016-01-27 | 公开/公告号 | CN105278989A |
优先权 | 暂无 | 优先权号 | 暂无 |
主分类号 | G06F9/445 | IPC分类号 | G;0;6;F;9;/;4;4;5查看分类表>
|
申请人 | 邱寅峰 | 申请人地址 | 北京市海淀区上地信息路26号9层0921室
变更
专利地址、主体等相关变化,请及时变更,防止失效 |
权利人 | 北京顶象技术有限公司 | 当前权利人 | 北京顶象技术有限公司 |
发明人 | 邱寅峰;泮晓波 |
代理机构 | 常州市权航专利代理有限公司 | 代理人 | 袁兴隆 |
摘要
本发明提供了一种APK文件的快速加载方法,包括以下步骤:S1、解压所述APK文件并提取其中的DEX文件,将所述DEX文件压缩成JAR文件,其中所述DEX文件的数量为多个,文件名分别为classes2.dex,classes3.dex,…classesN.dex;S2、初始化一个VM(虚拟机),所述VM将至少一个所述DEX文件制作成ODEX文件,并且在ODEX文件的制作过程中对DEX文件中包含的零个类进行验证和优化;S3、所述VM调用函数DexFile.loadDex()加载所述ODEX文件,这种APK文件的快速加载方法在制作ODEX文件时省略了验证和优化的过程,而是将验证和优化的过程安排在加载ODEX文件发生异常时进行,不仅能够将DEX文件更快地加载到操作系统中,应用启动快,界面显示及时,提升了用户体验,而且不会影响应用软件的正常运行,机器性能也得到更好的发挥。
1.一种APK文件的快速加载方法,其特征在于:包括以下步骤:
S1、解压所述APK文件并提取其中的DEX文件,将所述DEX文件压缩成JAR文件,其中所述DEX文件的数量为多个,文件名分别为classes2.dex,classes3.dex,…classesN.dex;
S2、初始化一个VM(虚拟机),所述VM将至少一个所述DEX文件制作成ODEX文件,并且在ODEX文件的制作过程中对DEX文件中包含的所有类均不进行验证和优化;
S3、所述VM调用函数DexFile.loadDex()加载所述ODEX文件。
2.如权利要求1所述的APK文件的快速加载方法,其特征在于:在所述步骤S3中,如果一个ODEX文件在加载时出现异常,所述VM则对此ODEX文件中包含的所有类进行验证,寻找非法指令序列。
3.如权利要求2所述的APK文件的快速加载方法,其特征在于:在所述步骤S3中,如果加载时出现异常的ODEX文件通过验证,所述VM则对此ODEX文件进行优化。
4.如权利要求1所述的APK文件的快速加载方法,其特征在于:所述VM为Dalvik VM,在所述步骤S2中,所述Dalvik VM调用函数dexopt将DEX文件制作成ODEX文件。
5.如权利要求4所述的APK文件的快速加载方法,其特征在于:在所述步骤S3中,如果一个ODEX文件在加载时出现异常,所述Dalvik VM调用函数dexopt对此ODEX文件中包含的所有类进行验证,寻找非法指令序列。
6.如权利要求5所述的APK文件的快速加载方法,其特征在于:如果加载时出现异常的ODEX文件通过验证,所述Dalvik VM调用函数dexopt对此ODEX文件进行优化。
7.如权利要求1所述的APK文件的快速加载方法,其特征在于:所述VM为ART VM,在所述步骤S2中,所述ART VM调用函数dex2oat将DEX文件制作成ODEX文件。
8.如权利要求7所述的APK文件的快速加载方法,其特征在于:在所述步骤S3中,如果一个ODEX文件在加载时出现异常,所述ART VM调用函数dex2oat对此ODEX文件中包含的所有类进行验证,寻找非法指令序列。
9.如权利要求8所述的APK文件的快速加载方法,其特征在于:如果加载时出现异常的ODEX文件通过验证,所述ART VM调用函数dex2oat对此ODEX文件进行优化。
10.如权利要求1~9任一项所述的APK文件的快速加载方法,其特征在于:在所述APK文件的文件结构中所述文件classes2.dex,classes3.dex,…classesN.dex分别对应一个Central directory file、一个Local file header和一个数据内容,在所述步骤S1中,所述文件classes2.dex压缩成JAR文件的具体步骤为:首先复制所述文件classes2.dex对应的Central directory file、Local file header和数据内容并且将它们构成JAR文件的文件结构,然后将Central directory file中的文件名修改为classes.dex,最后调整Central directory file中的指针指向Local file header;
所述文件classes3.dex,classes4.dex…classesN.dex压缩成JAR文件的具体步骤与所述文件classes2.dex压缩成JAR文件的具体步骤一致。
APK文件的快速加载方法\n技术领域\n[0001] 本发明涉及移动终端应用软件技术领域,尤其涉及一种APK文件的快速加载方法。\n背景技术\n[0002] APK(Android PacKage)的缩写即Android安装包。将APK文件(即APK应用程序)直\n接传到Android模拟器或Android操作系统的终端设备(比如安卓智能手机)中执行即可安\n装。APK文件其实是zip格式,但后缀名被修改为apk,在windows系统上可以通过解压缩工具\n(比如winrar软件)直接解压查看。解压APK文件后,一般的可看到的目录\n[0003] 结构如下表所示:\n[0004]\n[0005] 其中classes.dex文件内包含可执行代码,较早的Android操作系统版本只支持一\n个DEX文件,但是随着硬件性能提高,应用的执行代码越来越庞大,一个DEX文件已经无法满\n足需求,所以在最新的Android5.0版操作系统中原生支持加载多个DEX文件(classes.dex,\nclasses2.dex,…classesN.dex)。现有的多DEX加载方案的工作流程如下:\n[0006] 1)启动时检查当前Android系统的版本,如果大于Android5.0版本,流程结束,否\n则进入下一步;\n[0007] 2)遍历APK文件中所包含的文件,找到所包含的DEX文件。因为Android系统只能加\n载JAR文件(文件名以“.jar”结尾的ZIP文件,里面包含classes.dex),所以将APK中的DEX文\n件解压后重新压缩成ZIP文件。\n[0008] 3)对解压出的DEX文件逐个调用Android系统提供的DexFile.loadDex()函数,将\nDEX加载到系统,并添加到已加载DEX的列表中。\n[0009] 这种加载方式消耗的时间过长,导致应用启动缓慢,长时间无法显示出界面,用户\n体验差。\n发明内容\n[0010] 本发明要解决的技术问题是:为了解决现有的APK文件的加载方法消耗的时间过\n长,导致应用启动缓慢,长时间无法显示出界面,用户体验差的问题,本发明提供了一种APK\n文件的快速加载方法来解决上述问题。\n[0011] 本发明解决其技术问题所采用的技术方案是:一种APK文件的快速加载方法,包括\n以下步骤:\n[0012] S1、解压所述APK文件并提取其中的DEX文件,将所述DEX文件压缩成JAR文件,其中\n所述DEX文件的数量为多个,文件名分别为classes2.dex,classes3.dex,…classesN.dex;\n[0013] S2、初始化一个VM(虚拟机),所述VM将至少一个所述DEX文件制作成ODEX文件,并\n且在ODEX文件的制作过程中对DEX文件中包含的零个类进行验证和优化;\n[0014] S3、所述VM调用函数DexFile.loadDex()加载所述ODEX文件。\n[0015] 作为优选,在所述步骤S3中,如果一个ODEX文件在加载时出现异常,所述VM则对此\nODEX文件中包含的所有类进行验证,寻找非法指令序列。\n[0016] 作为优选,在所述步骤S3中,如果加载时出现异常的ODEX文件通过验证,所述VM则\n对此ODEX文件进行优化。\n[0017] 作为优选,所述VM为Dalvik VM,在所述步骤S2中,所述Dalvik VM调用函数dexopt\n将DEX文件制作成ODEX文件。\n[0018] 作为优选,在所述步骤S3中,如果一个ODEX文件在加载时出现异常,所述Dalvik \nVM调用函数dexopt对此ODEX文件中包含的所有类进行验证,寻找非法指令序列。\n[0019] 作为优选,如果加载时出现异常的ODEX文件通过验证,所述Dalvik VM调用函数\ndexopt对此ODEX文件进行优化。\n[0020] 作为优选,所述VM为ART VM,在所述步骤S2中,所述ART VM调用函数dex2oat将DEX\n文件制作成ODEX文件。\n[0021] 作为优选,在所述步骤S3中,如果一个ODEX文件在加载时出现异常,所述ART VM调\n用函数dex2oat对此ODEX文件中包含的所有类进行验证,寻找非法指令序列。\n[0022] 作为优选,如果加载时出现异常的ODEX文件通过验证,所述ART VM调用函数\ndex2oat对此ODEX文件进行优化。\n[0023] 作为优选,在所述APK文件的文件结构中所述文件\n[0024] classes2.dex,classes3.dex,…classesN.dex分别对应一个Central directory \nfile、一个Local file header和一个数据内容,在所述步骤S1中,所述文件classes2.dex\n压缩成JAR文件的具体步骤为:首先复制所述文件classes2.dex对应的Central directory \nfile、Local file header和数据内容并且将它们构成JAR文件的文件结构,然后将Central \ndirectory file中的文件名修改为classes.dex,最后调整Central directory file中的\n指针指向Local file header;\n[0025] 所述文件classes3.dex,classes4.dex…classesN.dex压缩成JAR文件的具体步\n骤与所述文件classes2.dex压缩成JAR文件的具体步骤一致。\n[0026] 本发明的有益效果是,这种APK文件的快速加载方法在制作ODEX文件时省略了验\n证和优化的过程,而是将验证和优化的过程安排在加载ODEX文件发生异常时进行,不仅能\n够将DEX文件更快地加载到操作系统中,减少加载所消耗的时间,应用启动快,界面显示及\n时,提升了用户体验,而且不会影响应用软件的正常运行,机器性能也得到更好的发挥。\n附图说明\n[0027] 下面结合附图和实施例对本发明进一步说明。\n[0028] 图1是本发明的一种APK文件的快速加载方法的实施例一的流程图。\n[0029] 图2是本发明的一种APK文件的快速加载方法的实施例四的流程图。\n具体实施方式\n[0030] 下面详细描述本发明的实施例,所述实施例的示例在附图中示出,其中自始至终\n相同或类似的标号表示相同或类似的元件或具有相同或类似功能的元件。下面通过参考附\n图描述的实施例是示例性的,仅用于解释本发明,而不能理解为对本发明的限制。相反,本\n发明的实施例包括落入所附加权利要求书的精神和内涵范围内的所有变化、修改和等同\n物。\n[0031] 在本发明的描述中,需要理解的是,术语“中心”、“纵向”、“横向”、“长度”、“宽度”、“厚度”、“上”、“下”、“前”、“后”、“左”、“右”、“竖直”、“水平”、“顶”、“底”“内”、“外”、“轴向”、“径向”、“周向”等指示的方位或位置关系为基于附图所示的方位或位置关系,仅是为了便\n于描述本发明和简化描述,而不是指示或暗示所指的装置或元件必须具有特定的方位、以\n特定的方位构造和操作,因此不能理解为对本发明的限制。\n[0032] 此外,术语“第一”、“第二”等仅用于描述目的,而不能理解为指示或暗示相对重要\n性。在本发明的描述中,需要说明的是,除非另有明确的规定和限定,术语“相连”、“连接”应\n做广义理解,例如,可以是固定连接,也可以是可拆卸连接,或一体地连接;可以是机械连\n接,也可以是电连接;可以是直接相连,也可以通过中间媒介间接相连。对于本领域的普通\n技术人员而言,可以具体情况理解上述术语在本发明中的具体含义。此外,在本发明的描述\n中,除非另有说明,“多个”的含义是两个或两个以上。\n[0033] 流程图中或在此以其他方式描述的任何过程或方法描述可以被理解为,表示包括\n一个或更多个用于实现特定逻辑功能或过程的步骤的可执行指令的代码的模块、片段或部\n分,并且本发明的优选实施方式的范围包括另外的实现,其中可以不按所示出或讨论的顺\n序,包括根据所涉及的功能按基本同时的方式或按相反的顺序,来执行功能,这应被本发明\n的实施例所属技术领域的技术人员所理解。\n[0034] 实施例一,\n[0035] 如图1所示,本发明提供了一种APK文件的快速加载方法,包括以下步骤:\n[0036] S1、解压APK文件并提取其中的DEX文件,将DEX文件压缩成JAR文件,其中DEX文件\n的数量为多个,文件名分别为classes2.dex,classes3.dex,…classesN.dex;\n[0037] S2、初始化一个VM(虚拟机),VM将至少一个DEX文件制作成ODEX文件,并且在ODEX\n文件的制作过程中对DEX文件中包含的零个类进行验证和优化;\n[0038] S3、VM调用函数DexFile.loadDex()加载ODEX文件。\n[0039] VM调用函数DexFile.loadDex()加载DEX文件时,首先会检查DEX文件对应的ODEX\n文件是否已经存在,如果已经存在则直接进行加载。现有技术中ODEX文件的制作过程中最\n主要的是验证和优化的DEX,其中验证过程涉及到每个DEX文件中的所有类和类中的所有方\n法中的指令,目标是检查非法指令序列,验证通过再进行优化,优化和验证虽然可以保证程\n序安全高效的运行,但是它们也是最消耗性能,导致应用长时间无法响应,降低用户体验原\n因所在;其实DEX文件不经过验证和优化也可以正常执行,因此本发明的提供一种APK文件\n的快速加载方法在VM调用函数DexFile.loadDex()加载ODEX文件之前快速制作ODEX文件,\n其中通过自定义参数在ODEX文件的制作过程中取消了验证和优化两个步骤,进而大大降低\n了加载DEX文件所消耗的时间。\n[0040] 前期省略了验证和优化两个步骤可能会导致程序在运行时出现异常状态,如果一\n个ODEX文件在加载时出现异常,VM则对此ODEX文件中包含的所有类进行验证,寻找非法指\n令序列;如果验证不通过,说明ODEX文件中有非法指令序列,则产出错误报告,如果ODEX文\n件通过验证,说明不存在非法指令,那么考虑到有些大型应用软件对硬件配置的要求较高,\n而机器本身硬件上的不足,在执行未优化的ODEX文件时较为吃力,那么VM则对此ODEX文件\n进行优化。\n[0041] 实施例二,\n[0042] 在Dalvik运行模式下,虚拟机为Dalvik VM,在步骤S2中,Dalvik VM调用函数\ndexopt将DEX文件制作成ODEX文件,而在步骤S3中,如果一个ODEX文件在加载时出现异常,\nDalvik VM调用函数dexopt对此ODEX文件中包含的所有类进行验证,寻找非法指令序列,如\n果加载时出现异常的ODEX文件通过验证,Dalvik VM调用函数dexopt对此ODEX文件进行优\n化。Dalvik VM做的优化主要包含下面这些:\n[0043] 1)对于虚方法的调用,把方法索引修改成vtable索引。\n[0044] 2)把field的get/put修改成字节偏移量。把boolean/byte/char/short等类型的\n变量合并到一个32‐bit的形式,更少的代码可以更有效地利用CPU的I‐cache。\n[0045] 3)把一些大量使用的简单方法进行inline,这样能减少方法调用的开销。\n[0046] 4)删除空方法。\n[0047] 5)加入一些计算好的数据,比如,Dalvik VM需要一个hash table来查找类名字,\n我们就可以在优化阶段进行计算,不用放到DEX加载的时候了。\n[0048] 实施例三,\n[0049] Google在Android4.4中新增加了ART(Android Run Time)用来替代之前的\nDalvik,在ART的运行模式下,VM为ART VM,在步骤S2中,ART VM调用函数dex2oat将DEX文件\n制作成ODEX文件;在步骤S3中,如果一个ODEX文件在加载时出现异常,ART VM调用函数\ndex2oat对此ODEX文件中包含的所有类进行验证,寻找非法指令序列;如果加载时出现异常\n的ODEX文件通过验证,ART VM调用函数dex2oat对此ODEX文件进行优化。ART VM与Dalvik \nVM不同之处在于,Dalvik VM执行的是DEX字节码,这意味着Dalvik VM包含有一个解释器,\n用来执行DEX字节码,Dalvik VM在运行时动态地将执行频率很高的DEX字节码翻译成本地\n机器码,然后再执行;ART VM执行的是本地机器码,而将DEX文件翻译成本地机器码的过程\n正是调用函数dex2oat对DEX文件进行优化的过程,一般在应用软件进行安装和系统启动\n时,ART VM会对APK文件中的主DEX文件(一般是classes.dex)进行翻译,其余的与Dalvik环\n境下DEX文件的加载方式类似,是在应用软件运行时才会进行翻译。\n[0050] 实施例四,\n[0051] 应用软件启动慢,界面显示不及时的另外一个原因在于现有的方案中,先将DEX文\n件从APK文件中解压出来,然后又重新压缩成JAR文件,解压与压缩消耗了大量性能;因为\nAPK和JAR都是属于ZIP文件,具有类似的文件结构,具体来说,ZIP文件结构主要包括索引区\n域和内容区域,ZIP文件中的每一个文件都对应索引区域中的一个Central directory \nfile header(中央目录文件头),Central directory file header描述的基本信息如文件\n名、文件原始大小、压缩方式、压缩后大小、校验和等,另外这个结构还包含一个指针,指向\n内容区域的Local file header(局部文件头),Local file header同样包含的文件的基本\n信息,紧随其后的是压缩过的数据内容,那么在APK文件的文件结构中文件classes2.dex,\nclasses3.dex,…classesN.dex分别对应一个Central directory file、一个Local file \nheader和一个数据内容,如图2所示,本发明提供的一种APK文件的快速加载方法的实施例\n四中使用了一种DEX文件快速提取并压缩的方法,以文件classes2.dex为例具体说明:首先\n复制文件classes2.dex对应的Central directory file、Local file header和数据内容\n并且将它们构成JAR文件的文件结构,然后将Central directory file中的文件名修改为\nclasses.dex,最后调整Central directory file中的指针指向Local file header;文件\nclasses3.dex,classes4.dex…classesN.dex压缩成JAR文件的具体步骤与文件\nclasses2.dex压缩成JAR文件的具体步骤一致;通过这种方法能极大的降低解压和压缩所\n消耗的性能,提升APK文件的加载速度。\n[0052] 在本说明书的描述中,参考术语“一个实施例”、“一些实施例”、“示例”、“具体示\n例”、或“一些示例”等的描述意指结合该实施例或示例描述的具体特征、结构、材料或者特\n点包含于本发明的至少一个实施例或示例中。在本说明书中,对所述术语的示意性表述不\n一定指的是相同的实施例或示例。而且,描述的具体特征、结构、材料或者特点可以在任何\n的一个或多个实施例或示例中以合适的方式结合。\n[0053] 以上述依据本发明的理想实施例为启示,通过上述的说明内容,相关工作人员完\n全可以在不偏离本项发明技术思想的范围内,进行多样的变更以及修改。本项发明的技术\n性范围并不局限于说明书上的内容,必须要根据权利要求范围来确定其技术性范围。
法律信息
- 2018-04-06
- 2017-09-22
专利申请权的转移
登记生效日: 2017.09.04
申请人由邱寅峰变更为北京顶象技术有限公司
地址由211100 江苏省南京市建邺区云锦路186号7-2-1204变更为100084 北京市海淀区上地信息路26号9层0921室
- 2016-02-24
实质审查的生效
IPC(主分类): G06F 9/445
专利申请号: 201510657289.9
申请日: 2015.10.12
- 2016-01-27
引用专利(该专利引用了哪些专利)
序号 | 公开(公告)号 | 公开(公告)日 | 申请日 | 专利名称 | 申请人 |
1
| |
2015-01-28
|
2014-11-09
| | |
2
| | 暂无 |
2014-11-11
| | |
被引用专利(该专利被哪些专利引用)
序号 | 公开(公告)号 | 公开(公告)日 | 申请日 | 专利名称 | 申请人 | 该专利没有被任何外部专利所引用! |