发明内容
本公开实施例至少提供一种编译方法及装置。
第一方面,本公开实施例提供了一种编译方法,包括:
获取目标源文件,并生成所述目标源文件对应的待编译文件目录;所述目标源文件中包含基于第一编程语言编写的第一源代码、基于第二编程语言编写的第二源代码、打包后的资源文件和资源索引文件;所述待编译文件目录中包含所述第一源代码的文件标识、所述第二源代码的文件标识、所述打包后的资源文件的文件标识以及所述资源索引文件的文件标识;
响应于所述第一源代码的编译过程启动,将所述资源索引文件的文件标识从所述待编译文件目录中移除,并基于移除所述资源索引文件的文件标识后的待编译文件目录,对所述第一源代码进行编译;
响应于所述第二源代码的编译过程启动,将所述资源索引文件的文件标识添加至所述待编译文件目录中,并基于添加所述资源索引文件的文件标识后的待编译文件目录,对所述第二源代码进行编译。
一种可选的实施方式中,所述方法还包括:
将对所述第一源代码进行编译得到的第一编译产物及对所述第二源代码进行编译得到的第二编译产物融合,得到第三编译产物;
对所述第三编译产物进行格式转换,得到所述目标源文件对应的可执行文件。
一种可选的实施方式中,所述基于移除所述资源索引文件的文件标识后的待编译文件目录,对所述第一源代码进行编译,包括:
基于移除所述资源索引文件的文件标识后的待编译文件目录,对所述第一源代码的注释进行处理,得到所述第一源代码的注释对应的中间代码;
基于移除所述资源索引文件的文件标识后的待编译文件目录,对所述中间代码及所述第一源代码进行编译,得到第一编译产物。
一种可选的实施方式中,所述获取目标源文件,包括:
获取待编译的初始源文件;所述初始源文件包括初始资源文件、所述第一源代码和所述第二源代码;
将所述初始资源文件打包,得到所述打包后的资源文件以及所述打包后的资源文件对应的所述资源索引文件;
将所述资源索引文件、所述打包后的资源文件、所述第一源代码及所述第二源代码作为所述目标源文件。
一种可选的实施方式中,所述资源索引文件为R.Java文件;所述待编译文件目录为SourceSet目录。
一种可选的实施方式中,所述第一编程语言为Kotlin语言;所述第二编程语言为Java语言。
第二方面,本公开实施例还提供一种编译装置,包括:
获取模块,用于获取目标源文件,并生成所述目标源文件对应的待编译文件目录;所述目标源文件中包含基于第一编程语言编写的第一源代码、基于第二编程语言编写的第二源代码、打包后的资源文件和资源索引文件;所述待编译文件目录中包含所述第一源代码的文件标识、所述第二源代码的文件标识、所述打包后的资源文件的文件标识以及所述资源索引文件的文件标识;
第一编译模块,用于响应于所述第一源代码的编译过程启动,将所述资源索引文件的文件标识从所述待编译文件目录中移除,并基于移除所述资源索引文件的文件标识后的待编译文件目录,对所述第一源代码进行编译;
第二编译模块,用于响应于所述第二源代码的编译过程启动,将所述资源索引文件的文件标识添加至所述待编译文件目录中,并基于添加所述资源索引文件的文件标识后的待编译文件目录,对所述第二源代码进行编译。
一种可选的实施方式中,所述装置还包括第三编译模块,用于:
将对所述第一源代码进行编译得到的第一编译产物及对所述第二源代码进行编译得到的第二编译产物融合,得到第三编译产物;
对所述第三编译产物进行格式转换,得到所述目标源文件对应的可执行文件。
一种可选的实施方式中,所述第一编译模块具体用于:
基于移除所述资源索引文件的文件标识后的待编译文件目录,对所述第一源代码的注释进行处理,得到所述第一源代码的注释对应的中间代码;
基于移除所述资源索引文件的文件标识后的待编译文件目录,对所述中间代码及所述第一源代码进行编译,得到第一编译产物。
一种可选的实施方式中,所述获取模块在获取目标源文件时,用于:
获取待编译的初始源文件;所述初始源文件包括初始资源文件、所述第一源代码和所述第二源代码;
将所述初始资源文件打包,得到所述打包后的资源文件以及所述打包后的资源文件对应的所述资源索引文件;
将所述资源索引文件、所述打包后的资源文件、所述第一源代码及所述第二源代码作为所述目标源文件。
一种可选的实施方式中,所述资源索引文件为R.Java文件;所述待编译文件目录为SourceSet目录。
一种可选的实施方式中,所述第一编程语言为Kotlin语言;所述第二编程语言为Java语言。
第三方面,本公开实施例还提供一种电子设备,包括:处理器、存储器和总线,所述存储器存储有所述处理器可执行的机器可读指令,当电子设备运行时,所述处理器与所述存储器之间通过总线通信,所述机器可读指令被所述处理器执行时执行上述第一方面,或第一方面中任一种可能的实施方式中的步骤。
第四方面,本公开实施例还提供一种计算机可读存储介质,该计算机可读存储介质上存储有计算机程序,该计算机程序被处理器运行时执行上述第一方面,或第一方面中任一种可能的实施方式中的步骤。
本公开实施例提供的编译方法及装置,首先获取目标源文件,并生成所述目标源文件对应的待编译文件目录;所述目标源文件中包含基于第一编程语言编写的第一源代码、基于第二编程语言编写的第二源代码、打包后的资源文件和资源索引文件;所述待编译文件目录中包含所述第一源代码的文件标识、所述第二源代码的文件标识、所述打包后的资源文件的文件标识以及所述资源索引文件的文件标识;然后,响应于所述第一源代码的编译过程启动,将所述资源索引文件的文件标识从所述待编译文件目录中移除,并基于移除所述资源索引文件的文件标识后的待编译文件目录,对所述第一源代码进行编译;最后,响应于所述第二源代码的编译过程启动,将所述资源索引文件的文件标识添加至所述待编译文件目录中,并基于添加所述资源索引文件的文件标识后的待编译文件目录,对所述第二源代码进行编译。
本公开实施例通过将与第一源代码编译无关的资源索引文件的文件标识从待编译文件目录中移除,使得资源索引文件不参加第一源代码的编译过程,也不会加载在内存中,在第一源代码编译完成后,将资源索引文件添加回待编译文件目录,使得资源索引文件能够参加第二源代码的编译,保证第二源代码能够正常进行,降低了第一源代码编译所需的内存消耗,防止第一源代码编译时出现内存不足,进而降低编译失败的概率,提高编译效率。
为使本公开的上述目的、特征和优点能更明显易懂,下文特举较佳实施例,并配合所附附图,作详细说明如下。
具体实施方式
为使本公开实施例的目的、技术方案和优点更加清楚,下面将结合本公开实施例中附图,对本公开实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本公开一部分实施例,而不是全部的实施例。通常在此处附图中描述和示出的本公开实施例的组件可以以各种不同的配置来布置和设计。因此,以下对在附图中提供的本公开的实施例的详细描述并非旨在限制要求保护的本公开的范围,而是仅仅表示本公开的选定实施例。基于本公开的实施例,本领域技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都属于本公开保护的范围。
应注意到:相似的标号和字母在下面的附图中表示类似项,因此,一旦某一项在一个附图中被定义,则在随后的附图中不需要对其进行进一步定义和解释。
本文中术语“和/或”,仅仅是描述一种关联关系,表示可以存在三种关系,例如,A和/或B,可以表示:单独存在A,同时存在A和B,单独存在B这三种情况。另外,本文中术语“至少一种”表示多种中的任意一种或多种中的至少两种的任意组合,例如,包括A、B、C中的至少一种,可以表示包括从A、B和C构成的集合中选择的任意一个或多个元素。
经研究发现,在对使用了Kotlin语法的源代码进行编译时,为了提高编译效率,需要使用各种工具及插件,这些插件通常会引入大量的注释处理器annotation processors,极大地加重了编译的内存消耗,并且,一些插件或编译器本身存在内存泄漏的情况,比如,在计算得到语法分析的结果之后会将其持续持有,存储有语法分析结果的内存无法被释放,但后续也不会被使用,进一步导致内存不足,容易出现OOM问题导致无法完成编译。
基于上述研究,本公开提供了一种编译方法,通过将资源索引文件的文件标识从待编译文件目录中移除,使得资源索引文件不参加第一源代码(也即上述Kotlin语言编写的代码)的编译过程,并在第一源代码编译完成后,将资源索引文件添加回待编译文件目录,使得资源索引文件能够参加第二源代码(Java语言编写的代码)的编译,保证第二源代码能够正常进行,降低了第一源代码编译所需的内存消耗,防止第一源代码编译时出现内存不足,进而降低编译失败的概率,提高编译效率。
为便于对本实施例进行理解,首先对本公开实施例所公开的一种编译方法进行详细介绍,本公开实施例所提供的编译方法的执行主体一般为具有一定计算能力的计算机设备,该计算机设备例如包括:终端设备或服务器或其它处理设备。在一些可能的实现方式中,该编译方法可以通过处理器调用存储器中存储的计算机可读指令的方式来实现。
参见图1所示,为本公开实施例提供的编译方法的流程图,所述方法包括步骤S101~S103,其中:
S101、获取目标源文件,并生成所述目标源文件对应的待编译文件目录;所述目标源文件中包含基于第一编程语言编写的第一源代码、基于第二编程语言编写的第二源代码、打包后的资源文件和资源索引文件;所述待编译文件目录中包含所述第一源代码的文件标识、所述第二源代码的文件标识、所述打包后的资源文件的文件标识以及所述资源索引文件的文件标识。
该步骤中,目标源文件可以包括第一源代码、第二源代码、打包后的资源文件以及资源索引文件,其中,第一源代码是基于第一编程语言编写的,第一编程语言可以为Kotlin,第二源代码是基于第二编程语言编写的,如Java编程语言,资源索引文件可以提供打包后的资源文件中各个文件的引用路径,通常情况下,对目标源文件进行编译需要先生成待编译文件目录,然后分别编译第一源代码及第二源代码,最终将第一源代码及第二源代码的编译产物合并,生成目标源文件的可执行文件。
在开始编译时,通常需要对目标源文件进行语法分析,再根据语法分析结果进行编译,参与到语法分析的源文件中,存在大量的资源索引文件,即R.Java文件,这些资源索引文件会在生成的待编译文件目录中,编译过程会将其加载至内存中,以便后续使用,然而,在第一源代码的编译过程中,通常不需要使用这些资源索引文件,并且,对第一源代码编译的过程中会使用到大量的注释处理器,且存在一些内存泄漏的情况,内存资源比较紧张,容易因内存不足导致第一源代码的编译失败。
上述待编译目录能够为编译器提供所需要的信息,如需要进行编译的源代码、编译源代码所需的文件等。在执行编译时,编译器可以读取待编译目录,并将待编译目录中指示的文件加载至内存当中。
示例性的,上述待编译文件目录可以为sourceSet目录,该目录可以指定哪些源文件需要被编译。
具体的,可以通过以下步骤获取目标源文件:
获取待编译的初始源文件;所述初始源文件包括初始资源文件、所述第一源代码和所述第二源代码;
将所述初始资源文件打包,得到所述打包后的资源文件以及所述打包后的资源文件对应的所述资源索引文件;
将所述资源索引文件、所述打包后的资源文件、所述第一源代码及所述第二源代码作为所述目标源文件。
该步骤中,初始源文件可以为用户编写的源代码及尚未打包的初始资源文件,通过对初始资源文件打包,可以生成打包后的资源文件以及打包后的资源文件对应的资源索引文件,结合初始源文件中的第一源代码、第二源代码,即可得到目标源文件。
S102、响应于所述第一源代码的编译过程启动,将所述资源索引文件的文件标识从所述待编译文件目录中移除,并基于移除所述资源索引文件的文件标识后的待编译文件目录,对所述第一源代码进行编译。
该步骤中,在检测到第一源代码的编译过程启动时,可以将资源索引文件的文件标识从待编译文件目录中移除,从而将资源索引文件定义为不需要编译的文件,然后,再执行第一源代码的编译,从而避免在第一源代码编译的过程中将资源索引文件加载至内存中,降低第一源代码编译时的内存占用,减少因OOM引起编译失败的发生频率。
具体的,可以基于移除所述资源索引文件的文件标识后的待编译文件目录,利用待编译文件目录中指示的信息,对所述第一源代码的注释进行处理,得到所述第一源代码的注释对应的中间代码;然后,再基于移除所述资源索引文件的文件标识后的待编译文件目录,利用待编译文件目录中指示的信息,对所述中间代码及所述第一源代码进行编译,得到所述第一编译产物。
由于第一源代码是Kotlin语言编写的,编译Kotlin代码通常不需要资源索引文件,因此,即使将资源索引文件从待编译文件目录中移除,也不会影响第一源代码的编译。
上述中间代码为通过注释得到的代码,可以用于对第一源代码进行编译处理,也可以被编译,与第一源代码的编译产物组成第一编译产物。
上述第一编译产物可以为class文件,内容可以为Java字节码,是生成可执行文件这一过程的中间产物。
S103、响应于所述第二源代码的编译过程启动,将所述资源索引文件的文件标识添加至所述待编译文件目录中,并基于添加所述资源索引文件的文件标识后的待编译文件目录,对所述第二源代码进行编译。
该步骤中,由于第二源代码是由Java语言编写的代码,该部分代码的编译需要使用资源索引文件,因此,可以在第二源代码的编译过程启动时,将资源索引文件的文件标识添加到待编译文件目录中,这样,在第二源代码编译时,即可根据待编译文件目录中的信息,将需要的信息及资源索引文件加载至内存,进而利用加载的数据对第二源代码进行编译,得到第二源代码的第二编译产物。
在对第二源代码进行编译的过程中,生成的第二编译产物包括第二源代码的编译产物,以及资源索引文件的编译产物,第二编译产物可以为.class文件。
在得到第一编译产物和第二编译产物后,可以将第一编译产物和第二编译产物进行融合,得到第三编译产物,然后,对第三编译产物进行格式转换,得到目标源文件对应的可执行文件,其中,可执行文件可以为.dex文件,可执行文件及上述打包后的资源文件可以组合得到应用程序对应的安装包,上述安装包可以为.apk文件。
参见图2所示,为本公开实施例提供的另一种编译方法。该方法首先利用安卓资源打包工具aapt将资源文件打包,并生成资源索引文件R.java,然后,调用Kotlin注解处理工具(Kotlin annotation processing tool,kapt),执行初始化步骤(如生成待编译文件目录sourceSet),在利用kapt开始对Kotlin代码的编译之前,判断待编译文件目录中是否含有R文件(即资源索引文件),若存在,则将R文件移除或过滤掉,再调用注释处理工具(Java-Annotation Process Tool,Java-apt),将Kotlin代码中的注释按照一定规则转化为相应的Java文件(即上述中间代码),若不存在R文件则可以直接调用注释处理工具;之后,可以对生成的中间代码及Kotlin代码进行编译,得到Kotlin代码的编译产物;然后,在开始对Java代码的编译之前,将R文件添加到待编译文件目录中,进行Java代码的编译,得到Java代码的编译产物;然后,调用dexBuilder工具,将Java代码的编译产物及Kotlin代码的编译产物融合,再进行格式转换,得到可执行文件.dex,最终与资源文件组成安装包,也即.apk文件。
本公开实施例提供的编译方法,首先获取目标源文件,并生成所述目标源文件对应的待编译文件目录;所述目标源文件中包含基于第一编程语言编写的第一源代码、基于第二编程语言编写的第二源代码、打包后的资源文件和资源索引文件;所述待编译文件目录中包含所述第一源代码的文件标识、所述第二源代码的文件标识、所述打包后的资源文件的文件标识以及所述资源索引文件的文件标识;然后,响应于所述第一源代码的编译过程启动,将所述资源索引文件的文件标识从所述待编译文件目录中移除,并基于移除所述资源索引文件的文件标识后的待编译文件目录,对所述第一源代码进行编译;最后,响应于所述第二源代码的编译过程启动,将所述资源索引文件的文件标识添加至所述待编译文件目录中,并基于添加所述资源索引文件的文件标识后的待编译文件目录,对所述第二源代码进行编译。
本领域技术人员可以理解,在具体实施方式的上述方法中,各步骤的撰写顺序并不意味着严格的执行顺序而对实施过程构成任何限定,各步骤的具体执行顺序应当以其功能和可能的内在逻辑确定。
基于同一发明构思,本公开实施例中还提供了与编译方法对应的编译装置,由于本公开实施例中的装置解决问题的原理与本公开实施例上述编译方法相似,因此装置的实施可以参见方法的实施,重复之处不再赘述。
参照图3所示,为本公开实施例提供的一种编译的示意图,所述装置包括:
获取模块310,用于获取目标源文件,并生成所述目标源文件对应的待编译文件目录;所述目标源文件中包含基于第一编程语言编写的第一源代码、基于第二编程语言编写的第二源代码、打包后的资源文件和资源索引文件;所述待编译文件目录中包含所述第一源代码的文件标识、所述第二源代码的文件标识、所述打包后的资源文件的文件标识以及所述资源索引文件的文件标识;
第一编译模块320,用于响应于所述第一源代码的编译过程启动,将所述资源索引文件的文件标识从所述待编译文件目录中移除,并基于移除所述资源索引文件的文件标识后的待编译文件目录,对所述第一源代码进行编译;
第二编译模块330,用于响应于所述第二源代码的编译过程启动,将所述资源索引文件的文件标识添加至所述待编译文件目录中,并基于添加所述资源索引文件的文件标识后的待编译文件目录,对所述第二源代码进行编译。
一种可选的实施方式中,所述装置还包括第三编译模块,用于:
将对所述第一源代码进行编译得到的第一编译产物及对所述第二源代码进行编译得到的第二编译产物融合,得到第三编译产物;
对所述第三编译产物进行格式转换,得到所述目标源文件对应的可执行文件。
一种可选的实施方式中,所述第一编译模块320具体用于:
基于移除所述资源索引文件的文件标识后的待编译文件目录,对所述第一源代码的注释进行处理,得到所述第一源代码的注释对应的中间代码;
基于移除所述资源索引文件的文件标识后的待编译文件目录,对所述中间代码及所述第一源代码进行编译,得到第一编译产物。
一种可选的实施方式中,所述获取模块310在获取目标源文件时,用于:
获取待编译的初始源文件;所述初始源文件包括初始资源文件、所述第一源代码和所述第二源代码;
将所述初始资源文件打包,得到所述打包后的资源文件以及所述打包后的资源文件对应的所述资源索引文件;
将所述资源索引文件、所述打包后的资源文件、所述第一源代码及所述第二源代码作为所述目标源文件。
一种可选的实施方式中,所述资源索引文件为R.Java文件;所述待编译文件目录为SourceSet目录。
一种可选的实施方式中,所述第一编程语言为Kotlin语言;所述第二编程语言为Java语言。
关于装置中的各模块的处理流程、以及各模块之间的交互流程的描述可以参照上述方法实施例中的相关说明,这里不再详述。
对应于图1中的编译方法,本公开实施例还提供了一种电子设备400,如图4所示,为本公开实施例提供的电子设备400结构示意图,包括:
处理器41、存储器42、和总线43;存储器42用于存储执行指令,包括内存421和外部存储器422;这里的内存421也称内存储器,用于暂时存放处理器41中的运算数据,以及与硬盘等外部存储器422交换的数据,处理器41通过内存421与外部存储器422进行数据交换,当所述电子设备400运行时,所述处理器41与所述存储器42之间通过总线43通信,使得所述处理器41执行以下指令:
获取目标源文件,并生成所述目标源文件对应的待编译文件目录;所述目标源文件中包含基于第一编程语言编写的第一源代码、基于第二编程语言编写的第二源代码、打包后的资源文件和资源索引文件;所述待编译文件目录中包含所述第一源代码的文件标识、所述第二源代码的文件标识、所述打包后的资源文件的文件标识以及所述资源索引文件的文件标识;
响应于所述第一源代码的编译过程启动,将所述资源索引文件的文件标识从所述待编译文件目录中移除,并基于移除所述资源索引文件的文件标识后的待编译文件目录,对所述第一源代码进行编译;
响应于所述第二源代码的编译过程启动,将所述资源索引文件的文件标识添加至所述待编译文件目录中,并基于添加所述资源索引文件的文件标识后的待编译文件目录,对所述第二源代码进行编译。
一种可选的实施方式中,所述处理器41还用于执行:
将对所述第一源代码进行编译得到的第一编译产物及对所述第二源代码进行编译得到的第二编译产物融合,得到第三编译产物;
对所述第三编译产物进行格式转换,得到所述目标源文件对应的可执行文件。
一种可选的实施方式中,所述处理器41执行的指令中,所述基于移除所述资源索引文件的文件标识后的待编译文件目录,对所述第一源代码进行编译,包括:
基于移除所述资源索引文件的文件标识后的待编译文件目录,对所述第一源代码的注释进行处理,得到所述第一源代码的注释对应的中间代码;
基于移除所述资源索引文件的文件标识后的待编译文件目录,对所述中间代码及所述第一源代码进行编译,得到第一编译产物。
一种可选的实施方式中,所述处理器41执行的指令中,所述获取目标源文件,包括:
获取待编译的初始源文件;所述初始源文件包括初始资源文件、所述第一源代码和所述第二源代码;
将所述初始资源文件打包,得到所述打包后的资源文件以及所述打包后的资源文件对应的所述资源索引文件;
将所述资源索引文件、所述打包后的资源文件、所述第一源代码及所述第二源代码作为所述目标源文件。
一种可选的实施方式中,所述处理器41执行的指令中,所述资源索引文件为R.Java文件;所述待编译文件目录为SourceSet目录。
一种可选的实施方式中,所述处理器41执行的指令中,所述第一编程语言为Kotlin语言;所述第二编程语言为Java语言。
本公开实施例还提供一种计算机可读存储介质,该计算机可读存储介质上存储有计算机程序,该计算机程序被处理器运行时执行上述方法实施例中所述的编译方法的步骤。其中,该存储介质可以是易失性或非易失的计算机可读取存储介质。
本公开实施例还提供一种计算机程序产品,该计算机程序产品承载有程序代码,所述程序代码包括的指令可用于执行上述方法实施例中所述的编译方法的步骤,具体可参见上述方法实施例,在此不再赘述。
其中,上述计算机程序产品可以具体通过硬件、软件或其结合的方式实现。在一个可选实施例中,所述计算机程序产品具体体现为计算机存储介质,在另一个可选实施例中,计算机程序产品具体体现为软件产品,例如软件开发包(Software Development Kit,SDK)等等。
所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统和装置的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。在本公开所提供的几个实施例中,应该理解到,所揭露的系统、装置和方法,可以通过其它的方式实现。以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,又例如,多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些通信接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本公开各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。
所述功能如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个处理器可执行的非易失的计算机可读取存储介质中。基于这样的理解,本公开的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本公开各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(Read-OnlyMemory,ROM)、随机存取存储器(Random Access Memory,RAM)、磁碟或者光盘等各种可以存储程序代码的介质。
最后应说明的是:以上所述实施例,仅为本公开的具体实施方式,用以说明本公开的技术方案,而非对其限制,本公开的保护范围并不局限于此,尽管参照前述实施例对本公开进行了详细的说明,本领域的普通技术人员应当理解:任何熟悉本技术领域的技术人员在本公开揭露的技术范围内,其依然可以对前述实施例所记载的技术方案进行修改或可轻易想到变化,或者对其中部分技术特征进行等同替换;而这些修改、变化或者替换,并不使相应技术方案的本质脱离本公开实施例技术方案的精神和范围,都应涵盖在本公开的保护范围之内。因此,本公开的保护范围应所述以权利要求的保护范围为准。