CN106775842B - 一种可自定义的dex分包的方法 - Google Patents

一种可自定义的dex分包的方法 Download PDF

Info

Publication number
CN106775842B
CN106775842B CN201611079969.8A CN201611079969A CN106775842B CN 106775842 B CN106775842 B CN 106775842B CN 201611079969 A CN201611079969 A CN 201611079969A CN 106775842 B CN106775842 B CN 106775842B
Authority
CN
China
Prior art keywords
class
dex
file
reserved
main
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
CN201611079969.8A
Other languages
English (en)
Other versions
CN106775842A (zh
Inventor
李天成
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Beijing Kuwo Technology Co Ltd
Original Assignee
Beijing Kuwo Technology Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Beijing Kuwo Technology Co Ltd filed Critical Beijing Kuwo Technology Co Ltd
Priority to CN201611079969.8A priority Critical patent/CN106775842B/zh
Publication of CN106775842A publication Critical patent/CN106775842A/zh
Application granted granted Critical
Publication of CN106775842B publication Critical patent/CN106775842B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/44Arrangements for executing specific programs
    • G06F9/445Program loading or initiating
    • G06F9/44505Configuring for program initiating, e.g. using registry, configuration files
    • G06F9/4451User profiles; Roaming

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Stored Programmes (AREA)

Abstract

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

Description

一种可自定义的dex分包的方法
技术领域
本发明涉及dex文件转换技术领域,具体说是一种可自定义的dex分包的方法。
背景技术
在android***中,开发app的工作随着业务规模发展,不断的加入新的代码,添加新的类库,当工程中的方法数超过65535时,就会遇到以下这个错误INSTALL FAILEDDEXOPT,导致app无法安装,开发无法进行。
出现上述问题的原因是:因为Android***使用Dalvik虚拟机,所以需要把使用Java Compiler编译之后的class文件转换成Dalvik能够执行的dex文件。当Android***启动一个应用(app)的时候DexOpt(***内部的一个工具,用来优化dex文件,及查看源文件的详细信息)会对dex文件进行优化。DexOpt会把每一个类的方法id检索起来,存在一个链表结构里面,但是这个链表的长度是用一个short类型来保存的,导致了方法id的数目不能够超过65535个。
Dexopt使用一个固定大小的缓冲区LinearAlloc来存储应用的方法信息。Android2.2和2.3的LinearAlloc只有5MB,Android 4.x提高到了8MB或16MB。当方法数量过多会导致超出缓冲区LinearAlloc大小,这也会造成Dexopt崩溃。
现有技术对此的解决方案通常是:使用谷歌官方的Multidex Support Library来解决这个问题,实现原理是将class编译进不同的classes.dex文件中。这种方法存在以下技术缺陷:
不能根据项目实际需求自动智能的指定哪些类必须包含在主dex中,需要人工分析,手动指定哪些类应该放在主dex中,在大的工程开发中,人工分析、手动添加文件列表的方式显然不现实,很容易导致应用启动时某些类找不到,出现Class Not FoundException,造成应用崩溃无法使用。
发明内容
针对现有技术中存在的缺陷,本发明的目的在于提供一种可自定义的dex分包的方法,在生成dex文件的过程中,对类文件进行依赖分析,动态的指定主dex文件,避免应用安装时出现错误INSTALL FAILED DEXOPT,避免运行时出现Class Not Found Exception造成应用崩溃无法使用。
为达到以上目的,本发明采取的技术方案是:
一种可自定义的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,在Android Gradle脚本的编译过程中,在生成main_dex任务队列中***自定义Task任务;
步骤202,在自定义Task任务中,调用分析工具对步骤101中所述自定义配置的main_dex保留类以及该保留类所依赖的类进行循环分析。
在上述技术方案的基础上,步骤201中,任务队列指在Android Gradle脚本编译构建应用时,生成main_dex的文件列表,需要经历的Task任务队列。
在上述技术方案的基础上,在自定义Task任务中,调用Class DependencyAnalyzer分析工具,动态的干预main_dex的文件列表的生成。
在上述技术方案的基础上,步骤202的具体步骤如下:
步骤301,读取步骤101中的规则文件,将该规则文件中所有保留类文件名称列表存在内存中;
步骤302,读取***混淆后生成的mapping文件,根据mapping文件中混淆后和混淆前的对应关系,查找步骤301中所有保留类文件名称列表对应的混淆之后的类名字,所述混淆之后的类名字为混淆后的类文件名;
步骤303,调用Class Dependency Analyzer分析工具,以步骤302读取出来的混淆后的类文件名为索引,通过类文件字节码的constant pool,找出类的依赖关系,这些依赖包括super class、fields、methods及interfaces中出现的类的依赖,将查找出来的保留类的依赖类输出到临时文件中,然后以查找出来的保留类的依赖类为索引,继续调用ClassDependency Analyzer分析工具,直到查找不到类的依赖关系。
在上述技术方案的基础上,在步骤103中,将步骤303所述临时文件中记载的所有互相依赖的类的全路径名称列表,和***在构建时生成的默认的main_dex保留类文件列表合并,完成干预***生成main_dex保留类文件列表的目的。
本发明所述的可自定义的dex分包的方法,在打包过程中嵌入,针对***的主dex文件列表进行依赖分析,将遗漏的同时程序启动时所必要的类文件打包到主dex中,不依赖于人为的分析主dex文件依赖,避免了人为因素分析不完整,不正确导致出现Class NotFound Exception,造成应用崩溃无法使用,稳定性、可靠性好。
本发明所述的可自定义的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,在Android Gradle脚本的编译过程(指编译构建应用)中,在生成main_dex任务队列中***自定义Task任务;
步骤202,在自定义Task任务中,调用分析工具对步骤101中所述自定义配置的main_dex保留类以及该保留类所依赖的类进行循环分析。
在上述技术方案的基础上,步骤201中,任务队列指在Android Gradle脚本编译构建应用时,生成main_dex的文件列表(即默认的main_dex保留类文件列表),需要经历的Task任务队列,任务队列具体包括以下Task任务队列:
Task1:collectReleaseMultiDexComponents
该Task1根据AndroidManifest(指Andriod应用程序的清单文件),保留Activity,Service,Broadcastreceiver,ContentProvider,Instrumentation,application,输出到:
build\intermediates\multi-dex\release\manifest_keep.txt
Task2:PackageAllReleaseClassesForMultiDex
该Task2打包所有的jar,输出到:build\intermediates\multi-dex\release\allclasses.jar
Task3:ShrinkReleaseMultiDexComponents
该Task3根据上面的Task 1生成的manifest_keep.txt和Task2生成的allclasses.jar,加上proguard混淆文件,生成混淆后的jar,输出到:
build\intermediates\multi-dex\release\componentClasses.jar
Task4:createReleaseMainDexClassList
该Task4根据上面Task 3产生的componentsClasses.jar和Task2产生的allclasses.jar,最终生成main dex list,包含了所有main_dex的class文件,输出到:
build\intermediates\multi-dex\release\maindexlist.txt
。在Task1~4任务队列中***自定义Task任务。
在上述技术方案的基础上,在自定义Task任务中,调用Class DependencyAnalyzer分析工具,动态的干预main_dex的文件列表的生成。
在上述技术方案的基础上,如图2所示,步骤202的具体步骤如下:
步骤301,读取步骤101中的规则文件,将该规则文件中所有保留类文件名称列表存在内存中;
步骤302,读取***混淆后生成的mapping文件,根据mapping文件中混淆后和混淆前的对应关系,查找步骤301中所有保留类文件名称列表对应的混淆之后的类名字,所述混淆之后的类名字为混淆后的类文件名;
所述对应关系可以通过混淆后生成的类的格式来进行精确查找,混淆后的类在类名后面有“:”作为标示,以下是一个示例:
混淆前的类名“android.net.http.SslError”,
混淆后的类名“android.a.a.a:”,
步骤303,调用Class Dependency Analyzer分析工具,以步骤302读取出来的混淆后的类文件名为索引,通过类文件字节码的constant pool(常量池),找出类的依赖关系,这些依赖包括super class(类的父类)、fields(类的字段)、methods(类的方法)及interfaces(类的接口)中出现的类的依赖,将查找出来的保留类的依赖类输出到临时文件中,然后以查找出来的保留类的依赖类为索引,继续调用Class Dependency Analyzer分析工具,直到查找不到类的依赖关系。
在上述技术方案的基础上,在步骤103中,将步骤303所述临时文件中记载的所有互相依赖的类的全路径名称列表,和***在构建时生成的默认的main_dex保留类文件列表合并,完成干预***生成main_dex保留类文件列表的目的。
本说明书中未作详细描述的内容属于本领域专业技术人员公知的现有技术。

Claims (8)

1.一种可自定义的dex分包的方法,其特征在于,包括如下步骤:
步骤101,根据app首次启动加载所必需类,配置规则文件,所述规则文件包括自定义配置的main_dex保留类规则文件;
步骤102,在编译过程中,当执行到dex前置任务时,根据步骤101所述自定义配置的main_dex保留类规则文件寻找自定义配置的main_dex保留类的依赖关系,将找到的自定义配置的main_dex保留类的所有依赖类的全路径名称输出到指定文件;
步骤103,将步骤102所述指定文件中记载的依赖类的全路径名称列表,和***在构建时生成的默认的main_dex保留类文件列表合并。
2.如权利要求1所述的可自定义的dex分包的方法,其特征在于:步骤101中,所述app首次启动加载所必需类尤指启动页及程序初始化相关所必需类。
3.如权利要求1所述的可自定义的dex分包的方法,其特征在于:步骤101中,所述自定义配置的main_dex保留类规则文件记载希望保留在main_dex中的类;
规则具体格式如下:
保留单个类,以class:开头,类文件的全路径名称为一行;
保留整个类库,以jar:开头,以类库的全路径名称为一行;
以*代表通配符。
4.如权利要求1所述的可自定义的dex分包的方法,其特征在于:步骤102的具体步骤如下:
步骤201,在Android Gradle脚本的编译过程中,在生成main_dex任务队列中***自定义Task任务;
步骤202,在自定义Task任务中,调用分析工具对步骤101中所述自定义配置的main_dex保留类以及该保留类所依赖的类进行循环分析。
5.如权利要求4所述的可自定义的dex分包的方法,其特征在于:步骤201中,任务队列指在Android Gradle脚本编译构建应用时,生成main_dex的文件列表,需要经历的Task任务队列。
6.如权利要求4所述的可自定义的dex分包的方法,其特征在于:在自定义Task任务中,调用Class Dependency Analyzer分析工具,动态的干预main_dex的文件列表的生成。
7.如权利要求4所述的可自定义的dex分包的方法,其特征在于:步骤202的具体步骤如下:
步骤301,读取步骤101中的自定义配置的main_dex保留类规则文件,将该自定义配置的main_dex保留类规则文件中所有保留类文件名称列表存在内存中;
步骤302,读取***混淆后生成的mapping文件,根据mapping文件中混淆后和混淆前的对应关系,查找步骤301中所有保留类文件名称列表对应的混淆之后的类名字,所述混淆之后的类名字为混淆后的类文件名;
步骤303,调用Class Dependency Analyzer分析工具,以步骤302读取出来的混淆后的类文件名为索引,通过类文件字节码的constant pool,找出类的依赖关系,这些依赖包括super class、fields、methods及interfaces中出现的类的依赖,将查找出来的保留类的依赖类输出到临时文件中,然后以查找出来的保留类的依赖类为索引,继续调用ClassDependency Analyzer分析工具,直到查找不到类的依赖关系。
8.如权利要求7所述的可自定义的dex分包的方法,其特征在于:在步骤103中,将步骤303所述临时文件中记载的所有互相依赖的类的全路径名称列表,和***在构建时生成的默认的main_dex保留类文件列表合并,完成干预***生成main_dex保留类文件列表的目的。
CN201611079969.8A 2016-11-30 2016-11-30 一种可自定义的dex分包的方法 Active CN106775842B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201611079969.8A CN106775842B (zh) 2016-11-30 2016-11-30 一种可自定义的dex分包的方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201611079969.8A CN106775842B (zh) 2016-11-30 2016-11-30 一种可自定义的dex分包的方法

Publications (2)

Publication Number Publication Date
CN106775842A CN106775842A (zh) 2017-05-31
CN106775842B true CN106775842B (zh) 2020-02-11

Family

ID=58901215

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201611079969.8A Active CN106775842B (zh) 2016-11-30 2016-11-30 一种可自定义的dex分包的方法

Country Status (1)

Country Link
CN (1) CN106775842B (zh)

Families Citing this family (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN107315593A (zh) * 2017-06-29 2017-11-03 广州优视网络科技有限公司 应用程序打包方法、装置及终端设备
CN107609394A (zh) * 2017-08-28 2018-01-19 上海移卓网络科技有限公司 Android安装包的防篡改方法、存储设备及装置
CN109947493A (zh) * 2017-12-19 2019-06-28 珠海市君天电子科技有限公司 应用程序启动方法、装置、电子设备及存储介质
CN111552518B (zh) * 2019-01-24 2023-04-07 阿里巴巴集团控股有限公司 一种启动应用的控件加载方法及装置
CN110502222B (zh) * 2019-07-23 2023-03-21 北京字节跳动网络技术有限公司 外发依赖内部基础库的aar方法、装置、介质和设备
CN110806906B (zh) * 2019-10-30 2022-04-12 腾讯科技(深圳)有限公司 一种Dex分包方法、装置、设备及介质
CN111352631B (zh) * 2020-02-21 2024-03-19 腾讯音乐娱乐科技(深圳)有限公司 一种接口兼容性检测方法及装置

Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2015154612A1 (zh) * 2014-10-08 2015-10-15 中兴通讯股份有限公司 扩展apk文件应用的方法及装置

Family Cites Families (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN104426658B (zh) * 2013-09-02 2017-12-01 ***通信集团公司 对移动终端上的应用进行身份验证的方法及装置
CN104866504B (zh) * 2014-02-25 2018-07-06 北京娜迦信息科技发展有限公司 一种对Android软件进行功能扩展的方法及装置
CN105577720B (zh) * 2014-10-15 2020-04-10 中兴通讯股份有限公司 移动应用打包的方法及***

Patent Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2015154612A1 (zh) * 2014-10-08 2015-10-15 中兴通讯股份有限公司 扩展apk文件应用的方法及装置

Also Published As

Publication number Publication date
CN106775842A (zh) 2017-05-31

Similar Documents

Publication Publication Date Title
CN106775842B (zh) 一种可自定义的dex分包的方法
KR101143112B1 (ko) 페일세이프 방식으로 맞춤 소프트웨어 영상 갱신을불휘발성 저장 장치에 적용하는 시스템 및 방법
CN109491695B (zh) 一种集成安卓应用的增量更新方法
US8375382B2 (en) Enabling parallel websphere runtime versions
JP5957084B2 (ja) レジスタの生存を示すコンパイルされたコードの生成
US8185889B2 (en) Methods and systems for porting software packages from one format to another
CN109791483B (zh) 用于计算设备的共享软件库
US7774636B2 (en) Method and system for kernel panic recovery
US9213623B2 (en) Memory allocation with identification of requesting loadable kernel module
US20040088694A1 (en) Systems and methods for updating software
EP1626338A1 (en) System and method for providing exceptional flow control in protected code through watchpoints
KR20110098567A (ko) 최소 부트 이미지의 생성 방법 및 장치
Kashyap et al. Instant {OS} Updates via Userspace {Checkpoint-and-Restart}
EP2372540A1 (en) Program compiler, program installer, and program install method
EP2541421A1 (en) Processing device and write method
CN102346673A (zh) 一种手机***升级的方法及装置
CN114398145A (zh) 基于X86平台的Jailhouse运行non-root Linux的方法
US9235426B2 (en) Multicore processor system, computer product, and notification method for updating operating system
CN112099880B (zh) 场景驱动的应用程序约减方法和***
CN113448797A (zh) ***、计算机实现方法、以及计算机程序产品
CN114281597A (zh) 用于类改变的适应性热重载
US9477496B2 (en) Method and apparatus for loading classes and re-organizing class archives
CN113867768A (zh) 操作***处理方法、装置、电子设备及存储介质
US10552135B1 (en) Reducing a size of an application package
US10310870B2 (en) Method for creating a revised application by adding code functionality to an existing application executable

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant