本发明涉及计算机领域中的编译技术,尤其涉及一种编译方法、装置、设备和计算机可读存储介质。
背景技术:
在安卓(android)操作系统的应用程序的开发过程中,对于大型项目,编译需要占用开发人员大量时间,同时因为编译时需要耗费大量内存与中央处理器(centralprocessingunit,cpu)资源,编译时电脑会卡顿导致开发人员处于空闲状态,影响开发效率。同时,现有技术中编译代码时是将代码作为一个整体进行编译。当开发人员更改代码或者由于应用程序的功能更新等原因使得代码发生变化时,需要对所有的代码重新进行编译才能使代码生效。但是,这也增加了工作量和计算量,需要耗费更长的时间。
技术实现要素:
为解决上述技术问题,本发明实施例期望提供一种编译方法、装置、设备和计算机可读存储介质,解决了现有的代码编译方案中当某一些代码发生修改时,需要将所有的代码重新编译的问题,减少了工作量和计算量,降低了时间,提高了效率。
本发明的技术方案是这样实现的:
第一方面,提供一种编译方法,所述方法包括:
确定待安装应用的第一待编译代码对应的静态文件,并基于所述待安装应用的接口文件得到第一文件;其中,第一文件为保存所述待安装应用的程序代码的文本文件;
按照所述第一文件中的第二待编译代码的功能,将所述第二待编译代码进行划分得到至少两个代码模块;其中,所述第二待编译代码的功能是预先存储的;
分别将每个代码模块中的待编译代码进行编译,得到第一类文件;
基于所述静态文件、第一文件和第一类文件生成预设类型的第二类文件;
基于待安装应用的资源生成第二文件,并基于所述第二类文件和第二文件得到所述待安装应用的安装包;其中,所述第二文件为包括有所述待安装应用的资源信息的文件。
第二方面,提供一种编译装置,所述装置包括:第一获取单元、处理单元、第二获取单元和生成单元,其中:
所述第一获取单元,用于确定待安装应用的第一待编译代码对应的静态文件,并基于所述待安装应用的接口文件得到第一文件;其中,第一文件为保存所述待安装应用的程序代码的文本文件;
所述处理单元,用于按照所述第一文件中的第二待编译代码的功能,将所述第二待编译代码进行划分得到至少两个代码模块;其中,所述第二待编译代码的功能是预先存储的;
所述第二获取单元,用于分别将每个代码模块中的待编译代码进行编译,得到第一类文件;
所述生成单元,用于基于所述静态文件、第一文件和第一类文件生成预设类型的第二类文件;
所述第一获取单元,还用于基于待安装应用的资源生成第二文件,并基于所述第二类文件和第二文件得到所述待安装应用的安装包;其中,所述第二文件为包括有所述待安装应用的资源信息的文件。
第三方面,提供一种编译设备,所述设备包括:存储器和处理器,其中:
所述存储器,用于存储所述待安装应用对应的静态文件;
所述处理器,用于确定待安装应用的第一待编译代码对应的静态文件,并基于所述待安装应用的接口文件得到第一文件;其中,第一文件为保存所述待安装应用的程序代码的文本文件;按照所述第一文件中的第二待编译代码的功能,将所述第二待编译代码进行划分得到至少两个代码模块;其中,所述第二待编译代码的功能是预先存储的;分别将每个代码模块中的待编译代码进行编译,得到第一类文件;基于所述静态文件、第一文件和第一类文件生成预设类型的第二类文件;基于待安装应用的资源生成第二文件,并基于所述第二类文件和第二文件得到所述待安装应用的安装包;其中,所述第二文件为包括有所述待安装应用的资源信息的文件。
第四方面,提供一种计算机可读存储介质,所述计算机可读存储介质中存储有一个或多个计算机程序,该计算机程序被处理器执行时实现第一方面所述方法的步骤。
本发明的实施例所提供的编译方法、装置、设备和计算机可读存储介质,确定待安装应用的第一待编译代码对应的静态文件,并基于待安装应用的接口文件得到第一文件,第一文件为保存待安装应用的程序代码的文本文件,然后按照第一文件中的第二待编译代码的功能,将第二待编译代码进行划分得到至少两个代码模块,之后分别将每个代码模块中的待编译代码进行编译,得到第一类文件,基于该静态文件、第一文件和第一类文件生成预设类型的第二类文件,最终基于待安装应用的资源生成第二文件,并基于第二类文件和第二文件得到待安装应用的安装包,第二文件为包括有待安装应用的资源信息的文件,这样,在编译代码的时候按照划分后得到的代码模块,按照代码模块对代码进行编译,当一些代码发生变化时只需要对发生变化的代码所在的代码模块中的代码进行重新编译,而不需对所有的代码进行重新编译,解决了现有的代码编译方案中当某一些代码发生修改时,需要将所有的代码重新编译的问题,减少了工作量和计算量,降低了时间,提高了效率。
附图说明
图1为本发明的实施例提供的一种编译方法的流程示意图;
图2为本发明的实施例提供的一种划分得到的代码模块的示意图;
图3为本发明的实施例提供的一种进行代码模块划分和编译后自动确定是否新增dex文件的示意图;
图4为本发明的实施例提供的另一种编译方法的流程示意图;
图5为本发明的实施例提供的一种编译装置的结构示意图;
图6为本发明的实施例提供的一种编译设备的结构示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述。
本发明的实施例提供一种编译方法,参照图1所示,该方法包括以下步骤:
步骤101、获取待安装应用的第一待编译代码对应的静态文件,并基于待安装应用的接口文件得到第一文件。
其中,第一文件为保存待安装应用的程序代码的文本文件。
具体的,步骤101获取待安装应用的第一待编译代码对应的静态文件,并基于待安装应用的接口文件得到第一文件可以由编译装置来实现,该编译装置可以是能够用来编译并生成需要安装的应用程序的安装包的终端,可以是移动终端。在具体实现中该终端可以是开发人员在开发应用程序的安装包时专门使用的终端,例如台式电脑、笔记本电脑等。
第一待编译代码可以是编程人员编写的用于实现待安装应用的各个功能的程序代码,静态文件可以是r.java文件,具体的r.java文件可以是使用android的软件开发工具包(softwaredevelopmentkit,sdk)下的aapt(androidassetpackagingtool)对待安装应用的程序代码中的资源文件处理后生成的。其中,资源文件具体可以指的是待安装应用的程序代码中的图片和字符串等文件。
接口文件可以是.aidl文件,第一文件可以是对应的.java文件;第一文件可以是使用android的sdk下的aidl(androidinterfacedefinitionlanguage)工具对待安装应用的程序代码中的.aidl文件处理生成的,该.java文件可以存储在/gen目录下;例如,若.aidl文件为a.aidl文件,对应生成的.java文件为a.java文件。
步骤102、按照第一文件中的第二待编译代码的功能,将第二待编译代码进行划分得到至少两个代码模块。
其中,第二待编译代码的功能是预先存储的。
具体的,步骤102按照第一文件中的第二待编译代码的功能,将第二待编译代码进行划分得到至少两个代码模块可以是编译装置实现的。第二待编译代码可以是.java文件中的程序代码,例如可以是a.java文件中的程序代码。第二待编译代码的功能可以是.java文件中的程序代码中的不同的程序代码对应的用于实现待安装应用的不同功能。划分得到的代码模块中,每个代码模块对应的待安装应用能够实现的功能是不同的。第二待编译代码与第一待编译代码不同。
步骤103、分别将每个代码模块中的待编译代码进行编译,得到第一类文件。
具体的,步骤103分别将每个代码模块中的待编译代码进行编译,得到第一类文件可以由编译装置来实现。第一类文件可以是对应的.class文件,.class文件中包括的是编译后的程序代码,这些编译后的程序代码是机器(终端)能够识别的程序代码。
步骤104、基于静态文件、第一文件和第一类文件,生成预设类型的第二类文件。
具体的,步骤104基于静态文件、第一文件和第一类文件,生成预设类型的第二类文件可以由编译装置来实现;预设类型的第二类文件可以是将得到的静态文件、第一文件和第一类文件打包后进行一定的处理后得到的,具体可以是将得到的r.java文件、.java文件和.class文件打包后进行一定的处理后得到的。第二类文件可以是classes.dex文件,其中,预设类型可以是机器(终端)能够识别的一种文件类型。
步骤105、基于待安装应用的资源生成第二文件,并基于第二类文件和第二文件得到待安装应用的安装包。
其中,第二文件为包括有待安装应用的资源信息的文件。
具体的,步骤104基于待安装应用的资源生成第二文件,并基于第二类文件和第二文件得到待安装应用的安装包可以由编译装置来实现;第二文件可以是resources.ap_文件,第二文件可以是使用android的sdk下的aapt工具对待安装应用的资源进行处理后得到的。其中,待安装应用的资源可以是待安装应用的图片和字符串等信息。
基于第二类文件和第二文件得到待安装应用的安装包可以通过以下方式来实现:使用android的sdk下的安卓安装包创建(androidpackagebuilder,apkbuilder)工具将第二类文件(classes.dex文件)和第二文件(resources.ap_文件)打包后生成未签名的安卓安装包(androidpackage,apk),之后,使用java自带的jarsigner命令对未签名的apk包进行签名后得到的;其中,最终生成的生成待安装应用的安装包是能在中终端(例如手机)上安装的apk包,此时的apk包是中包括有签名信息。
本发明的实施例所提供的编译方法,确定待安装应用的第一待编译代码对应的静态文件,并基于待安装应用的接口文件得到第一文件,第一文件为保存待安装应用的程序代码的文本文件,然后按照第一文件中的第二待编译代码的功能,将第二待编译代码进行划分得到至少两个代码模块,之后分别将每个代码模块中的待编译代码进行编译,得到第一类文件,基于该静态文件、第一文件和第一类文件生成预设类型的第二类文件,最终基于待安装应用的资源生成第二文件,并基于第二类文件和第二文件得到待安装应用的安装包,第二文件为包括有待安装应用的资源信息的文件,这样,在编译代码的时候按照划分后得到的代码模块,按照代码模块对代码进行编译,当一些代码发生变化时只需要对发生变化的代码所在的代码模块中的代码进行重新编译,而不需对所有的代码进行重新编译,解决了现有的代码编译方案中当某一些代码发生修改时,需要将所有的代码重新编译的问题,减少了工作量和计算量,降低了时间,提高了效率。
基于前述实施例,本发明的实施例提供一种编译方法,该方法包括以下步骤:
步骤201、编译装置确定待安装应用的第一待编译代码对应的静态文件,并基于待安装应用的接口文件得到第一文件。
其中,第一文件为保存待安装应用的程序代码的文本文件。
步骤202、编译装置按照第一文件中的第二待编译代码的功能,将第二待编译代码进行划分得到至少两个代码模块。
其中,第二待编译代码的功能是预先存储的。
具体的,划分得到的代码模块的数量是由待安装应用的功能来确定的,如果待安装应用具有十种功能,那此时得到的代码模块就有十个。
本发明实施例中是使用交换虚拟连(联)网技术(switchingvirtualnetworking,svn)等代码版本控制工具基于apacheant工具对android系统中的待安装应用的程序代码进行编译优化的,主要是在整个项目中引用插件机制即将待编译代码划分为代码模块,根据与待安装应用的关系可以包括主代码模块和其余代码模块,其余代码模块在编译时可以被当成插件单独编译成jar包;之后再在主代码模块通过jar包的方式引用插件类,即其余代码模块可以是插件,可以使代码结构分明;最终可以按划分得到的代码模块进行编译,实现代码动态加载。例如,如果待安装应用(即时通讯应用)对应的程序代码可以划分得到一个主代码模块,三个其余代码模块,这三个其余代码模块可以是插件1、插件2和插件3,得到如图2所示的结构。
步骤203、编译装置筛选划分得到的代码模块中与待安装应用对应的功能无关的待编译代码所在的代码模块,得到冗余代码模块。
具体的,与待安装应用对应的功能无关的待编译代码可以指的是在通过程序代码实现待安装应用的功能时,用不上的程序代码。例如,待安装应用为即时通讯应用,该即时通讯应用更新前对应的功能包括:支付、语音聊天、视频聊天、传送文件等,该即时通讯应用更新后对应的功能包括:语音聊天、视频聊天、传送文件;如此,该即时通讯应用更新后对应的功能中不包括支付功能,此时就需要对划分得到的代码模块中的待编译代码进行筛选,得到支付功能对应的所有程序代码。此时,冗余代码模块为支付功能对应的所有程序代码所属的代码模块;与待安装应用对应的功能无关的待编译代码为即时通讯应用中的支付功能对应的所有程序代码。
步骤204、编译装置对除冗余代码模块外的其他代码模块中的待编译代码进行编译,得到第一类文件。
具体的,编译装置先从划分得到的代码模块中获取除冗余代码模块外的其他代码模块,之后使用svn工具基于apacheant工具对其它代码模块中的待编译代码进行编译,得到对应的.class文件。
步骤205、编译装置基于静态文件、第一文件和第一类文件,生成预设类型的第二类文件。
步骤206、编译装置基于待安装应用的资源生成第二文件,并基于第二类文件和第二文件得到待安装应用的安装包。
其中,第二文件为包括有待安装应用的资源信息的文件。
需要说明的是,本实施例中与其它实施例中相同步骤或者概念的解释,可以参照其它实施例中的描述。
本发明的实施例所提供的编译方法,确定待安装应用的第一待编译代码对应的静态文件,并基于待安装应用的接口文件得到第一文件,第一文件为保存待安装应用的程序代码的文本文件,然后按照第一文件中的第二待编译代码的功能,将第二待编译代码进行划分得到至少两个代码模块,之后分别将每个代码模块中的待编译代码进行编译,得到第一类文件,基于该静态文件、第一文件和第一类文件生成预设类型的第二类文件,最终基于待安装应用的资源生成第二文件,并基于第二类文件和第二文件得到待安装应用的安装包,第二文件为包括有待安装应用的资源信息的文件,这样,在编译代码的时候按照划分后得到的代码模块,按照代码模块对代码进行编译,当一些代码发生变化时只需要对发生变化的代码所在的代码模块中的代码进行重新编译,而不需对所有的代码进行重新编译,解决了现有的代码编译方案中当某一些代码发生修改时,需要将所有的代码重新编译的问题,减少了工作量和计算量,降低了时间,提高了效率。
基于前述实施例,本发明的实施例提供一种编译方法,该方法包括以下步骤:
步骤301、编译装置确定待安装应用的第一待编译代码对应的静态文件,并基于待安装应用的接口文件得到第一文件。
其中,第一文件为保存待安装应用的程序代码的文本文件。
步骤302、编译装置按照第一文件中的第二待编译代码的功能,将第二待编译代码进行划分得到至少两个代码模块。
步骤303、编译装置筛选划分得到的代码模块中与待安装应用对应的功能无关的待编译代码所在的代码模块,得到冗余代码模块。
步骤304、编译装置对除冗余代码模块外的其他代码模块中的待编译代码进行编译,得到第一类文件。
步骤305、编译装置设置第二类文件的最大存储数目。
其中,最大存储数目为第二类文件最多能够存储的方法的数量。
具体的,设置的classes.dex文件的最大存储数目可以是dex类型的文件可以存储的方法数的能力决定的,例如最大存储数目可以是65536等。classes.dex文件中的方法可以指的是classes.dex文件中包括的程序代码中所对应的方法。
步骤306、编译装置基于最大存储数目、静态文件、第一文件和第一类文件,生成第二类文件。
具体的,设置完成classes.dex文件的最大存储数目后,编译装置可以先将得到的r.java文件、.java文件和.class文件打包,之后对打包生成的文件进行编译和排序处理,最终根据设置的最大存储数目将进行编译后排序处理后的文件设置为对应的子类文件。
步骤307、编译装置基于待安装应用的资源生成第二文件,并基于第二类文件和第二文件得到待安装应用的安装包。
基于前述实施例,在第二次生成某一待安装应用的安装包过程中,对划分得到的代码模块中的待编译代码进行编译时,还可以包括以下步骤:
步骤308、编译装置获取划分得到的代码模块中除冗余代码模块外的代码模块,得到剩余代码模块。
步骤309、编译装置将剩余代码模块中的待编译代码与预设代码进行比较。
具体的,预设代码可以是预先存储在远程svn服务器中的代码;预设代码可以是在之前生成对应待安装应用安装包时每次将编译得到的代码上传到远程svn服务器中,svn服务器存储接收到的代码后得到的。即,只要是已经编译过至少一次的应用程序的代码都会存储在远程svn服务器中。编译装置在比较的时候是将剩余代码模块中的待编译代码与对应的存储在远程svn服务器中的代码进行比较,即剩余代码模块中的待编译代码与存储在远程svn服务器中的代码对应的是同一个应用程序。
步骤310、编译装置基于比较结果,确定是否对剩余代码模块中的待编译代码进行重新编译。
具体的,如果剩余代码模块中的待编译代码与预设代码完全相同,则不需要对剩余代码模块中的待编译代码进行重新编译;如果剩余代码模块中的待编译代码与预设代码存在不同,则需要对剩余代码模块中的待编译代码进行重新编译。
需要说明的是,本实施例中与其它实施例中相同步骤或者概念的解释,可以参照其它实施例中的描述。
本发明的实施例所提供的编译方法,确定待安装应用的第一待编译代码对应的静态文件,并基于待安装应用的接口文件得到第一文件,第一文件为保存待安装应用的程序代码的文本文件,然后按照第一文件中的第二待编译代码的功能,将第二待编译代码进行划分得到至少两个代码模块,之后分别将每个代码模块中的待编译代码进行编译,得到第一类文件,基于该静态文件、第一文件和第一类文件生成预设类型的第二类文件,最终基于待安装应用的资源生成第二文件,并基于第二类文件和第二文件得到待安装应用的安装包,第二文件为包括有待安装应用的资源信息的文件,这样,在编译代码的时候按照划分后得到的代码模块,按照代码模块对代码进行编译,当一些代码发生变化时只需要对发生变化的代码所在的代码模块中的代码进行重新编译,而不需对所有的代码进行重新编译,解决了现有的代码编译方案中当某一些代码发生修改时,需要将所有的代码重新编译的问题,减少了工作量和计算量,降低了时间,提高了效率。同时,可以自动根据编译后的文件中方法数确定是否增加新的dex文件,避免用户的手动操作,实现自动突破方法数限制。
本发明的实施例提供一种编译方法,该方法包括以下步骤:
步骤401、编译装置确定待安装应用的第一待编译代码对应的静态文件,并基于待安装应用的接口文件得到第一文件。
其中,第一文件为保存待安装应用的程序代码的文本文件。
步骤402、编译装置按照第一文件中的第二待编译代码的功能,将第二待编译代码进行划分得到至少两个代码模块。
其中,第二待编译代码的功能是预先存储的。
步骤403、编译装置筛选划分得到的代码模块中与待安装应用对应的功能无关的待编译代码所在的代码模块,得到冗余代码模块。
步骤404、编译装置对除冗余代码模块外的其他代码模块中的待编译代码进行编译,得到第一类文件。
步骤405、编译装置设置第二类文件的最大存储数目。
其中,最大存储数目为第二类文件最多能够存储的方法的数量。
步骤406、编译装置将静态文件、第一文件和第一类文件打包后,进行编译和排序处理得到第三文件。
具体的,可以使用androidsdk下的dx工具将打包后的静态文件、第一文件和第一类文件进行编译,并对编译后得到的文件进行排序进而得到第三文件。
步骤407、编译装置将第三文件中待安装应用启动时必加载的文件设置为预设类型的第一子类文件。
具体的,第三文件中待安装应用启动时必加载的文件指的是第三文件中待安装应用启动的时候就会立刻加载的文件;例如可以是即时通讯应用启动时会立刻加载的文件。其中,预设类型为dex文件对应的类型。
将第三文件中待安装应用启动时必加载的文件设置为预设类型的第一子类文件,可以是将第三文件中待安装应用启动时必加载的文件中包括的方法存储在预设类型的第一子类文件中,即得到第一子类文件。其中,第一子类文件可以是一种dex文件。
步骤408、编译装置获取第三文件中除待安装应用启动时必加载的文件外的其他文件,得到第四文件。
具体的,步骤408获取第三文件中除待安装应用启动时必加载的文件外的其他文件,得到第四文件之后,可以选择执行步骤409或者步骤410~412;
步骤409、若第四文件中的方法数小于或等于预设数值,编译装置将第四文件设置为预设类型的第二子类文件。
其中,第二类文件包括第一子类文件和第二子类文件。
具体的,第四文件中的方法数可以指的是第四文件中的代码对应的方法的总数目。将第四文件设置为预设类型的第二子类文件,可以是将第四文件中包括的方法存储在预设类型的第二子类文件中,即得到第二子类文件。其中,第二子类文件可以是另一种dex文件。第一子类文件与第二子类文件的文件类型相同,但是第一子类文件和第二子类文件是两个不同的文件。
步骤410、若第四文件中的方法数大于预设数值,编译装置将第四文件中方法数等于预设数值的文件设置为第二子类文件。
具体的,如果第四文件中的方法数大于预设数值,说明一个dex文件的存储空间存储不了第四文件中的方法数,此时可以先获取第四文件中方法数等于65536的方法,并将这些方法存储在第二子类文件中,即得到第二子类文件。
步骤411、编译装置计算第四文件中方法数与预设数值之间的差值的绝对值。
步骤412、编译装置根据差值的绝对值与预设数值之间的关系,新增至少一个预设类型的类文件,并将第四文件中方法数大于预设数值的方法移入新增的至少一个预设类型的类文件中,并设置为第二子类文件。
具体的,如果第四文件中方法数与预设数值之间的差值的绝对值小于或等于预设数值(65536),此时可以新增加一个预设类型的类文件,并将对应的方法存储在新增加的预设类型的类文件中,即得到第二子类文件;如果第四文件中方法数与预设数值之间的差值的绝对值大于预设数值(65536),此时可以根据差值的绝对值与65536的倍数关系判断需增加的预设类型的类文件的数目,并将相应的方法存储在对应的增加的预设类型的类文件中,进而得到第二子类文件。其中,第四文件中的方法数大于预设数值的情况下,第二子类文件中包括至少一个类文件。
其中,步骤409和步骤412之后都需要执行步骤413。
步骤413、编译装置基于待安装应用的资源生成第二文件,并基于第一子类文件、第二子类文件和第二文件得到待安装应用的安装包。
基于前述实施例,该方法还包括以下步骤:
步骤414、编译装置获取划分得到的代码模块中除冗余代码模块外的代码模块,得到剩余代码模块。
步骤415、编译装置将剩余代码模块中的待编译代码与预设代码进行比较。
步骤416、若剩余代码模块中的待编译代码与预设代码相比发生了变化,编译装置获取待更新代码。
其中,待更新代码为剩余代码模块中与预设代码相比发生了变化的待编译代码。
步骤417、编译装置对待更新代码进行重新编译,并使用重新编译后得到的代码更新第一类文件中对应的代码。
具体的,可以按照如图3所示的流程图对待安装应用的.java文件中的待编译代码换分得到代码模块1、代码模块2等,然后使用svn将代码模块中的待编译代码与预设代码进行比较,如果,status_modified、status_added、status_added和status_unversioned中的其中一个结果为肯定,就对待编译代码进行重新编译,之后按照本发明中设置dex文件的方式进行处理,得到相应的dex文件。
在判断剩余代码模块中的待编译代码与预设代码相比是否发生变化可以是svn工具来实现的;svn支持多种变动属性,本方案只使用其中四种,分别是status_modified:表示是否被修改;status_added:表示是否有文件被添加;status_missing:表示是否有文件被删除;status_unversioned:表示是否有文件新增但没有被添加至svn路径。在使用status_modified、status_added、status_added或status_unversioned检测时,只要有其中之一的结果满足就说明剩余代码模块中的待编译代码与预设代码相比发生了变化,就要需要重新编译剩余代码模块中的待编译代码。
需要说明的是,本实施例中与其它实施例中相同步骤或者概念的解释,可以参照其它实施例中的描述。
本发明的实施例所提供的编译方法,确定待安装应用的第一待编译代码对应的静态文件,并基于待安装应用的接口文件得到第一文件,第一文件为保存待安装应用的程序代码的文本文件,然后按照第一文件中的第二待编译代码的功能,将第二待编译代码进行划分得到至少两个代码模块,之后分别将每个代码模块中的待编译代码进行编译,得到第一类文件,基于该静态文件、第一文件和第一类文件生成预设类型的第二类文件,最终基于待安装应用的资源生成第二文件,并基于第二类文件和第二文件得到待安装应用的安装包,第二文件为包括有待安装应用的资源信息的文件,这样,在编译代码的时候按照划分后得到的代码模块,按照代码模块对代码进行编译,当一些代码发生变化时只需要对发生变化的代码所在的代码模块中的代码进行重新编译,而不需对所有的代码进行重新编译,解决了现有的代码编译方案中当某一些代码发生修改时,需要将所有的代码重新编译的问题,减少了工作量和计算量,降低了时间,提高了效率。同时,可以自动根据编译后的文件中方法数确定是否增加新的dex文件,避免用户的手动操作,实现自动突破方法数限制。
基于前述实施例,如图4所示为本发明实施例提供的编译方法对应的一个完整的编译流程图。即,在生成待安装应用的安装包时可以先将.aidl文件通过aidl工具转换成编译器能处理的java接口文件;资源文件通过aapt处理为最终的resources.arsc,并生成r.java文件以使源码可以方便的访问到这些资源;java编译器将r.java,java源码以及生成的java接口文件统一编译成.class文件;同时,按照划分的功能模块使用svn工具进行比较,如果得到的结果为status_modified(修改)、status_added(添加)、status_missing(删除)或status_unversion(新增但未添加至svn路径)时,可以使用java编译器重新对模块进行编译;.class文件并不是android系统所能识别的格式,因而还要利用dex工具转化为能够识别的.dex文件。这其中会加入所有需要的第三方库和其它文件等文件;在利用dex工具打包时,需要首先将主模块打包到主dex,然后遍历目录下其余类的方法数,如果大于65536,则需要新增dex;接下来将生成的dex,资源包,以及其它资源通过apkbuilder生成初始的apk文件包。此时,生成的apk文件包还没有签名和优化;签名可以用jarsigner工具,或其它类似的工具。若在debug模式下,签名所用的keystore就是系统默认自带的,否则开发者需要提供自己的私钥以完成签名过程。
基于前述实施例,本发明的实施例提供一种编译装置5,该装置可以应用于前述所示的实施例中提供的编译方法中,参照图5所示,该装置包括:第一获取单元51、处理单元52、第二获取单元53和生成单元54,其中:
第一获取单元51,用于确定待安装应用的第一待编译代码对应的静态文件,并基于待安装应用的接口文件得到第一文件。
其中,第一文件为保存待安装应用的程序代码的文本文件。
处理单元52,用于按照第一文件中的第二待编译代码的功能,将第二待编译代码进行划分得到至少两个代码模块。
其中,第二待编译代码的功能是预先存储的。
第二获取单元53,用于分别将每个代码模块中的待编译代码进行编译,得到第一类文件。
生成单元54,用于基于静态文件、第一文件和第一类文件,生成预设类型的第二类文件。
第一获取单元51,还用于基于待安装应用的资源生成第二文件,并基于第二类文件和第二文件得到待安装应用的安装包。
其中,第二文件为包括有待安装应用的资源信息的文件。
本发明的实施例所提供的编译装置,确定待安装应用的第一待编译代码对应的静态文件,并基于待安装应用的接口文件得到第一文件,第一文件为保存待安装应用的程序代码的文本文件,然后按照第一文件中的第二待编译代码的功能,将第二待编译代码进行划分得到至少两个代码模块,之后分别将每个代码模块中的待编译代码进行编译,得到第一类文件,基于该静态文件、第一文件和第一类文件生成预设类型的第二类文件,最终基于待安装应用的资源生成第二文件,并基于第二类文件和第二文件得到待安装应用的安装包,第二文件为包括有待安装应用的资源信息的文件,这样,在编译代码的时候按照划分后得到的代码模块,按照代码模块对代码进行编译,当一些代码发生变化时只需要对发生变化的代码所在的代码模块中的代码进行重新编译,而不需对所有的代码进行重新编译,解决了现有的代码编译方案中当某一些代码发生修改时,需要将所有的代码重新编译的问题,减少了工作量和计算量,降低了时间,提高了效率。
具体的,第二获取单元包括:筛选模块和编译模块,其中:
筛选模块,用于筛选划分得到的代码模块中与待安装应用对应的功能无关的待编译代码所在的代码模块,得到冗余代码模块。
编译模块,用于对除冗余代码模块外的其他代码模块中的待编译代码进行编译,得到第一类文件。
具体的,生成单元包括:设置模块和生成模块,其中:
设置模块,用于设置第二类文件的最大存储数目。
其中,最大存储数目为第二类文件最多能够存储的方法的数量。
生成模块,用于基于最大存储数目、静态文件、第一文件和第一类文件,生成第二类文件。
进一步,生成模块具体用于执行以下步骤:
将静态文件、第一文件和第一类文件打包后,进行编译和排序处理得到第三文件。
将第三文件中待安装应用启动时必加载的文件设置为预设类型的第一子类文件。
获取第三文件中除待安装应用启动时必加载的文件外的其他文件,得到第四文件。
若第四文件中的方法数小于或等于预设数值,将第四文件设置为预设类型的第二子类文件。
其中,第二类文件包括第一子类文件和第二子类文件。
进一步,生成模块具体还用于执行以下步骤:
若第四文件中的方法数大于预设数值,将第四文件中方法数等于预设数值的文件设置为第二子类文件。
计算第四文件中方法数与预设数值之间的差值的绝对值。
根据差值的绝对值与预设数值之间的关系,新增至少一个预设类型的类文件,并将第四文件中方法数大于预设数值的方法移入新增的至少一个预设类型的类文件中,并设置为第二子类文件。
进一步,该编译装置还包括:比较单元,其中:
第一获取单元51,还用于获取划分得到的代码模块中除冗余代码模块外的代码模块,得到剩余代码模块。
比较单元,用于将剩余代码模块中的待编译代码与预设代码进行比较。
处理单元52,还用于基于比较结果,确定是否对剩余代码模块中的待编译代码进行重新编译。
具体的,处理单元包括:获取模块和更新模块,其中:
获取模块,用于若剩余代码模块中的待编译代码与预设代码相比发生了变化,获取待更新代码。
其中,待更新代码为剩余代码模块中与预设代码相比发生了变化的待编译代码。
更新模块,用于对待更新代码进行重新编译,并使用重新编译后得到的代码更新第一类文件中对应的代码。
需要说明的是,本实施例中各个单元和模块之间的交互过程,可以参照前述所示的实施例中提供的编译方法中的交互过程,此处不再赘述。
本发明的实施例所提供的编译装置,确定待安装应用的第一待编译代码对应的静态文件,并基于待安装应用的接口文件得到第一文件,第一文件为保存待安装应用的程序代码的文本文件,然后按照第一文件中的第二待编译代码的功能,将第二待编译代码进行划分得到至少两个代码模块,之后分别将每个代码模块中的待编译代码进行编译,得到第一类文件,基于该静态文件、第一文件和第一类文件生成预设类型的第二类文件,最终基于待安装应用的资源生成第二文件,并基于第二类文件和第二文件得到待安装应用的安装包,第二文件为包括有待安装应用的资源信息的文件,这样,在编译代码的时候按照划分后得到的代码模块,按照代码模块对代码进行编译,当一些代码发生变化时只需要对发生变化的代码所在的代码模块中的代码进行重新编译,而不需对所有的代码进行重新编译,解决了现有的代码编译方案中当某一些代码发生修改时,需要将所有的代码重新编译的问题,减少了工作量和计算量,降低了时间,提高了效率。同时,可以自动根据编译后的文件中方法数确定是否增加新的dex文件,避免用户的手动操作,实现自动突破方法数限制。
基于前述实施例,本发明的实施例提供一种编译设备6,可以应用于前述所示的实施例中提供的编译方法中,参照图6所示,该编译设备可以包括:存储器61和处理器62,其中:
存储器61,用于存储待安装应用对应的静态文件。
处理器62,用于从存储器61中获取待安装应用的第一待编译代码对应的静态文件,并基于待安装应用的接口文件得到第一文件;其中,第一文件为保存待安装应用的程序代码的文本文件;按照第一文件中的第二待编译代码的功能,将第二待编译代码进行划分得到至少两个代码模块;分别将每个代码模块中的待编译代码进行编译,得到第一类文件;基于静态文件、第一文件和第一类文件,生成预设类型的第二类文件;基于待安装应用的资源生成第二文件,并基于第二类文件和第二文件得到待安装应用的安装包;其中,第二文件为包括有待安装应用的资源信息的文件。
需要说明的是,本实施例中存储器和处理器之间的交互过程,可以参照前述所示的实施例中提供的编译方法中的交互过程,此处不再赘述。
基于前述实施例,本发明的实施例提供一种计算机可读存储介质,该计算机可读存储介质中存储有一个或多个计算机程序,该计算机程序被处理器执行时实现前述实施例中所示的编译方法的步骤。
在实际应用中,所述第一获取单元51、处理单元52、第二获取单元53、生成单元54、筛选模块、编译模块、设置模块、生成模块、比较单元、获取模块和更新模块均可由位于无线数据发送设备中的中央处理器(centralprocessingunit,cpu)、微处理器(microprocessorunit,mpu)、数字信号处理器(digitalsignalprocessor,dsp)或现场可编程门阵列(fieldprogrammablegatearray,fpga)等实现。
本领域内的技术人员应明白,本发明的实施例可提供为方法、系统、或计算机程序产品。因此,本发明可采用硬件实施例、软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器和光学存储器等)上实施的计算机程序产品的形式。
本发明是参照根据本发明实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
以上所述,仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。