CN110806906B - 一种Dex分包方法、装置、设备及介质 - Google Patents
一种Dex分包方法、装置、设备及介质 Download PDFInfo
- Publication number
- CN110806906B CN110806906B CN201911046993.5A CN201911046993A CN110806906B CN 110806906 B CN110806906 B CN 110806906B CN 201911046993 A CN201911046993 A CN 201911046993A CN 110806906 B CN110806906 B CN 110806906B
- Authority
- CN
- China
- Prior art keywords
- class
- dex
- file
- entry method
- target
- 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
Links
- 238000000034 method Methods 0.000 title claims abstract description 287
- 238000004806 packaging method and process Methods 0.000 claims abstract description 16
- 238000010586 diagram Methods 0.000 claims description 18
- 238000004590 computer program Methods 0.000 claims description 15
- 238000009434 installation Methods 0.000 claims description 10
- 238000004458 analytical method Methods 0.000 claims description 4
- 238000012856 packing Methods 0.000 claims description 3
- 238000010276 construction Methods 0.000 claims description 2
- 238000000638 solvent extraction Methods 0.000 claims 1
- 230000008569 process Effects 0.000 description 20
- 230000006870 function Effects 0.000 description 14
- 238000012545 processing Methods 0.000 description 12
- 238000011161 development Methods 0.000 description 9
- 238000004422 calculation algorithm Methods 0.000 description 4
- 101100387135 Caenorhabditis elegans dex-1 gene Proteins 0.000 description 3
- 238000004891 communication Methods 0.000 description 3
- 230000008878 coupling Effects 0.000 description 3
- 238000010168 coupling process Methods 0.000 description 3
- 238000005859 coupling reaction Methods 0.000 description 3
- 238000005516 engineering process Methods 0.000 description 3
- 230000005540 biological transmission Effects 0.000 description 2
- 238000004364 calculation method Methods 0.000 description 2
- 230000001419 dependent effect Effects 0.000 description 2
- 238000001514 detection method Methods 0.000 description 2
- 230000000694 effects Effects 0.000 description 2
- 230000004044 response Effects 0.000 description 2
- 230000005236 sound signal Effects 0.000 description 2
- 238000000354 decomposition reaction Methods 0.000 description 1
- 230000003111 delayed effect Effects 0.000 description 1
- 238000007599 discharging Methods 0.000 description 1
- 230000014509 gene expression Effects 0.000 description 1
- 238000007429 general method Methods 0.000 description 1
- 230000003993 interaction Effects 0.000 description 1
- 239000004973 liquid crystal related substance Substances 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 238000012544 monitoring process Methods 0.000 description 1
- 230000003287 optical effect Effects 0.000 description 1
- 230000002085 persistent effect Effects 0.000 description 1
- 238000000926 separation method Methods 0.000 description 1
- 239000007787 solid Substances 0.000 description 1
- 238000006467 substitution reaction Methods 0.000 description 1
- 238000010897 surface acoustic wave method Methods 0.000 description 1
- 230000001052 transient effect Effects 0.000 description 1
- 230000001960 triggered effect Effects 0.000 description 1
- 230000000007 visual effect Effects 0.000 description 1
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements 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/44—Arrangements for executing specific programs
- G06F9/445—Program loading or initiating
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements 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/44—Arrangements for executing specific programs
- G06F9/445—Program loading or initiating
- G06F9/44521—Dynamic linking or loading; Link editing at or after load time, e.g. Java class loading
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分包方法,包括:获取Class文件集、入口方法列表以及Dex拆分梯度;其中,Class文件集中包括多个Class文件,每个Class文件包括一个类;根据Class文件集和入口方法列表,确定由入口方法路由至各个类的执行有向图;根据执行有向图,确定各个类到入口方法的最小距离;根据各个类到入口方法的最小距离和Dex拆分梯度,将Class文件集中每个Class文件划分至对应梯度的Dex文件中;遍历每个Dex文件中Class文件中的类,在当前类与其所调用的类不属于同一Dex文件时,在当前类的调用指令前端添加加载码,其中,加载码用于在执行时动态加载下一个Dex文件到运行时环境,实现了有效分包以及按需加载。本申请还公开了对应的装置、软件开发系统、设备及介质。
Description
技术领域
本申请涉及软件开发技术领域,尤其涉及一种Dex分包方法、装置、设备及介质。
背景技术
在安卓(android)系统中,开发应用app的工作随着业务规模发展,不断地添加新的代码,添加新的类库,当工程中的方法数超过65535时,就会遇到这个错误INSTALLFAILED DEXOPT,导致app无法安装,开发无法正常进行,这种问题就是android开发过程中经常遇到的65536问题,也就是常见的MultiDex问题。
为了解决上述MultiDex问题,官方提供一个通用的方法,将Class分别打包到不同Dex中,并在启动的过程中一次性加载全部Dex,这种做法虽然能够解决65536问题,但又引出新的问题:分包随机不可控以及无法做到按需加载,导致app启动慢。为此业内又提出另一种方法,通过第一次启动记录来获取Class依赖关系,并将启动过程中所需要的Class文件配置到第一个Dex中,该方法虽然能够完成Dex分包,解决分包可控的问题,但该方法同样存在无法实现Dex按需加载的问题,同时还存在随着运行环境加载不同的类,导致在有些运行环境下会出现加载失败导致app无法启动的问题。
基于上述现状,在andoid开发场景下,如何实现Dex有效分包以及按需加载,以提高启动效率并且减少无效的Dex加载,这是目前急需解决的问题。
发明内容
本申请提供了一种Dex分包方法,通过设置必要的入口方法,根据class至入口方法的最小距离进行Dex分包,如此靠近入口方法的class在启动过程中被首先加载,距离较远的class放入其他Dex中进行延迟加载,从而实现有效分包以及按需加载,提高了应用启动效率。本申请还提供了对应的装置、设备、介质以及计算机程序产品。
有鉴于此,本申请第一方面提供了一种Dex分包方法,所述方法包括:
获取Class文件集、入口方法列表以及Dex拆分梯度;其中,所述Class文件集中包括多个Class文件,每个所述Class文件包括一个类;
根据所述Class文件集和所述入口方法列表,确定由入口方法路由至各个类的执行有向图;
根据所述执行有向图,确定各个类到入口方法的最小距离;
根据各个类到入口方法的最小距离和所述Dex拆分梯度,将所述Class文件集中每个所述Class文件划分至对应梯度的Dex文件中;
遍历每个Dex文件中Class文件中的类,在当前类与其所调用的类不属于同一Dex文件时,在所述当前类的调用指令前端添加加载码,其中,所述加载码用于在执行时动态加载下一个Dex文件到运行时环境。
本申请第二方面提供一种Dex分包装置,所述装置包括:
基础数据获取模块,用于获取Class文件集、入口方法列表以及Dex拆分梯度;其中,所述Class文件集中包括多个Class文件,每个所述Class文件包括一个类;
执行有向图构建模块,用于根据所述Class文件集和所述入口方法列表,确定由入口方法路由至各个类的执行有向图;
距离确定模块,用于根据所述执行有向图,确定各个类到入口方法的最小距离;
Dex文件分包模块,用于根据各个类到入口方法的最小距离和所述Dex拆分梯度,将所述Class文件集中每个所述Class文件划分至对应梯度的Dex文件中;
加载码添加模块,用于遍历每个Dex文件中Class文件中的类,在当前类与其所调用的类不属于同一Dex文件时,在所述当前类的调用指令前端添加加载码,其中,所述加载码用于在执行时动态加载下一个Dex文件到运行时环境。
本申请第三方面提供一种软件开发系统,所述系统包括:
编译器、Dex分包器和Apk打包器;其中,
所述编译器,用于将应用的源码文件转换成Class文件得到Class文件集;
所述Dex分包器,用于获取所述Class文件集、入口方法列表以及Dex拆分梯度;其中,所述Class文件集中包括多个Class文件,每个所述Class文件包括一个类;根据所述Class文件集和所述入口方法列表,确定由入口方法路由至各个类的执行有向图;根据所述执行有向图,确定各个类到入口方法的最小距离;根据各个类到入口方法的最小距离和所述Dex拆分梯度,将所述Class文件集中每个所述Class文件划分至对应梯度的Dex文件中;遍历每个Dex文件中Class文件中的类,在当前类与其所调用的类不属于同一Dex文件时,在所述当前类的调用指令前端添加加载码,其中,所述加载码用于在执行时动态加载下一个Dex文件到运行时环境;
所述Apk打包器,用于将所有的Dex文件形成的Dex集打包成安装包。
本申请第四方面提供一种设备,所述设备包括处理器以及存储器:
所述存储器用于存储计算机程序;
所述处理器用于运行所述计算机程序以执行如上述第一方面所述的Dex分包方法的步骤。
本申请第四方面提供一种计算机可读存储介质,所述计算机可读存储介质用于存储计算机程序,所述程序代码用于执行上述第一方面所述的Dex分包方法。
本申请第五方面提供一种包括指令的计算机程序产品,当其在计算机上运行时,使得所述计算机执行上述第一方面所述的Dex分包方法。
从以上技术方案可以看出,本申请实施例具有以下优点:
在进行Dex分包时,针对一个应用的全部class文件,设置有必要的入口方法,通过获取上述全部class文件形成的class文件集、上述入口方法对应的入口方法列表以及Dex拆分梯度,该class文件集中包括多个class文件,每个class文件包括一个类,根据class文件集和入口方法列表确定出由入口方法路由至各个类的执行有向图,并根据该执行有向图确定各个类到入口方法的最小距离,如此可以将每个class文件按照各个类到入口方法的最小距离和Dex拆分梯度划分至对应梯度的Dex文件中,最后遍历每个Dex文件中Class文件中的类,在当前类与其所调用的类不属于同一Dex文件时,在当前类的调用指令前端添加加载码。
如此,靠近入口方法的Class文件能够在启动过程中首先被加载,远离入口方法的Class文件被放置到其他Dex文件,通过执行相应的加载码,可以根据该加载码指示的类依赖关系,动态加载下一个Dex文件至运行时环境,避免Class调用异常导致启动失败,从而实现了Dex有效分包以及按需加载,提高了应用启动效率。
附图说明
图1为本申请实施例中方法的系统架构图;
图2为本申请实施例中Dex分包方法的流程图;
图3为本申请实施例中Dex分包工具的结构图;
图4为本申请实施例中Dex分包方法的应用场景示意图;
图5为本申请实施例中应用的执行有向图;
图6为本申请实施例中Dex分包装置的结构图;
图7为本申请实施例中服务器的一个结构示意图;
图8为本申请实施例中终端的一个结构示意图。
具体实施方式
为了使本技术领域的人员更好地理解本申请方案,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
本申请的说明书和权利要求书及上述附图中的术语“第一”、“第二”、“第三”、“第四”等(如果存在)是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本申请的实施例例如能够以除了在这里图示或描述的那些以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。
针对已有的Dex分包方法无法实现Dex按需加载,以及在有些运行环境下会出现加载失败导致app无法启动的问题,本申请提供了一种Dex分包方法,通过确定各个class文件中的类到入口方法的距离,基于距离长短将class文件划分到不同Dex文件,并将存在调用关系但属于不同Dex文件的类中调用方的调用指令前端增加加载码,通过运行加载码加载下一Dex文件,从而实现有效分包以及按需加载,该分包方法不依赖于运行时环境,避免了运行时环境不同导致加载失败进而导致app无法启动的问题。
可以理解,本申请提供的Dex分包方法可以应用任意具有数据处理能力的处理设备中,处理设备具体可以是终端,包括但不限于个人计算机(Personal Computer,PC)和工作站,处理设备也可以是服务器,服务器可以是独立的,也可以是多个服务器形成的服务集群。
其中,本申请提供的Dex分包方法能够以计算机程序的形式存储于处理设备,处理设备通过运行该计算机程序实现上述Dex分包方法。需要说明的是,上述计算机程序可以是独立的程序,也可以是集成于其他计算机程序之上的功能模块、插件或者小程序等等。
在实际应用时,本申请提供的Dex分包方法包括但不限于如图1所示的应用环境中。
如图1所述,开发人员通过终端101上部署的编辑器编写应用的源码文件,然后通过终端101上部署的编译器将该源码文件转换为Class文件,从而得到Class文件集,终端101上还部署有分包工具,如Dex分包器,开发人员可以通过Dex分包器向服务器102上传Class文件集、入口方法类别以及Dex拆分梯度,服务器102根据Class文件集和入口方法列表,确定由入口方法路由至各个类的执行有向图,并根据该执行有向图确定各个类到入口方法的最小距离,然后根据各个类到入口方法的最小距离和Dex拆分梯度,将Class文件集中每个Class文件划分至对应梯度的Dex文件中,最后遍历每个Dex文件中Class文件中的类,在当前类与其所调用的类不属于同一Dex文件时,在当前类的调用指令前端添加加载码。
为了使得本申请的技术方案更加清楚、易于理解,下面从服务器的角度对本申请提供的Dex分包方法的各个步骤进行详细说明。
参见图2所示的Dex分包方法的流程图,该方法包括:
S201:获取Class文件集、入口方法列表以及Dex拆分梯度。
在进行应用开发时,常常需要对应用进行功能分解,然后针对每个功能分别开发相应的方法,如此可以提高开发效率。考虑到Java语言的平台无关性,可以利用Java语言进行应用开发,尤其是安卓平台的应用开发。
在具体实现时,开发人员可以基于编辑器编写Java源码文件,然后通过Java编译得到Class文件,该Class文件是可以运行在任何支持Java虚拟机的硬件平台和操作系统上的二进制文件,能够为Java应用提供独立于底层主机平台的二进制形式的服务。
进一步地,针对一些方法,开发人员还可以在编写Java源码文件时,直接引用已有的Class文件。具体地,Java归档文件(Java Archive File,JAR)中封装有Class文件,开发人员还可以通过引用JAR的方式得到Class文件。
针对一个应用的所有Class文件可以组成Class文件集,该Class文件集具体可以包括多个Class文件,每个Class文件包括一个类,当开发人员通过终端触发Dex分包操作时,终端可以响应于该Dex分包操作,向服务器发送Dex分包请求,服务器可以响应于该请求从终端获取Class文件集。当然,终端也可以在上述Dex分包请求中携带Class文件集。
此外,服务器还获取入口方法列表以及Dex拆分梯度,以用于针对Class文件集进行Dex分包。其中,入口方法是指一个应用启动需要调用的函数方法,对于安卓应用来说,入口方法具体可以是Application的onCreate方法,或者是Activity的生命周期方法等。包含入口方法的Class文件都是启动过程中必须加载的文件,也是主Dex包含的文件。在实际应用时,入口方法一般具有特定的格式,服务器可以基于该特定格式确定包含入口方法的Class文件,进而得到入口方法列表。
Dex拆分梯度主要用于表征拆分粒度,Dex拆分梯度越大,表征拆分粒度越大。当采用基于距离的拆分方法时,Dex拆分梯度可以表征两个相邻Dex文件中Class文件中的类对应的间隔距离。下面结合具体示例进行说明,假设Class文件集中各Class文件中的类到入口方法的距离介于0至5之间,可以将Dex拆分梯度设置为1或2,如此,可以间隔距离1或2进行Dex分包,即按照距离0、1、2、3、4、5分为6个Dex文件,或者按照距离0、1和2、3以及4、5划分为3个Dex文件。
在实际应用时,可以根据业务需求设置Dex拆分梯度,然后开发人员可以终端在Dex分包配置页面配置上述Dex拆分梯度,如此,终端可以在Dex分包请求中携带上述Dex拆分梯度,服务器即可基于Dex分包请求获取Dex拆分梯度。
S202:根据所述Class文件集和所述入口方法列表,确定由入口方法路由至各个类的执行有向图。
在确定入口方法之后,相应的入口Class文件也随之确定。Class文件包括基本的类定义以及相应的字节码,基于此,服务器可以通过对字节码中的指令,具体可以是类方法调用指令,例如invoke-direct、invoke-virtual等进行解析,得到一张以入口方法为起点连接各个类的执行有向图,其中,该执行有向图表征了各个Class文件中类的执行顺序。
在具体实现时,服务器可以按照如下方式创建执行有向图:
先执行S1:以键值对的方式创建类关系图。其中,该类关系图中的对象以类作为键Key,以关联类的列表作为对应的值Value。然后,执行S2:创建寻访队列,采用入口方法列表对寻访队列进行初始化。再执行S3:从寻访队列中读取待处理的方法,解析该方法的字节码,获取该方法中调用的目标类以及目标类所属的方法作为目标方法。接着执行S4:将方法所在的类作为键并将所述目标类作为值形成键值对,将该键值对插入到类关系图中。最后,执行S5:将目标方法插入到寻访队列,并返回上述步骤S3,迭代寻访所述寻访队列中每一个方法直到遍历完毕,获得最终更新的类关系图作为执行有向图。
S203:根据所述执行有向图,确定各个类到入口方法的最小距离。
针对任意一个类,服务器可以确定该类到入口方法的所有路径,然后根据该类到入口方法的最短路径确定该类到入口方法的最小距离。数据结构GraphNode中定义了类的最小距,也即类到全部入口的最小距离。每经过一个类,类距离增加1,因此,最小距离的计算,其实就是计算每个GraphNode节点到全部入口方法的距离的最小值。
在具体实现时,服务器可以针对入口方法列表中的每个入口方法,从所述执行有向图中选取入口方法所在的类,并设置入口方法所在类的最小距离minDistance为零,然后按照执行有向图中类的执行顺序,遍历每个类,当每次经过所述执行有向图中一个类时,确定所述类所调用的目标类到入口方法的最小距离,当确定出的所述最小距离小于所述目标类在先对应的最小距离时,则更新所述目标类到入口方法的最小距离。
其中,服务器在遍历每个类时可以采用广度优先遍历算法或者深度优先遍历算法,具体可以根据实际需求而确定。
S204:根据各个类到入口方法的最小距离和所述Dex拆分梯度,将所述Class文件集中每个所述Class文件划分至对应梯度的Dex文件中。
在具体实现时,服务器可以根据所述Dex拆分梯度和所述各个类到入口方法的最小距离中的最大值,确定多个梯度等级,然后服务器可以根据Dex拆分梯度和各个类到入口方法的最小距离,确定各个类对应的梯度等级,接着服务器可以将各个类所属的Class文件划分至对应梯度等级的Dex文件中。
在实际应用时,服务器还可以通过Dex索引区分不同Dex文件。其中,在最小距离Node.minDistance的基础上,通过指定具体的梯度值T,可以将全部的Class文件划分到不同梯度等级的Dex文件中。如此,梯度索引可以相当于Dex索引,用Index表示索引,那么,一个节点Node被划分到的Dex文件对应的Dex索引可以为:
基于上式,Class将被划分到不同的Dex。虽然Dex从0开始,但在实际应用时,0代表第一个Dex,通常可以在名称中省略索引,1索引缺失,因此,后续Dex索引可以从2开始命名。
为了便于理解,本申请还提供了将Class文件划分至Dex文件的具体示例。在一个示例中,Dex拆分梯度为2,各个类到入口方法的最小距离中的最大值为101,则可以确定梯度等级数量为(101+1)/2=51,然后,根据每个类到入口方法的最小距离确定每个类对应的梯度等级,例如,最小距离为0、1的类对应的梯度等级为第零等级,最小距离为18、19的类对应的梯度等级为第九等级,服务器可以基于上述梯度等级将Class文件划分至对应梯度等级的Dex文件中。
需要说明的是,在确定各个类对应的梯度等级,以及将各个类所属的Class文件划分至对应梯度等级的Dex文件中时,服务器可以依次执行,也可以并行执行,具体可以根据业务需求以及服务器的计算能力进行选择。
S205:遍历每个Dex文件中Class文件中的类,在当前类与其所调用的类不属于同一Dex文件时,在所述当前类的调用指令前端添加加载码。
考虑到Dex文件中可能存在一些Class文件中的类会调用其他Dex文件中类的情况,为了避免出现加载失败,导致应用无法启动或者执行异常等问题,还可以在对应类的调用指令前端添加加载码,当加载码被执行时,可以动态加载下一个Dex文件到运行时环境,如此,下一个Dex文件包括的Class文件被加载到内存,当前类可以调用该Dex文件中的类,而不会出现加载失败的情况。
在具体实现时,服务器可以通过依次遍历或者并行遍历的方式,遍历每个Dex文件中Class文件中的类,确定存在调用关系的类,若存在调用关系的类完全不属于或者部分不属于同一Dex文件,则在调用方的调用指令前端添加加载码,以便在执行调用方对应的类时,能够先加载下一Dex文件,方便调用,避免被调用方未加载至内存导致调用失败,进而导致应用出现异常。
为了便于理解,下面结合具体示例说明。在该示例中,服务器通过遍历每个Dex文件,发现存在调用关系的类包括A、B、C,具体为A调用B和C,其中,A和B属于同一Dex文件,A和C属于不同Dex文件,为此,可以在调用方A的调用指令前端添加加载码,由于执行A时,已预先执行加载码,将下一Dex文件加载至内存,因此,当A调用C时,可以直接从内存中调取。
进一步地,应用启动过程中Dex文件的加载路径难以预测,在每次启动过程中可能存在多次中断执行加载码以加载需要的Dex文件的情况,为此,可以在加载码中添加记录器,该记录器用于在运行时记录启动时所采用的目标入口方法和启动过程中加载的目标Dex文件的编号序列,以便在下一次启动时当匹配至所述目标入口方法时,根据所述目标Dex文件的编号序列加载目标Dex文件,从而实现启动优化。
需要说明的是,记录器可以将目标入口方法和启动过程中加载的目标Dex文件的编号序列通过写入操作记录在启动记录文件中。考虑到加载码难以确定启动结束点,上层应用可以主动设置结束标志位,将其记录在启动记录文件中。例如,在工具类应用中,可以在主Activity的onResume生命周期中设置该结束标志位。又例如,在游戏应用中,可以在游戏引擎正常运行后设置该结束标志位。当下次启动时,如果在启动记录文件中匹配到了对应的入口方法,则相应地依次加载记录中的全部Dex,提高加载效率。
在一些可能的实现方式中,服务器可以在添加加载码之后,将所有的Dex文件形成的Dex集,利用打包工具打包成安装包Apk,以便用户能够基于该安装包在用户端部署上述应用,从而实现应用的各项功能。
由上可知,本申请实施例提供了一种Dex分包方法,其基于各个Class文件中的类到入口方法的距离,将Class文件划分到不同的Dex文件,如此,靠近入口方法的Class文件能够在启动过程中首先被加载,远离入口方法的Class文件被放置到其他Dex文件,通过执行相应的加载码,可以根据该加载码指示的类依赖关系,动态加载下一个Dex文件至运行时环境,避免Class调用异常导致启动失败,如此实现了Dex有效分包以及按需加载,提高了应用启动效率。
可以理解,本申请实施例提供的Dex分包方法能够通过一个通用的工具或者系统实现。以Dex分包工具为例,请参见图3,该Dex分包工具的输入参数包括Class文件集、入口方法列表以及Dex拆分梯度T,当然,在有些情况下还可以包括其他输入参数,根据上述输入参数通过Dex分包工具执行上述Dex分包方法可以输出最优Dex集,该最优Dex集具体为通过上述Dex分包方法形成的Dex文件的集合。
上述Dex集符合apk的要求,能够直接提供给用户进行打包得到安装包apk。另外,该Dex分包工具也可以作为安卓客户端开发IDE的必要插件,用于应用构建流程中,具体应用于编译之后以及打包之前,其可以辅助用户构建具备多Dex延迟加载性能的安装包。
为了便于理解,本申请实施例还结合安卓应用开发场景对Dex分包方法进行介绍。
参见图4所示的Dex分包方法的应用场景示意图,在该场景中,终端401上部署有安卓客户端开发IDE,该IDE集成有编辑器、编译器和Dex分包器和Apk打包器,其中,编辑器用于接收用户的输入数据,根据该输入数据生成应用的源码文件,编译器用于将源码文件转换成Class文件,具体地,编译器可以对源码文件进行编译得到多个Class文件,每个Class文件包括一个类,应用的所有Class文件形成Class文件集,Dex分包器用于和服务器402交互将Class文件集中的文件划分至不同Dex文件得到Dex集,Apk打包器用于将所有的Dex文件形成的Dex集打包成安装包。
下面结合具体示例,对Dex分包器与服务器402交互实现多Dex分包延迟加载的过程进行详细说明。
开发人员在终端401上Dex分包器的分包配置页面中输入Class文件集的存储目录,以及输入入口方法列表和Dex拆分梯度,然后通过点击确定控件触发Dex分包操作,终端401响应于该操作向服务器402发送Dex分包请求,服务器402响应于该Dex分包请求,从存储目录中获取Class文件集,以及从Dex分包请求中获取入口方法列表和Dex拆分梯度。
接着服务器402可以根据Class文件集和入口方法列表,通过对字节码指令如如invoke-direct、invoke-virtual等进行解析,得到一张以入口方法为起点连接各个类的执行有向图,在该示例中,执行有向图可以如图5所示,M1和M2分别表示入口方法,节点A、B、C、D、E、F、G分别表示不同的类,连接线表示从一个类文件到另一个类文件的调用,该图也指明了类依赖关系,例如节点A依赖节点C、节点B依赖节点E和节点D等。
然后服务器402根据图5所示的执行有向图计算各个类到入口方法的最小距离。沿着上述执行有向图,每跳过一个节点,表示距离入口方法的距离增加1。以包含入口方法的类设置距离为0,那么其他节点的距离入口方法的距离可以通过深度优先搜索的算法进行计算。如上图所示,节点A、节点B的距离为0,节点C、节点D紧随其后,距离都是1。但是对于节点E来说,既有来自节点C的依赖,同时又有来自于节点B的依赖,此时选择二者中距离最小者作为节点E的最小距离,结果为1。
需要说明的是,上述执行有向图中也存在没有任何连接的孤立节点,例如图5中的节点F,这些节点标识的类可能是多余的类,或者是通过反射调用的类。对于这样的类,通常可以检查是否包含入口方法,或者选择舍弃。
各节点的最小距离即为各个类到入口方法的最小距离,服务器402可以按照Dex拆分梯度,将不同距离的Class文件划分到不同的Dex文件中,并按照距离大小进行编号得到Dex索引。由此,距离最短的Dex文件自然成为了一个应用的主Dex,在启动过程中首先被加载。例如,在图5中,如果设置梯度值T为1,那么可以得到如下的Dex拆分结果:
Dex0(主Dex):A、B
Dex1:C、D、E
Dex2:G
Dex3:F……
需要说明,在实际应用时,Dex0中的0常常被省略,在其之后的Dex文件如Dex1至Dex3常常从2开始编号,也即Dex1至Dex3可以写作Dex2至Dex4。
针对每一个执行有向图,在分包形成Dex的过程中,必然切断了有向图之间的连接,为此,可以通过对断开的连接线打桩,插入下一个Dex文件的加载码,进而能够实现运行时自动加载。
为了优化启动过程的Dex加载,服务器402还可以添加Dex记录器,用于记录启动时刻Dex加载集,并在下次启动过程中主动加载该Dex集,提高加载效率。
为了使得本申请的技术方案更加清楚、易于理解,本申请还提供了Dex分包方法中一些步骤的伪代码,本领域技术人员可以基于上述伪代码实现上述Dex分包方法,下面进行详细说明。
创建类关系图的伪码如下所示:
//类调用图
classInvokeGraph={}
//通过入口方法列表初始化方法队列
var methodQueue=entryMethods;
while(methodQueue not empty):
//获取一个方法
var curMethod=methodQueue.pick()
//提取该方法所在的类
var curClass=getClassFromMethod(curMethod)
//获取方法体的字节码
var instData=getInstOfMethodFromClassDef()
//解析字节码,提取其中被调用的方法
targetMethods=extractTargetMethods(instData)
//从方法列表中提取类列表,一个方法可提取一个类
targetClasses=extractTargetClasses(invokeMethods)
//获取当前class的节点
var graphNode=classInvokeGraph.get(curClass)
if(graphNode==null):
graphNode=new GraphNode(curClass);
InstMethod instMethod=new InstMethod(curMethod);
instMethod.addAll(targetClasses);
graphNode.linkMethods.add(instMethod)
//添加到类调用图
classInvokeGraph.put(curClass,graphNode)
//添加目标方法到队列头,继续寻访
methodQueue.addAll(0,targetMethods)
end while
其中,上述伪码中的类调用图即上文所述的类关系图,在以类为key,以关联类的列表为value创建类关系图对象后,创建寻访方法队列,也即上文所述的寻访队列,通过入口方法列表初始化方法队列,然后迭代方法队列中的每个方法,通过解析方法体的字节码,获取其调用其它类的成员方法targetMethods,以及调用类的列表targetClasses,前者将插入到队列头部继续寻访,后者则以当前方法所在的类作为key,目标类列表作为value插入到类关系图中,最后,迭代所有寻访到的方法,完成类关系图的构建。其中涉及的类的数据结构定义如下:
采用深度优先遍历算法计算最小距离的伪码,如下所示:
计算Dex索引过程的伪代码如下:
以上为本申请实施例提供的Dex分包方法的具体实现方式,基于此,本申请还提供了对应的装置,下面将从功能模块化的角度对上述装置进行介绍。
参见图6所示的Dex分包装置的结构示意图,该装置600包括:
基础数据获取模块610,用于获取Class文件集、入口方法列表以及Dex拆分梯度;其中,所述Class文件集中包括多个Class文件,每个所述Class文件包括一个类;
执行有向图构建模块620,用于根据所述Class文件集和所述入口方法列表,确定由入口方法路由至各个类的执行有向图;
距离确定模块630,用于根据所述执行有向图,确定各个类到入口方法的最小距离;
Dex文件分包模块640,用于根据各个类到入口方法的最小距离和所述Dex拆分梯度,将所述Class文件集中每个所述Class文件划分至对应梯度的Dex文件中;
加载码添加模块650,用于遍历每个Dex文件中Class文件中的类,在当前类与其所调用的类不属于同一Dex文件时,在所述当前类的调用指令前端添加加载码,其中,所述加载码用于在执行时动态加载下一个Dex文件到运行时环境。
可选的,所述执行有向图构建模块620,包括:
类关系图创建子模块,用于以键值对的方式创建类关系图,所述类关系图中的对象以类作为键Key,以关联类的列表作为对应的值Value;
寻访队列创建子模块,用于创建寻访队列,采用所述入口方法列表对所述寻访队列进行初始化;
解析子模块,用于从所述寻访队列中读取待处理的方法,解析所述方法的字节码,获取所述方法中调用的目标类以及所述目标类所属的方法作为目标方法;
类关系图更新子模块,用于将所述方法所在的类作为键并将所述目标类作为值形成键值对,将所述键值对插入到所述类关系图中;
执行有向图确定子模块,用于将所述目标方法插入到所述寻访队列,并触发所述解析子模块所述从所述寻访方队列中读取待处理的方法的步骤,迭代寻访所述寻访队列中每一个方法直到遍历完毕,获得最终更新的所述类关系图作为执行有向图。
可选的,所述距离确定模块630,包括:
设置子模块,用于针对所述入口方法列表中的每个入口方法,从所述执行有向图中选取入口方法所在的类,并设置所述入口方法所在类的最小距离为零;
遍历子模块,用于按照所述执行有向图中类的执行顺序,遍历每个类,当每次经过所述执行有向图中一个类时,确定所述类所调用的目标类到入口方法的最小距离,当确定出的所述最小距离小于所述目标类在先对应的最小距离时,则更新所述目标类到入口方法的最小距离。
可选的,所述Dex文件分包模块640,包括:
类划分子模块,用于根据所述Dex拆分梯度和所述各个类到入口方法的最小距离,确定所述各个类对应的梯度等级;
Dex文件分包子模块,用于将所述各个类所属的Class文件划分至对应梯度等级的Dex文件中。
可选的,所述装置600还包括:
添加模块,用于在所述加载码中添加记录器,所述记录器用于在运行时记录启动时所采用的目标入口方法和启动过程中加载的目标Dex文件的编号序列,以便在下一次启动时当匹配至所述目标入口方法时,根据所述目标Dex文件的编号序列加载目标Dex文件。
可选的,所述装置600还包括:
打包模块,用于将所有的Dex文件形成的Dex集打包成安装包。
本申请实施例还提供了一种用于实现Dex分包的设备,该设备具体可以是服务器,图7是本申请实施例提供的一种服务器结构示意图,该服务器700可因配置或性能不同而产生比较大的差异,可以包括一个或一个以上中央处理器(central processing units,CPU)722(例如,一个或一个以上处理器)和存储器732,一个或一个以上存储应用程序742或数据744的存储介质730(例如一个或一个以上海量存储设备)。其中,存储器732和存储介质730可以是短暂存储或持久存储。存储在存储介质730的程序可以包括一个或一个以上模块(图示没标出),每个模块可以包括对服务器中的一系列指令操作。更进一步地,中央处理器722可以设置为与存储介质730通信,在服务器700上执行存储介质730中的一系列指令操作。
服务器700还可以包括一个或一个以上电源726,一个或一个以上有线或无线网络接口750,一个或一个以上输入输出接口758,和/或,一个或一个以上操作系统741,例如Windows ServerTM,Mac OS XTM,UnixTM,LinuxTM,FreeBSDTM等等。
上述实施例中由服务器所执行的步骤可以基于该图7所示的服务器结构。
其中,CPU 722用于执行如下步骤:
获取Class文件集、入口方法列表以及Dex拆分梯度;其中,所述Class文件集中包括多个Class文件,每个所述Class文件包括一个类;
根据所述Class文件集和所述入口方法列表,确定由入口方法路由至各个类的执行有向图;
根据所述执行有向图,确定各个类到入口方法的最小距离;
根据各个类到入口方法的最小距离和所述Dex拆分梯度,将所述Class文件集中每个所述Class文件划分至对应梯度的Dex文件中;
遍历每个Dex文件中Class文件中的类,在当前类与其所调用的类不属于同一Dex文件时,在所述当前类的调用指令前端添加加载码,其中,所述加载码用于在执行时动态加载下一个Dex文件到运行时环境。
所述CPU722还用于执行本申请实施例提供的Dex分包方法的任意一种实现方式的步骤。
本申请实施例还提供了另一种设备,该设备具体可以是终端,如图8所示,为了便于说明,仅示出了与本申请实施例相关的部分,具体技术细节未揭示的,请参照本申请实施例方法部分。该终端可以为包括台式机、一体机、笔记本电脑等任意终端设备,以终端为台式机为例:
图8示出的是与本申请实施例提供的终端相关的台式机的部分结构的框图。参考图8,台式机包括:射频(英文全称:Radio Frequency,英文缩写:RF)电路810、存储器820、输入单元830、显示单元840、传感器850、音频电路860、无线保真(英文全称:wirelessfidelity,英文缩写:WiFi)模块870、处理器880、以及电源890等部件。本领域技术人员可以理解,图8中示出的台式机结构并不构成对台式机的限定,可以包括比图示更多或更少的部件,或者组合某些部件,或者不同的部件布置。
下面结合图8对台式机的各个构成部件进行具体的介绍:
RF电路810可用于收发信息或通话过程中,信号的接收和发送,特别地,将基站的下行信息接收后,给处理器880处理;另外,将设计上行的数据发送给基站。通常,RF电路810包括但不限于天线、至少一个放大器、收发信机、耦合器、低噪声放大器(英文全称:LowNoise Amplifier,英文缩写:LNA)、双工器等。
存储器820可用于存储软件程序以及模块,处理器880通过运行存储在存储器820的软件程序以及模块,从而执行台式机的各种功能应用以及数据处理。存储器820可主要包括存储程序区和存储数据区,其中,存储程序区可存储操作系统、至少一个功能所需的应用程序(比如声音播放功能、图像播放功能等)等;存储数据区可存储根据台式机的使用所创建的数据(比如音频数据、电话本等)等。此外,存储器820可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他易失性固态存储器件。
输入单元830可用于接收输入的数字或字符信息,以及产生与台式机的用户设置以及功能控制有关的键信号输入。具体地,输入单元830可包括触控面板831以及其他输入设备832。触控面板831,也称为触摸屏,可收集用户在其上或附近的触摸操作(比如用户使用手指、触笔等任何适合的物体或附件在触控面板831上或在触控面板831附近的操作),并根据预先设定的程式驱动相应的连接装置。可选的,触控面板831可包括触摸检测装置和触摸控制器两个部分。其中,触摸检测装置检测用户的触摸方位,并检测触摸操作带来的信号,将信号传送给触摸控制器;触摸控制器从触摸检测装置上接收触摸信息,并将它转换成触点坐标,再送给处理器880,并能接收处理器880发来的命令并加以执行。此外,可以采用电阻式、电容式、红外线以及表面声波等多种类型实现触控面板831。除了触控面板831,输入单元830还可以包括其他输入设备832。具体地,其他输入设备832可以包括但不限于物理键盘、功能键(比如音量控制按键、开关按键等)、轨迹球、鼠标、操作杆等中的一种或多种。
显示单元840可用于显示由用户输入的信息或提供给用户的信息以及台式机的各种菜单。显示单元840可包括显示面板841,可选的,可以采用液晶显示器(英文全称:LiquidCrystal Display,英文缩写:LCD)、有机发光二极管(英文全称:Organic Light-EmittingDiode,英文缩写:OLED)等形式来配置显示面板841。进一步的,触控面板831可覆盖显示面板841,当触控面板831检测到在其上或附近的触摸操作后,传送给处理器880以确定触摸事件的类型,随后处理器880根据触摸事件的类型在显示面板841上提供相应的视觉输出。虽然在图8中,触控面板831与显示面板841是作为两个独立的部件来实现台式机的输入和输入功能,但是在某些实施例中,可以将触控面板831与显示面板841集成而实现台式机的输入和输出功能。
台式机还可包括至少一种传感器850,比如光传感器以及其他传感器。具体地,光传感器可包括环境光传感器,环境光传感器可根据环境光线的明暗来调节显示面板841的亮度。音频电路860、扬声器861,传声器862可提供用户与台式机之间的音频接口。音频电路860可将接收到的音频数据转换后的电信号,传输到扬声器861,由扬声器861转换为声音信号输出;另一方面,传声器862将收集的声音信号转换为电信号,由音频电路860接收后转换为音频数据,再将音频数据输出处理器880处理后,经RF电路810以发送给比如另一台式机,或者将音频数据输出至存储器820以便进一步处理。
WiFi属于短距离无线传输技术,台式机通过WiFi模块870可以帮助用户收发电子邮件、浏览网页和访问流式媒体等,它为用户提供了无线的宽带互联网访问。虽然图8示出了WiFi模块870,但是可以理解的是,其并不属于台式机的必须构成,完全可以根据需要在不改变发明的本质的范围内而省略。
处理器880是台式机的控制中心,利用各种接口和线路连接整个台式机的各个部分,通过运行或执行存储在存储器820内的软件程序和/或模块,以及调用存储在存储器820内的数据,执行台式机的各种功能和处理数据,从而对台式机进行整体监控。可选的,处理器880可包括一个或多个处理单元;优选的,处理器880可集成应用处理器和调制解调处理器,其中,应用处理器主要处理操作系统、用户界面和应用程序等,调制解调处理器主要处理无线通信。可以理解的是,上述调制解调处理器也可以不集成到处理器880中。
台式机还包括给各个部件供电的电源890(比如电池),优选的,电源可以通过电源管理系统与处理器880逻辑相连,从而通过电源管理系统实现管理充电、放电、以及功耗管理等功能。
尽管未示出,台式机还可以包括摄像头、蓝牙模块等,在此不再赘述。
在本申请实施例中,该终端所包括的处理器880还具有以下功能:
获取Class文件集、入口方法列表以及Dex拆分梯度;其中,所述Class文件集中包括多个Class文件,每个所述Class文件包括一个类;
根据所述Class文件集和所述入口方法列表,确定由入口方法路由至各个类的执行有向图;
根据所述执行有向图,确定各个类到入口方法的最小距离;
根据各个类到入口方法的最小距离和所述Dex拆分梯度,将所述Class文件集中每个所述Class文件划分至对应梯度的Dex文件中;
遍历每个Dex文件中Class文件中的类,在当前类与其所调用的类不属于同一Dex文件时,在所述当前类的调用指令前端添加加载码,其中,所述加载码用于在执行时动态加载下一个Dex文件到运行时环境。
所述处理器880还用于执行本申请实施例提供的Dex分包方法的任意一种实现方式的步骤。
本申请实施例还提供一种软件开发系统,该系统具体包括:编译器、Dex分包器和Apk打包器;其中,编译器,具体用于将应用的源码文件转换成Class文件得到Class文件集;Dex分包器,具体用于获取所述Class文件集、入口方法列表以及Dex拆分梯度;其中,所述Class文件集中包括多个Class文件,每个所述Class文件包括一个类;根据所述Class文件集和所述入口方法列表,确定由入口方法路由至各个类的执行有向图;根据所述执行有向图,确定各个类到入口方法的最小距离;根据各个类到入口方法的最小距离和所述Dex拆分梯度,将所述Class文件集中每个所述Class文件划分至对应梯度的Dex文件中;遍历每个Dex文件中Class文件中的类,在当前类与其所调用的类不属于同一Dex文件时,在所述当前类的调用指令前端添加加载码,其中,所述加载码用于在执行时动态加载下一个Dex文件到运行时环境;Apk打包器具体用于将所有的Dex文件形成的Dex集打包成安装包。
本申请实施例还提供一种计算机可读存储介质,用于存储计算机程序,该计算机程序用于执行前述各个实施例所述的一种Dex分包方法中的任意一种实施方式。
本申请实施例还提供一种包括指令的计算机程序产品,当其在计算机上运行时,使得计算机执行前述各个实施例所述的一种Dex分包方法中的任意一种实施方式。
所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统,装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
在本申请所提供的几个实施例中,应该理解到,所揭露的系统,装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本申请各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本申请各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(英文全称:Read-OnlyMemory,英文缩写:ROM)、随机存取存储器(英文全称:Random Access Memory,英文缩写:RAM)、磁碟或者光盘等各种可以存储程序代码的介质。
应当理解,在本申请中,“至少一个(项)”是指一个或者多个,“多个”是指两个或两个以上。“和/或”,用于描述关联对象的关联关系,表示可以存在三种关系,例如,“A和/或B”可以表示:只存在A,只存在B以及同时存在A和B三种情况,其中A,B可以是单数或者复数。字符“/”一般表示前后关联对象是一种“或”的关系。“以下至少一项(个)”或其类似表达,是指这些项中的任意组合,包括单项(个)或复数项(个)的任意组合。例如,a,b或c中的至少一项(个),可以表示:a,b,c,“a和b”,“a和c”,“b和c”,或“a和b和c”,其中a,b,c可以是单个,也可以是多个。
以上所述,以上实施例仅用以说明本申请的技术方案,而非对其限制;尽管参照前述实施例对本申请进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本申请各实施例技术方案的精神和范围。
Claims (15)
1.一种Dex分包方法,其特征在于,所述方法包括:
获取Class文件集、入口方法列表以及Dex拆分梯度;其中,所述Class文件集中包括多个Class文件,每个所述Class文件包括一个类;
根据所述Class文件集和所述入口方法列表,确定由入口方法路由至各个类的执行有向图;
根据所述执行有向图,确定各个类到入口方法的最小距离;
根据各个类到入口方法的最小距离和所述Dex拆分梯度,将所述Class文件集中每个所述Class文件划分至对应梯度的Dex文件中;
遍历每个Dex文件中Class文件中的类,在当前类与其所调用的类不属于同一Dex文件时,在所述当前类的调用指令前端添加加载码,其中,所述加载码用于在执行时动态加载下一个Dex文件到运行时环境。
2.根据权利要求1所述的方法,其特征在于,所述根据所述Class文件集和所述入口方法列表,确定由入口方法路由至各个类的执行有向图,包括:
S1:以键值对的方式创建类关系图,所述类关系图中的对象以类作为键Key,以关联类的列表作为对应的值Value;
S2:创建寻访队列,采用所述入口方法列表对所述寻访队列进行初始化;
S3:从所述寻访队列中读取待处理的方法,解析所述待处理的方法的字节码,获取所述待处理的方法中调用的目标类以及所述目标类所属的方法作为目标方法;
S4:将所述目标方法所在的类作为键并将所述目标类作为值形成键值对,将所述键值对插入到所述类关系图中;
S5:将所述目标方法插入到所述寻访队列,并返回执行所述S3,迭代寻访所述寻访队列中每一个方法直到遍历完毕,获得最终更新的所述类关系图作为执行有向图。
3.根据权利要求1所述的方法,其特征在于,所述根据所述执行有向图,确定各个类到入口方法的最小距离,包括:
针对所述入口方法列表中的每个入口方法,从所述执行有向图中选取入口方法所在的类,并设置所述入口方法所在的类的最小距离为零;
按照所述执行有向图中类的执行顺序,遍历每个类,当每次经过所述执行有向图中一个类时,确定所述类所调用的目标类到入口方法的最小距离,当确定出的所述最小距离小于所述目标类在先对应的最小距离时,则更新所述目标类到入口方法的最小距离。
4.根据权利要求1所述的方法,其特征在于,所述根据各个类到入口方法的最小距离和所述Dex拆分梯度,将所述Class文件集中每个所述Class文件划分至对应梯度的Dex文件中,包括:
根据所述Dex拆分梯度和所述各个类到入口方法的最小距离,确定所述各个类对应的梯度等级;
将所述各个类所属的Class文件划分至对应梯度等级的Dex文件中。
5.根据权利要求1所述的方法,其特征在于,所述方法还包括:
在所述加载码中添加记录器,所述记录器用于在运行时记录启动时所采用的目标入口方法和启动过程中加载的目标Dex文件的编号序列,以便在下一次启动时当匹配至所述目标入口方法时,根据所述目标Dex文件的编号序列加载目标Dex文件。
6.根据权利要求1至5任一项所述的方法,其特征在于,所述方法还包括:将所有的Dex文件形成的Dex集打包成安装包。
7.一种Dex分包装置,其特征在于,所述装置包括:
基础数据获取模块,用于获取Class文件集、入口方法列表以及Dex拆分梯度;其中,所述Class文件集中包括多个Class文件,每个所述Class文件包括一个类;
执行有向图构建模块,用于根据所述Class文件集和所述入口方法列表,确定由入口方法路由至各个类的执行有向图;
距离确定模块,用于根据所述执行有向图,确定各个类到入口方法的最小距离;
Dex文件分包模块,用于根据各个类到入口方法的最小距离和所述Dex拆分梯度,将所述Class文件集中每个所述Class文件划分至对应梯度的Dex文件中;
加载码添加模块,用于遍历每个Dex文件中Class文件中的类,在当前类与其所调用的类不属于同一Dex文件时,在所述当前类的调用指令前端添加加载码,其中,所述加载码用于在执行时动态加载下一个Dex文件到运行时环境。
8.根据权利要求7所述的装置,其特征在于,所述执行有向图构建模块,包括:
类关系图创建子模块,用于以键值对的方式创建类关系图,所述类关系图中的对象以类作为键Key,以关联类的列表作为对应的值Value;
寻访队列创建子模块,用于创建寻访队列,采用所述入口方法列表对所述寻访队列进行初始化;
解析子模块,用于从所述寻访队列中读取待处理的方法,解析所述待处理的方法的字节码,获取所述待处理的方法中调用的目标类以及所述目标类所属的方法作为目标方法;
类关系图更新子模块,用于将所述目标方法所在的类作为键并将所述目标类作为值形成键值对,将所述键值对插入到所述类关系图中;
执行有向图确定子模块,用于将所述目标方法插入到所述寻访队列,并触发所述解析子模块迭代寻访所述寻访队列中每一个方法直到遍历完毕,获得最终更新的所述类关系图作为执行有向图。
9.根据权利要求7所述的装置,其特征在于,所述距离确定模块,包括:
设置子模块,用于针对所述入口方法列表中的每个入口方法,从所述执行有向图中选取入口方法所在的类,并设置所述入口方法所在的类的最小距离为零;
遍历子模块,用于按照所述执行有向图中类的执行顺序,遍历每个类,当每次经过所述执行有向图中一个类时,确定所述类所调用的目标类到入口方法的最小距离,当确定出的所述最小距离小于所述目标类在先对应的最小距离时,则更新所述目标类到入口方法的最小距离。
10.根据权利要求7所述的装置,其特征在于,所述Dex文件分包模块,包括:
类划分子模块,用于根据所述Dex拆分梯度和所述各个类到入口方法的最小距离,确定所述各个类对应的梯度等级;
Dex文件分包子模块,用于将所述各个类所属的Class文件划分至对应梯度等级的Dex文件中。
11.根据权利要求7所述的装置,其特征在于,所述装置还包括:
添加模块,用于在所述加载码中添加记录器,所述记录器用于在运行时记录启动时所采用的目标入口方法和启动过程中加载的目标Dex文件的编号序列,以便在下一次启动时当匹配至所述目标入口方法时,根据所述目标Dex文件的编号序列加载目标Dex文件。
12.根据权利要求7所述的装置,其特征在于,所述装置还包括:
打包模块,用于将所有的Dex文件形成的Dex集打包成安装包。
13.一种软件开发系统,其特征在于,包括:
编译器、Dex分包器和Apk打包器;其中,
所述编译器,用于将应用的源码文件转换成Class文件得到Class文件集;
所述Dex分包器,用于获取所述Class文件集、入口方法列表以及Dex拆分梯度;其中,所述Class文件集中包括多个Class文件,每个所述Class文件包括一个类;根据所述Class文件集和所述入口方法列表,确定由入口方法路由至各个类的执行有向图;根据所述执行有向图,确定各个类到入口方法的最小距离;根据各个类到入口方法的最小距离和所述Dex拆分梯度,将所述Class文件集中每个所述Class文件划分至对应梯度的Dex文件中;遍历每个Dex文件中Class文件中的类,在当前类与其所调用的类不属于同一Dex文件时,在所述当前类的调用指令前端添加加载码,其中,所述加载码用于在执行时动态加载下一个Dex文件到运行时环境;
所述Apk打包器,用于将所有的Dex文件形成的Dex集打包成安装包。
14.一种用于Dex分包的计算机设备,其特征在于,包括:
处理器和存储器;其中,
所述存储器用于存储计算机程序;
所述处理器用于运行所述计算机程序以执行权利要求1至6中任一项所述的方法。
15.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质用于存储计算机程序,所述计算机程序用于执行权利要求1至6任一项所述的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201911046993.5A CN110806906B (zh) | 2019-10-30 | 2019-10-30 | 一种Dex分包方法、装置、设备及介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201911046993.5A CN110806906B (zh) | 2019-10-30 | 2019-10-30 | 一种Dex分包方法、装置、设备及介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN110806906A CN110806906A (zh) | 2020-02-18 |
CN110806906B true CN110806906B (zh) | 2022-04-12 |
Family
ID=69489651
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201911046993.5A Active CN110806906B (zh) | 2019-10-30 | 2019-10-30 | 一种Dex分包方法、装置、设备及介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN110806906B (zh) |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116820555B (zh) * | 2023-08-29 | 2023-11-28 | 腾讯科技(深圳)有限公司 | 应用程序的分包方法、装置、电子设备及可读存储介质 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105046116A (zh) * | 2015-06-25 | 2015-11-11 | 上海斐讯数据通信技术有限公司 | Android系统中保护dex文件不被反编译的方法 |
CN106775842A (zh) * | 2016-11-30 | 2017-05-31 | 北京酷我科技有限公司 | 一种可自定义的dex分包的方法 |
CN108491235A (zh) * | 2018-03-21 | 2018-09-04 | 北京理工大学 | 结合动态加载和函数Native化的DEX保护方法 |
Family Cites Families (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
KR20140139392A (ko) * | 2013-05-27 | 2014-12-05 | 삼성전자주식회사 | 모바일 장치를 위한 애플리케이션 실행 파일 생성방법, 모바일 장치의 애플리케이션 실행 방법, 애플리케이션 실행 파일 생성 장치 및 모바일 장치 |
KR101740134B1 (ko) * | 2015-08-10 | 2017-05-26 | 라인 가부시키가이샤 | 어플리케이션의 코드 난독화를 위한 시스템 및 방법 |
KR101857001B1 (ko) * | 2017-03-03 | 2018-05-14 | 숭실대학교산학협력단 | 안드로이드 동적 로딩 파일 추출 방법, 이를 수행하기 위한 기록 매체 및 시스템 |
-
2019
- 2019-10-30 CN CN201911046993.5A patent/CN110806906B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105046116A (zh) * | 2015-06-25 | 2015-11-11 | 上海斐讯数据通信技术有限公司 | Android系统中保护dex文件不被反编译的方法 |
CN106775842A (zh) * | 2016-11-30 | 2017-05-31 | 北京酷我科技有限公司 | 一种可自定义的dex分包的方法 |
CN108491235A (zh) * | 2018-03-21 | 2018-09-04 | 北京理工大学 | 结合动态加载和函数Native化的DEX保护方法 |
Non-Patent Citations (1)
Title |
---|
Android动态加载与反射机制的静态污点分析研究;乐洪舟 等;《计算机研究与发展》;20171231;第313-327页 * |
Also Published As
Publication number | Publication date |
---|---|
CN110806906A (zh) | 2020-02-18 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN108897562B (zh) | 安装包更新方法、装置、介质以及设备 | |
CN108989384B (zh) | 一种数据处理的方法、多云管理系统以及相关设备 | |
EP3336690B1 (en) | Extensible data transformation authoring and validation system | |
CN106649084B (zh) | 函数调用信息的获取方法及装置、测试设备 | |
CN110716715A (zh) | 一种应用程序开发方法、装置、设备及介质 | |
WO2015143865A1 (zh) | 应用场景的识别方法、功耗管理方法、装置及终端设备 | |
CN106502703B (zh) | 一种函数调用方法和装置 | |
CN112527386B (zh) | 应用程序发布方法及装置 | |
US9535666B2 (en) | Dynamic agent delivery | |
CN107368339B (zh) | 容器入口程序运行方法、系统、设备及存储介质 | |
US20190188010A1 (en) | Remote Component Loader | |
US9971611B2 (en) | Monitoring a mobile device application | |
CN110806906B (zh) | 一种Dex分包方法、装置、设备及介质 | |
CN114205365A (zh) | 应用界面迁移系统、方法及相关设备 | |
US10599444B2 (en) | Extensible input stack for processing input device data | |
US20240168730A1 (en) | Systems and methods for remotebuild action-merging | |
CN111596935A (zh) | 一种脚本打包方法、装置、电子设备及存储介质 | |
CN111736839A (zh) | 一种编译链接方法及装置 | |
EP3785777B1 (en) | Information processing system, information processing method, and program for development apparatus | |
US20190213015A1 (en) | Extensible input stack for processing input device data | |
CN112379885B (zh) | 小程序编译方法、装置、设备及可读存储介质 | |
KR102337961B1 (ko) | 모노리틱 아키텍처와 마이크로서비스 아키텍처를 모두 지원하는 개발 프레임워크 제공 시스템, 이를 이용한 애플리케이션 개발 방법 및 이를 위한 컴퓨터 프로그램 | |
CN116028099A (zh) | 一种安装包生成的方法及相关装置、设备和存储介质 | |
CN115269170A (zh) | 内存申请方法及相关设备 | |
US20240168733A1 (en) | Systems and methods for a remotebuild tree cache |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
REG | Reference to a national code |
Ref country code: HK Ref legal event code: DE Ref document number: 40021481 Country of ref document: HK |
|
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |