一种可自定义的dex分包的方法技术

技术编号:15540980 阅读:148 留言:0更新日期:2017-06-05 10:36
本发明专利技术涉及一种可自定义的dex分包的方法,根据app首次启动加载所必需类,配置规则文件,文件中包括自定义配置的main_dex保留类规则文件;在编译过程中,当执行到dex前置任务时,根据步骤101所述规则文件寻找自定义配置的main_dex保留类的依赖关系,将找到的自定义配置的main_dex保留类的所有依赖类的全路径名称输出到指定文件;将指定文件中记载的依赖类的全路径名称列表,和系统在构建时生成的默认的main_dex保留类文件列表合并。本发明专利技术,在生成dex文件的过程中,对类文件进行依赖分析,动态的指定主dex文件,避免应用安装时出现错误INSTALL FAILED DEXOPT,避免运行时出现Class Not Found Exception造成应用崩溃无法使用。

A customizable method for DEX subcontracting

The invention relates to a custom DEX packet method, according to the app for the first time to start classes required for loading, configuration rules file, including custom configuration main_dex file in the retention rules; in the compilation process when the implementation of the DEX pre task, according to the 101 steps of the rule for custom configuration file main_dex the dependence of retention, will find the custom configuration main_dex retains the class of all the dependent class full path name output to the specified file; will specify the full path name documented in the dependent class list, and the system generated in the construction of the default main_dex class file list with reservation. The invention, in the process of generating DEX files, to rely on analysis of the types of documents, dynamic specified DEX file, INSTALL FAILED DEXOPT to avoid the wrong application installation, avoid Class Not Found Exception operation caused by collapse cannot be used.

【技术实现步骤摘要】
一种可自定义的dex分包的方法
本专利技术涉及dex文件转换
,具体说是一种可自定义的dex分包的方法。
技术介绍
在android系统中,开发app的工作随着业务规模发展,不断的加入新的代码,添加新的类库,当工程中的方法数超过65535时,就会遇到以下这个错误INSTALLFAILEDDEXOPT,导致app无法安装,开发无法进行。出现上述问题的原因是:因为Android系统使用Dalvik虚拟机,所以需要把使用JavaCompiler编译之后的class文件转换成Dalvik能够执行的dex文件。当Android系统启动一个应用(app)的时候DexOpt(系统内部的一个工具,用来优化dex文件,及查看源文件的详细信息)会对dex文件进行优化。DexOpt会把每一个类的方法id检索起来,存在一个链表结构里面,但是这个链表的长度是用一个short类型来保存的,导致了方法id的数目不能够超过65535个。Dexopt使用一个固定大小的缓冲区LinearAlloc来存储应用的方法信息。Android2.2和2.3的LinearAlloc只有5MB,Android4.x提高到了8MB或16MB。当方法数量过多会导致超出缓冲区LinearAlloc大小,这也会造成Dexopt崩溃。现有技术对此的解决方案通常是:使用谷歌官方的MultidexSupportLibrary来解决这个问题,实现原理是将class编译进不同的classes.dex文件中。这种方法存在以下技术缺陷:不能根据项目实际需求自动智能的指定哪些类必须包含在主dex中,需要人工分析,手动指定哪些类应该放在主dex中,在大的工程开发中,人工分析、手动添加文件列表的方式显然不现实,很容易导致应用启动时某些类找不到,出现ClassNotFoundException,造成应用崩溃无法使用。
技术实现思路
针对现有技术中存在的缺陷,本专利技术的目的在于提供一种可自定义的dex分包的方法,在生成dex文件的过程中,对类文件进行依赖分析,动态的指定主dex文件,避免应用安装时出现错误INSTALLFAILEDDEXOPT,避免运行时出现ClassNotFoundException造成应用崩溃无法使用。为达到以上目的,本专利技术采取的技术方案是:一种可自定义的dex分包的方法,其特征在于,包括如下步骤:步骤101,根据app首次启动加载所必需类,配置规则文件,所述规则文件包括自定义配置的main_dex保留类规则文件;步骤102,在编译过程中,当执行到dex前置任务时,根据步骤101所述规则文件寻找自定义配置的main_dex保留类的依赖关系,将找到的自定义配置的main_dex保留类的所有依赖类的全路径名称输出到指定文件;步骤103,将步骤102所述指定文件中记载的依赖类的全路径名称列表,和系统在构建时生成的默认的main_dex保留类文件列表合并。在上述技术方案的基础上,步骤101中,所述app首次启动加载所必需类尤指启动页及程序初始化相关所必需类。在上述技术方案的基础上,步骤101中,所述规则文件记载希望保留在main_dex中的类;规则具体格式如下:保留单个类,以class:开头,类文件的全路径名称为一行;保留整个类库,以jar:开头,以类库的全路径名称为一行;以*代表通配符。在上述技术方案的基础上,步骤102的具体步骤如下:步骤201,在AndroidGradle脚本的编译过程中,在生成main_dex任务队列中插入自定义Task任务;步骤202,在自定义Task任务中,调用分析工具对步骤101中所述自定义配置的main_dex保留类以及该保留类所依赖的类进行循环分析。在上述技术方案的基础上,步骤201中,任务队列指在AndroidGradle脚本编译构建应用时,生成main_dex的文件列表,需要经历的Task任务队列。在上述技术方案的基础上,在自定义Task任务中,调用ClassDependencyAnalyzer分析工具,动态的干预main_dex的文件列表的生成。在上述技术方案的基础上,步骤202的具体步骤如下:步骤301,读取步骤101中的规则文件,将该规则文件中所有保留类文件名称列表存在内存中;步骤302,读取系统混淆后生成的mapping文件,根据mapping文件中混淆后和混淆前的对应关系,查找步骤301中所有保留类文件名称列表对应的混淆之后的类名字,所述混淆之后的类名字为混淆后的类文件名;步骤303,调用ClassDependencyAnalyzer分析工具,以步骤302读取出来的混淆后的类文件名为索引,通过类文件字节码的constantpool,找出类的依赖关系,这些依赖包括superclass、fields、methods及interfaces中出现的类的依赖,将查找出来的保留类的依赖类输出到临时文件中,然后以查找出来的保留类的依赖类为索引,继续调用ClassDependencyAnalyzer分析工具,直到查找不到类的依赖关系。在上述技术方案的基础上,在步骤103中,将步骤303所述临时文件中记载的所有互相依赖的类的全路径名称列表,和系统在构建时生成的默认的main_dex保留类文件列表合并,完成干预系统生成main_dex保留类文件列表的目的。本专利技术所述的可自定义的dex分包的方法,在打包过程中嵌入,针对系统的主dex文件列表进行依赖分析,将遗漏的同时程序启动时所必要的类文件打包到主dex中,不依赖于人为的分析主dex文件依赖,避免了人为因素分析不完整,不正确导致出现ClassNotFoundException,造成应用崩溃无法使用,稳定性、可靠性好。本专利技术所述的可自定义的dex分包的方法,对其他所有的安卓项目工程同样具有非常好的适用性。附图说明本专利技术有如下附图:图1本专利技术方法流程图。图2分析工具进行循环分析流程图。具体实施方式以下结合附图对本专利技术作进一步详细说明。如图1所示,本专利技术所述的可自定义的dex分包的方法,包括如下步骤:步骤101,根据app首次启动加载所必需类(尤指启动页及程序初始化相关所必需类),配置规则文件,所述规则文件包括自定义配置的main_dex保留类规则文件;步骤102,在编译过程中,当执行到dex前置任务时,根据步骤101所述规则文件寻找自定义配置的main_dex保留类的依赖关系,将找到的自定义配置的main_dex保留类的所有依赖类的全路径名称输出到指定文件;步骤103,将步骤102所述指定文件中记载的依赖类的全路径名称列表,和系统在构建时生成的默认的main_dex保留类文件列表合并。在上述技术方案的基础上,步骤101中,所述规则文件记载希望保留在main_dex中的类;规则具体格式如下:保留单个类,以class:开头,类文件的全路径名称为一行;保留整个类库,以jar:开头,以类库的全路径名称为一行;以*代表通配符。在上述技术方案的基础上,步骤102的具体步骤如下:步骤201,在AndroidGradle脚本的编译过程(指编译构建应用)中,在生成main_dex任务队列中插入自定义Task任务;步骤202,在自定义Task任务中,调用分析工具对步骤101中所述自定义配置的main_dex保本文档来自技高网
...
一种可自定义的dex分包的方法

【技术保护点】
一种可自定义的dex分包的方法,其特征在于,包括如下步骤:步骤101,根据app首次启动加载所必需类,配置规则文件,所述规则文件包括自定义配置的main_dex保留类规则文件;步骤102,在编译过程中,当执行到dex前置任务时,根据步骤101所述规则文件寻找自定义配置的main_dex保留类的依赖关系,将找到的自定义配置的main_dex保留类的所有依赖类的全路径名称输出到指定文件;步骤103,将步骤102所述指定文件中记载的依赖类的全路径名称列表,和系统在构建时生成的默认的main_dex保留类文件列表合并。

【技术特征摘要】
1.一种可自定义的dex分包的方法,其特征在于,包括如下步骤:步骤101,根据app首次启动加载所必需类,配置规则文件,所述规则文件包括自定义配置的main_dex保留类规则文件;步骤102,在编译过程中,当执行到dex前置任务时,根据步骤101所述规则文件寻找自定义配置的main_dex保留类的依赖关系,将找到的自定义配置的main_dex保留类的所有依赖类的全路径名称输出到指定文件;步骤103,将步骤102所述指定文件中记载的依赖类的全路径名称列表,和系统在构建时生成的默认的main_dex保留类文件列表合并。2.如权利要求1所述的可自定义的dex分包的方法,其特征在于:步骤101中,所述app首次启动加载所必需类尤指启动页及程序初始化相关所必需类。3.如权利要求1所述的可自定义的dex分包的方法,其特征在于:步骤101中,所述规则文件记载希望保留在main_dex中的类;规则具体格式如下:保留单个类,以class:开头,类文件的全路径名称为一行;保留整个类库,以jar:开头,以类库的全路径名称为一行;以*代表通配符。4.如权利要求1所述的可自定义的dex分包的方法,其特征在于:步骤102的具体步骤如下:步骤201,在AndroidGradle脚本的编译过程中,在生成main_dex任务队列中插入自定义Task任务;步骤202,在自定义Task任务中,调用分析工具对步骤101中所述自定义配置的main_dex保留类以及该保留类所依赖的类进行循环分析。5.如权利要求4所述的可自定义的dex分包的方法,其特征在于:步骤201中,任务队列指在Android...

【专利技术属性】
技术研发人员:李天成
申请(专利权)人:北京酷我科技有限公司
类型:发明
国别省市:北京,11

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1