本发明涉及安卓系统的应用程序开发技术领域,尤其涉及一种应用程序组件化开发方法及装置。
背景技术:
随着安卓系统的应用程序的发展,手机客户端上的单个应用程序的功能越来越多,代码量也随之增加,导致编译一次的时间越来越长,这样非常影响开发效率和应用程序的稳定性、可维护性。而且大公司在开发的应用程序都需要多个部门、多个团队合作并行开发。
这些问题都需要从手机客户端架构方面提供支持。目前普遍的做法是组件化,现有的方案是:首先把功能模块化拆分,然后把每个功能打包成独立的apk,独立的apk中包括代码和资源,接下来把所有的组件apk放在安装包的assets目录下,最后,运行的时候通过改变系统的参数pathclassloader和assetmanager,加载assets目录下的组件apk。
现有技术的缺点是:1、在运行的时候要通过修改安卓系统的参数pathclassloader和assetmanager来加载组件apk,所以会在不同的手机上出现兼容性问题,在安卓系统版本升级后也会出现兼容的风险。2、组件apk是在运行的时候被加载的,而加载组件apk需要时间,特别是在android5.x系统上要对dex文件进行优化,时间会更长。这样就会严重影响用户体验
技术实现要素:
本发明要解决的技术问题是,提供一种应用程序组件化开发方法及装置,克服现有技术中运行应用程序时因加载组件apk而出现的兼容性和性能问题。
本发明采用的技术方案是,所述应用程序组件化开发方法,包括:
从应用程序的组件apk中取出组件可执行程序代码文件并压缩到组件压缩文件中得到新的组件压缩文件;
将所述新的组件压缩文件发布到设定的存储处;
在将所述新的组件压缩文件合并编译成应用程序安装包的过程中,从所述设定的存储处读取所述新的组件压缩文件,将所述新的组件压缩文件中的组件可执行程序代码文件复制到应用程序安装包的根目录中。
进一步的,对所述组件apk的获取过程,包括:
对应用程序各组件对应的功能模块分别进行编译得到组件压缩文件,所述组件压缩文件中包含相应功能模块所需用到的类文件包和库函数资源文件;
对所述组件压缩文件进行编译得到组件可执行程序代码文件;
针对每一个功能模块,基于该功能模块的组件可执行程序代码文件编译成组件apk。
进一步的,所述方法,还包括:从所述设定的存储处读取所述新的组件压缩文件之前,
当开始将所述新的组件压缩文件合并编译成应用程序安装包时,先删除由所述合并编译产生的临时文件;所述临时文件包含类文件包和库函数资源文件,再响应将所述组件压缩文件中的类文件向主可执行程序代码文件转化的命令。
进一步的,所述编译是由gradle编译工具实现的。
进一步的,所述方法,还包括:
当所述合并编译完成后,所述主可执行程序代码文件也位于应用程序安装包的根目录中;
当所述应用程序安装包在终端系统中安装运行时,由终端系统对所述应用程序安装包根目录中的组件可执行程序代码文件和主可执行程序代码文件合并优化成一个可执行程序代码文件;或者,由终端系统提供的多可执行程序代码加载工具从所述应用程序安装包根目录中加载主可执行程序代码文件和所有的组件可执行程序代码文件。
本发明还提供一种应用程序组件化开发装置,包括:
组件压缩模块,用于从应用程序的组件apk中取出组件可执行程序代码文件并压缩到组件压缩文件中得到新的组件压缩文件;
组件发布模块,用于将所述新的组件压缩文件发布到设定的存储处;
组件复制模块,用于在将所述新的组件压缩文件合并编译成应用程序安装包的过程中,从所述设定的存储处读取所述新的组件压缩文件,将所述新的组件压缩文件中的组件可执行程序代码文件复制到应用程序安装包的根目录中。
进一步的,所述装置,还包括:
组件apk获取模块,用于对应用程序各组件对应的功能模块分别进行编译得到组件压缩文件,所述组件压缩文件中包含相应功能模块所需用到的类文件包和库函数资源文件;对所述组件压缩文件进行编译得到组件可执行程序代码文件;针对每一个功能模块,基于该功能模块的组件可执行程序代码文件编译成组件apk。
进一步的,所述装置,还包括:
命令拦截模块,用于在所述组件复制模块从所述设定的存储处读取所述新的组件压缩文件之前,当开始将所述新的组件压缩文件合并编译成应用程序安装包时,先删除由所述合并编译产生的临时文件;所述临时文件包含类文件包和库函数资源文件,再响应将所述组件压缩文件中的类文件向主可执行程序代码文件转化的命令。
进一步的,所述编译是由gradle编译工具实现的。
进一步的,当所述合并编译完成后,所述主可执行程序代码文件也位于应用程序安装包的根目录中;
所述装置,还包括:
安装运行模块,用于当所述应用程序安装包在终端系统中安装运行时,通过终端系统对所述应用程序安装包根目录中的组件可执行程序代码文件和主可执行程序代码文件合并优化成一个可执行程序代码文件;或者,通过终端系统提供的多可执行程序代码加载工具从所述应用程序安装包根目录中加载主可执行程序代码文件和所有的组件可执行程序代码文件。
采用上述技术方案,本发明至少具有下列优点:
本发明所述应用程序组件化开发方法及装置,由于在生成组件apk时已完成了组件dex文件的编译和生成,后续直接将组件dex文件放入应用程序安装包的根目录下,应用程序安装包在终端系统中安装运行时无需动态加载,也避免了在不同终端上的兼容性和性能问题;本发明实现了基于dex文件拆分的组件化方案,支持多部门并行开发;本发明无需再像现有技术一样在合成编译的过程中把各组件aar文件一边编译成组件dex文件一边合成到主dex文件中,而这个过程站总编译时间的80%左右,本发明可以有效减少安卓系统开发过程中的代码编译时间。
附图说明
图1为本发明第一实施例的应用程序组件化开发方法流程图;
图2为本发明第二实施例的应用程序组件化开发方法流程图;
图3为本发明第三实施例的应用程序组件化开发方法流程图;
图4为本发明第四实施例的应用程序组件化开发方法流程图;
图5为本发明第五实施例的应用程序组件化开发装置组成结构示意图;
图6为本发明第六实施例的应用程序组件化开发装置组成结构示意图;
图7为本发明第七实施例的应用程序组件化开发装置组成结构示意图;
图8为本发明第八实施例的应用程序组件化开发装置组成结构示意图;
图9为本发明第九实施例的组件化系统结构示意图;
图10为本发明第九实施例代码编译部分的流程示意图。
具体实施方式
为更进一步阐述本发明为达成预定目的所采取的技术手段及功效,以下结合附图及较佳实施例,对本发明进行详细说明如后。
本发明第一实施例,一种应用程序组件化开发方法,如图1所示,包括以下具体步骤:
步骤s101,从组件apk中取出组件可执行程序代码文件并压缩到组件压缩文件中得到新的组件压缩文件。
可选的,应用程序中的各组件可以是:业务组件、服务组件、中间件等。每个组件对应一个组件apk,本步骤中记载的是组件级的apk,由于本发明实施例是基于dex文件拆分的组件化方案,支持多部门并行开发,每个部门开发一个组件apk,可以提高开发的效率。
在本领域中,可执行程序代码文件简称为dex文件,压缩文件简称aar,应用程序安装包简称为apk。
步骤s102,将所述新的组件压缩文件发布到设定的存储处。
可选的,设定的存储处可以为maven仓库。
步骤s103,在将所述新的组件压缩文件合并编译成应用程序安装包的过程中,从所述设定的存储处读取所述新的组件压缩文件,将所述新的组件压缩文件中的组件可执行程序代码文件复制到应用程序安装包的根目录中。
可选的,所述编译是由gradle编译工具实现的。
在本发明实施例中,在将组件apk合并编译成应用程序安装包的过程中,直接将组件dex文件放入应用程序安装包的根目录下,现有技术中主dex文件也位于该根目录中,应用程序安装包在终端系统中安装运行时无需动态加载各组件dex文件,也避免了在不同终端上的兼容性和性能问题。
本发明第二实施例,一种应用程序组件化开发方法,如图2所示,包括以下具体步骤:
步骤s100,对应用程序各组件对应的功能模块分别进行编译得到组件压缩文件,所述组件压缩文件中包含相应功能模块所需用到的类文件包和库函数资源文件;对所述组件压缩文件进行编译得到组件可执行程序代码文件;针对每一个功能模块,基于该功能模块的组件可执行程序代码文件编译成组件apk。
可选的,应用程序中的各组件可以是:业务组件、服务组件、中间件等。每个组件对应一个功能模块。
在本领域中,类文件通常称为jar包,库函数资源文件简称为资源。
步骤s101,从组件apk中取出组件可执行程序代码文件并压缩到组件压缩文件中得到新的组件压缩文件;
步骤s102,将所述新的组件压缩文件发布到设定的存储处;
步骤s103,在将组件apk合并编译成应用程序安装包的过程中,从所述设定的存储处读取所述新的组件压缩文件,将所述新的组件压缩文件中的组件可执行程序代码文件复制到应用程序安装包的根目录中。
可选的,所述编译是由gradle编译工具实现的。
在本发明实施例中,由于在生成组件apk时已完成了组件dex文件的编译和生成,后续直接将组件dex文件放入应用程序安装包的根目录下,现有技术中主dex文件也位于该根目录中,应用程序安装包在终端系统中安装运行时无需动态加载各组件dex文件,也避免了在不同终端上的兼容性和性能问题。
本发明第三实施例,一种应用程序组件化开发方法,如图3所示,包括以下具体步骤:
步骤s100,对应用程序各组件对应的功能模块分别进行编译得到组件压缩文件,所述组件压缩文件中包含相应功能模块所需用到的类文件包和库函数资源文件;对所述组件压缩文件进行编译得到组件可执行程序代码文件;针对每一个功能模块,基于该功能模块的组件可执行程序代码文件编译成组件apk。
步骤s101,从组件apk中取出组件可执行程序代码文件并压缩到组件压缩文件中得到新的组件压缩文件;
步骤s102,将所述新的组件压缩文件发布到设定的存储处;
步骤s102-a,当开始将所述新的组件压缩文件合并编译成应用程序安装包时,先删除由所述合并编译产生的临时文件;所述临时文件包含类文件包和库函数资源文件,再响应将所述组件压缩文件中的类文件向主可执行程序代码文件转化的命令。
本发明实施例在将所述新的组件压缩文件合并编译成应用程序安装包的过程中,对gradle编译工具的流程做了一定的干预,就是先对将所述组件压缩文件中的类文件向主可执行程序代码文件转化的命令进行拦截,以避免所述组件压缩文件向主可执行程序代码文件的编译转化,目的是为了节省编译的时间,然后通过删除所述临时文件,不给所述命令提供转化的数据基础,以确保不产生现有的合并编译消耗。
步骤s103,在将所述新的组件压缩文件合并编译成应用程序安装包的过程中,从所述设定的存储处读取所述新的组件压缩文件,将所述新的组件压缩文件中的组件可执行程序代码文件复制到应用程序安装包的根目录中。
可选的,所述编译是由gradle编译工具实现的。
在本发明实施例中,由于在生成组件apk时已完成了组件dex文件的编译和生成,后续直接将组件dex文件放入应用程序安装包的根目录下,现有技术中主dex文件也位于该根目录中,应用程序安装包在终端系统中安装运行时无需动态加载各组件dex文件,也避免了在不同终端上的兼容性和性能问题。
本发明第四实施例,一种应用程序组件化开发方法,如图4所示,包括以下具体步骤:
步骤s100,对应用程序各组件对应的功能模块分别进行编译得到组件压缩文件,所述组件压缩文件中包含相应功能模块所需用到的类文件包和库函数资源文件;对所述组件压缩文件进行编译得到组件可执行程序代码文件;针对每一个功能模块,基于该功能模块的组件可执行程序代码文件编译成组件apk。
步骤s101,从组件apk中取出组件可执行程序代码文件并压缩到组件压缩文件中得到新的组件压缩文件;
步骤s102,将所述新的组件压缩文件发布到设定的存储处;
步骤s102-a,当开始将所述新的组件压缩文件合并编译成应用程序安装包时,先删除由所述合并编译产生的临时文件;所述临时文件包含类文件包和库函数资源文件,再响应将所述组件压缩文件中的类文件向主可执行程序代码文件转化的命令。
步骤s103,在将所述新的组件压缩文件合并编译成应用程序安装包的过程中,从所述设定的存储处读取所述新的组件压缩文件,将所述新的组件压缩文件中的组件可执行程序代码文件复制到应用程序安装包的根目录中。
可选的,所述编译是由gradle编译工具实现的。
步骤s104,当所述合并编译完成后,所述主可执行程序代码文件也位于应用程序安装包的根目录中;当所述应用程序安装包在终端系统中安装运行时,由终端系统对所述应用程序安装包根目录中的组件可执行程序代码文件和主可执行程序代码文件合并优化成一个可执行程序代码文件;或者,由终端系统提供的多可执行程序代码加载工具从所述应用程序安装包根目录中加载主可执行程序代码文件和所有的组件可执行程序代码文件。
在本发明实施例中,一方面,由于在生成组件apk时已完成了组件dex文件的编译和生成,后续直接将组件dex文件放入应用程序安装包的根目录下,现有技术中主dex文件也位于该根目录中,应用程序安装包在终端系统中安装运行时无需动态加载各组件dex文件,也避免了在不同终端上的兼容性和性能问题。
另一方面,本发明实施例在应用程序安装包在终端系统中安装运行的过程中,无需再像现有技术一样在合成编译的过程中把各组件aar文件一边编译成组件dex文件一边合成到主dex文件中,而这个过程站总编译时间的80%左右,本发明可以有效减少安卓系统开发过程中的代码编译时间。
本发明第五实施例,与第一实施例对应,本实施例介绍一种应用程序组件化开发装置,如图5所示,包括以下组成部分:
组件压缩模块501,用于从组件apk中取出组件可执行程序代码文件并压缩到组件压缩文件中得到新的组件压缩文件;
可选的,应用程序中的各组件可以是:业务组件、服务组件、中间件等。每个组件对应一个组件apk。
组件发布模块502,用于将所述新的组件压缩文件发布到设定的存储处;
组件复制模块503,用于在将所述新的组件压缩文件合并编译成应用程序安装包的过程中,从所述设定的存储处读取所述新的组件压缩文件,将所述新的组件压缩文件中的组件可执行程序代码文件复制到应用程序安装包的根目录中。
可选的,所述编译是由gradle编译工具实现的。
本发明第六实施例,与第二实施例对应,本实施例介绍一种应用程序组件化开发装置,如图6所示,包括以下组成部分:
组件apk获取模块500,用于对应用程序各组件对应的功能模块分别进行编译得到组件压缩文件,所述组件压缩文件中包含相应功能模块所需用到的类文件包和库函数资源文件;对所述组件压缩文件进行编译得到组件可执行程序代码文件;针对每一个功能模块,基于该功能模块的组件可执行程序代码文件编译成组件apk。
可选的,应用程序中的各组件可以是:业务组件、服务组件、中间件等。每个组件对应一个功能模块。
组件压缩模块501,用于从组件apk中取出组件可执行程序代码文件并压缩到组件压缩文件中得到新的组件压缩文件;
组件发布模块502,用于将所述新的组件压缩文件发布到设定的存储处;
组件复制模块503,用于在将所述新的组件压缩文件合并编译成应用程序安装包的过程中,从所述设定的存储处读取所述新的组件压缩文件,将所述新的组件压缩文件中的组件可执行程序代码文件复制到应用程序安装包的根目录中。
可选的,所述编译是由gradle编译工具实现的。
本发明第七实施例,与第三实施例对应,本实施例介绍一种应用程序组件化开发装置,如图7所示,包括以下组成部分:
组件apk获取模块500,用于对应用程序各组件对应的功能模块分别进行编译得到组件压缩文件,所述组件压缩文件中包含相应功能模块所需用到的类文件包和库函数资源文件;对所述组件压缩文件进行编译得到组件可执行程序代码文件;针对每一个功能模块,基于该功能模块的组件可执行程序代码文件编译成组件apk。
组件压缩模块501,用于从组件apk中取出组件可执行程序代码文件并压缩到组件压缩文件中得到新的组件压缩文件;
组件发布模块502,用于将所述新的组件压缩文件发布到设定的存储处;
命令拦截模块502-a,用于当开始将所述新的组件压缩文件合并编译成应用程序安装包时,先删除由所述合并编译产生的临时文件;所述临时文件包含类文件包和库函数资源文件,再响应将所述组件压缩文件中的类文件向主可执行程序代码文件转化的命令。
组件复制模块503,用于在将所述新的组件压缩文件合并编译成应用程序安装包的过程中,从所述设定的存储处读取所述新的组件压缩文件,将所述新的组件压缩文件中的组件可执行程序代码文件复制到应用程序安装包的根目录中。
可选的,所述编译是由gradle编译工具实现的。
本发明第八实施例,与第四实施例对应,本实施例介绍一种应用程序组件化开发装置,如图8所示,包括以下组成部分:
组件apk获取模块500,用于对应用程序各组件对应的功能模块分别进行编译得到组件压缩文件,所述组件压缩文件中包含相应功能模块所需用到的类文件包和库函数资源文件;对所述组件压缩文件进行编译得到组件可执行程序代码文件;针对每一个功能模块,基于该功能模块的组件可执行程序代码文件编译成组件apk。
组件压缩模块501,用于从组件apk中取出组件可执行程序代码文件并压缩到组件压缩文件中得到新的组件压缩文件;
组件发布模块502,用于将所述新的组件压缩文件发布到设定的存储处;
命令拦截模块502-a,用于当开始将所述新的组件压缩文件合并编译成应用程序安装包时,先删除由所述合并编译产生的临时文件;所述临时文件包含类文件包和库函数资源文件,再响应将所述组件压缩文件中的类文件向主可执行程序代码文件转化的命令。
组件复制模块503,用于在将所述新的组件压缩文件合并编译成应用程序安装包的过程中,从所述设定的存储处读取所述新的组件压缩文件,将所述新的组件压缩文件中的组件可执行程序代码文件复制到应用程序安装包的根目录中。
当所述合并编译完成后,所述主可执行程序代码文件也位于应用程序安装包的根目录中;
组件复制模块504,用于在将所述新的组件压缩文件合并编译成应用程序安装包的过程中,从所述设定的存储处读取所述新的组件压缩文件,将所述新的组件压缩文件中的组件可执行程序代码文件复制到应用程序安装包的根目录中。
可选的,所述编译是由gradle编译工具实现的。
本发明第九实施例,本实施例是在上述实施例的基础上,结合附图9~10介绍一个本发明的应用实例。
本发明实施例的应用程序组件化开发方案依次分为四个部分:组件拆分部分、组件发布部分、代码编译部分、安装运行部分
一、组件拆分部分:
如图9所示,组件化系统结构分为下面三部分:
组件:可以独立出一个功能模块,只对外提供协议接口;图9中示出了业务组件和服务组件。
业务中间件:提供业务代码共享;
底层中间件:提供底层代码共享;
这样拆分成一个个组件就可以让每个团队开发自己的组件而不互相影响,提升开发效率。
二、组件发布部分:
组件发布部分包括以下步骤:
步骤1,把功能模块编译出组件aar文件。
步骤2,把组件aar文件编译成组件apk包。
步骤3,解压步骤2产出的组件apk包,取出组件dex文件。
步骤4,步骤3产出的组件dex压缩到步骤1的组件aar文件中(比如组件aar文件中的目录assets/dexs处),生成新的组件aar文件。
步骤5,把步骤4产出的新的组件aar文件发布到maven仓库中待用。
三、代码编译部分:
当把所有的新的组件aar文件都发布完成后,开发人员只需要引用这些新的组件aar文件就可以了。在编译过程中需要自定义编译脚本,不需要把aar文件中的代码编译到dex文件中,只需要把新的组件aar文件中包含的组件dex文件复制到应用程序安装包的根目录就可以,这样就大大减少了编译时间。
如图10所示,代码编译部分的流程如下:
步骤11,利用gradle编译工具执行由组件aar文件合并编译成apk的流程开始。
步骤12,删除由gradle编译工具生成的临时文件。
步骤13,响应transformclasseswithdex命令时,读取临时文件中的类文件合并成主dex文件失败。
步骤14,复制组件aar文件目录中的组件dex文件到gradle编译工具指定的目录中即apk的根目录中,这样打出来就是一个正常的apk,组件dex文件和主dex文件在同一个目录中。
本发明实施例在这个过程中节省了把组件代码合并到主dex文件的过程,而这个过占总编译时间的80%左右,所以可以节省80%的编译时间。
四、安装运行过程:
通过上面编译出的apk包在安卓android5.x系统上在安装过程中就会把所有的各组件dex文件与主dex文件合并成一个并进行了优化,在android4.x上用系统提供的mutildex工具就可加载。所以没有兼容问题和性能问题。
用本发明实施例的以上方案可以做到减小代码编译时间、支持并行开发、没有系统兼容问题和性能问题。
本发明实施例的技术方案带来的有益效果在于:
1、大幅减小了代码编译时间,支持多团队并行开发,提高开发效率。
2、没有系统兼容问题,提高了安全性和维定性。
3、组件不用运行时动态加载,提升用户体验。
本发明第十实施例,本实施例的应用程序组件化开发的流程与第一、二、三或四实施例相同,区别在于,在工程实现上,本实施例可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的所述方法可以以计算机软件产品的形式体现出来,该计算机软件产品存储在一个存储介质(如rom/ram、磁碟、光盘)中,包括若干指令用以使得一台设备(可以是计算机等)执行本发明实施例所述的方法。
通过具体实施方式的说明,应当可对本发明为达成预定目的所采取的技术手段及功效得以更加深入且具体的了解,然而所附图示仅是提供参考与说明之用,并非用来对本发明加以限制。