应用构建中的预编译方法、装置、设备及存储介质与流程

文档序号:19878311发布日期:2020-02-08 06:40阅读:130来源:国知局
应用构建中的预编译方法、装置、设备及存储介质与流程

本申请涉及ios应用构建技术领域,尤其涉及一种应用构建中的预编译方法、装置、设备及存储介质。



背景技术:

ios应用构建过程中,都会使用到开源依赖库,开源依赖库是以源码的方式提供的,因此,在每次构建应用的生产环境中进行编译时,都需要将开源依赖库编译成二进制文件。由于开源依赖库的种类较为固定,且常用的开源依赖库中的代码较为稳定可靠,这就使得上述各种应用构建中的编译过程都会对常用的开源依赖库进行编译,这就导致对开源依赖库的编译往往是重复的,这些重复的编译过程就会延长整个编译过程所需要的时间,降低了编译速度。



技术实现要素:

为至少在一定程度上克服相关技术中存在的问题,本申请提供一种应用构建中的预编译方法、装置、设备及存储介质。

根据本申请的第一方面,提供一种应用构建中的预编译方法,包括:

获取环境参数中的参数内容;

根据所述参数内容对当前的应用构建环境进行切换;

当所述当前的应用构建环境切换为第一环境时,将目标依赖库预先编译为二进制文件,根据所述二进制文件生成私有依赖库;

当所述当前的应用构建环境切换为第二环境时,获取所述私有依赖库并进行安装,运行所述私有依赖库。

根据本申请的第二方面,提供一种应用构建中的预编译装置,包括:

获取模块,用于获取环境参数中的参数内容;

切换模块,用于根据所述参数内容对当前的应用构建环境进行切换;

第一处理模块,用于当所述当前的应用构建环境切换为第一环境时,将目标依赖库预先编译为二进制文件,根据所述二进制文件生成私有依赖库;

第二处理模块,用于当所述当前的应用构建环境切换为第二环境时,获取所述私有依赖库并进行安装,运行所述私有依赖库。

根据本申请的第三方面,提供一种计算机设备,包括:

存储器和处理器,所述存储器存储有计算机程序,所述处理器执行所述计算机程序时实现如本申请实施例第一方面所述的方法的步骤。

根据本申请的第四方面,提供一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现如本申请实施例第一方面所述的方法的步骤。

本申请提供的技术方案可以包括以下有益效果:在获取到环境参数中的参数内容后,根据参数内容切换当前的应用构建环境,将当前的应用构建环境切换为第一环境时,将目标依赖库预先编译为二进制文件并根据该二进制文件生成私有依赖库,将当前环境切换为第二环境时,获取上述私有依赖库并安装,然后运行私有依赖库,以避免在第二环境中直接安装未编译的目标依赖库。由于第二环境中,安装了根据二进制文件生成的私有依赖库,而且该二进制文件是由目标依赖库编译得到的,因此,在第二环境中构建应用时,就无需将目标依赖库进行编译,直接使用私有依赖库中的二进制文件即可,因此,节省了本来需要编译目标依赖库所需要的时间,编译速度会加快。

应当理解的是,以上的一般描述和后文的细节描述仅是示例性和解释性的,并不能限制本申请。

附图说明

此处的附图被并入说明书中并构成本说明书的一部分,示出了符合本申请的实施例,并与说明书一起用于解释本申请的原理。

图1是本申请中的一个实施例提供的一种应用构建中的预编译方法流程示意图

图2是本申请的一个实施例提供的一种应用构建中的预编译方法中确定目标依赖库的流程示意图。

图3是本申请的一个实施例提供的一种应用构建中的预编译方法中确定目标依赖库的流程示意图。

图4是本申请的一个实施例提供的一种应用构建中的预编译方法中确定目标依赖库的流程示意图。

图5是本申请的一个实施例提供的一种应用构建中的预编译方法中生成私有依赖库的流程示意图。

图6是本申请的另一实施例提供的一种应用构建中的预编译方法的流程示意图。

图7是本申请的另一实施例提供的一种应用构建中的预编译装置的结构示意图。

图8是本申请的另一实施例提供的一种计算机设备的结构示意图。

具体实施方式

这里将详细地对示例性实施例进行说明,其示例表示在附图中。下面的描述涉及附图时,除非另有表示,不同附图中的相同数字表示相同或相似的要素。以下示例性实施例中所描述的实施方式并不代表与本申请相一致的所有实施方式。相反,它们仅是与如所附权利要求书中所详述的、本申请的一些方面相一致的装置和方法的例子。

请参阅图1,图1是本申请中的一个实施例提供的一种应用构建中的预编译方法流程示意图。

如图1所示,本实施例的应用构建中的预编译方法包括:

步骤s101、获取环境参数中的参数内容。

步骤s102、根据参数内容对当前的应用构建环境进行切换。

步骤s103、当所述当前的应用构建环境切换为第一环境,将目标依赖库预先编译为二进制文件,根据所述二进制文件生成私有依赖库。

步骤s104、当所述当前的应用构建环境切换为第二环境时,获取私有依赖库并进行安装,运行私有依赖库。

一个实施例中,在获取到环境参数中的参数内容后,根据参数内容切换当前的应用构建环境,将当前的应用构建环境切换为第一环境时,将目标依赖库预先编译为二进制文件并根据该二进制文件生成私有依赖库,将当前环境切换为第二环境时,获取上述私有依赖库并安装,然后运行私有依赖库,以避免在第二环境中直接安装未编译的目标依赖库。由于第二环境中,安装了根据二进制文件生成的私有依赖库,而且该二进制文件是由目标依赖库编译得到的,因此,在第二环境中构建应用时,就无需将目标依赖库进行编译,直接使用私有依赖库中的二进制文件即可,因此,节省了本来需要编译目标依赖库所需要的时间,编译速度会加快。

一个实施例中,步骤s101中的环境参数可以是随机定义的参数,也可以是应用构建过程中使用到的某个函数中的参数,比如函数的入参。参数内容可以是预先约定的内容,然后根据约定好的对应规则判断应用构建环境

一个实施例中,步骤s102中的参数内容可以是预先约定的内容,然后根据约定好的对应规则判断应用构建环境。比如,参数内容可以是布尔型的,那么其内容就可以是“true”或“false”,那么就可以约定参数内容为“true”时,对应第一环境,参数内容为“false”时,对应第二环境。当然,参数类型和参数内容均可以自定义,上述对应规则也可以自定义,只要能实现一种参数内容对应一种环境即可。

一个实施例中,第一环境可以是源码环境,比如开发环境;第二环境可以是二进制环境,比如生产环境。

一个实施例中,步骤s103中的目标依赖库可以是满足预设条件的依赖库,上述预设条件可以是发生变更和/或源码版本的依赖库。其中,源码版本的依赖库是由各类编程语言构成的,在二进制环境中无法识别,因此,在二进制环境中,为了识别源码版本的依赖库,会先将源码版本的依赖库编译为二进制版本的依赖库,然后再进行后续步骤。因此,为了减少在第一环境中编译的依赖库的数量,可以仅将发生变更的依赖库和/或源码版本的依赖库作为目标依赖库在第一环境中进行预先编译。

一个实施例中,可以将发生变更的依赖库确定为目标依赖库,具体请参阅图2,图2是本申请的一个实施例提供的一种应用构建中的预编译方法中确定目标依赖库的流程示意图。

如图2所示,确定目标依赖库的具体步骤可以包括:

步骤s201、获取目标变量;目标变量用于记录发生了变更的依赖库对应的目标名称标识;

步骤s202、从目标变量中获取目标名称标识。

步骤s203、确定目标名称标识对应的依赖库为目标依赖库。

一个实施例中,目标变量可以是预先定义的,可以定义其变量类型、变量名称,当然,该变量类型必须是可以记录依赖库名称标识的类型,当执行过程中增加了新的依赖库,该增加的依赖库的名称标识会记录在目标变量中,称为目标变量的变量内容。

一个实施例中,为了增多单个变量的作用,以减少变量的数量,常常会将变量中的变量内容划分为多个字段,每个字段用于存储不同的数据,因此,目标变量的变量内容可以包括目标字段,该目标字段用于记录上述目标名称标识,具体的,步骤s202可以有从目标变量中获取目标字段;从目标字段中获取目标名称标识。仅使用目标变量中的目标字段记录目标名称标识,目标变量中的其它字段可以自定义存储其它内容,有效减少了变量的数量。

一个实施例中,以基于cocoapods工具构建应用为例,该目标变量所在的函数可以是post_install函数,post_install函数中包括analysis_result成员变量,而analysis_result成员变量中的podfile_state变量即为目标变量,而podfile_state变量中的changed字段即为目标字段。

一个实施例中可以将依赖库中的开源版本的依赖库作为目标依赖库,具体请参阅图3,图3是本申请的一个实施例提供的一种应用构建中的预编译方法中确定目标依赖库的流程示意图。

如图3所示,确定目标依赖库的具体步骤可以包括:

步骤s301、获取所有依赖库的名称标识。

步骤s302、根据名称标识获取与各依赖库对应的依赖库实例。

步骤s303、对各依赖库实例执行预设命令,得到对应的执行结果。

步骤s304、确定执行结果为目标结果对应的依赖库实例为目标依赖库实例。

步骤s305、确定目标依赖库实例对应的依赖库为目标依赖库。

一个实施例中,可以先获取所有依赖库的名称标识,然后根据该名称标识获取各依赖库对应的依赖库实例,对各依赖库实例执行预设命令后得到执行结果,并将执行结果为目标结果所对应的依赖库实例确定为目标依赖库实例,而目标依赖库实例对应的依赖库就确定为目标依赖库。具体的,针对于不同版本的依赖库(此处指开源版本的依赖库或二进制版本的依赖库),对其对应的依赖库实例执行预设命令所得到的执行结果也不同,比如,对于开源版本的依赖库对应的依赖库实例,执行预设命令得到的执行结果可以为“true”,对于二进制版本的依赖库对应的依赖库实例,执行预设命令得到的执行结果可以为“false”。当然,上述执行结果与依赖库类型的对应关系与预设命令相关,均可以进行自定义。

一个实施例中,以基于cocoapods工具构建应用为例,依赖库实例存在于analysis_result成员变量的pod_targets数组中,可以在pod_targets数组中查找出类型为pod::podtarget的依赖库实例,预设命令可以为“should_build?”命令,而执行结果为true即为目标结果。判断“should_build?”命令为true时依赖库实例对应的发生变更的依赖库为开源依赖库;判断“should_build?”命令为false时依赖库实例对应的发生变更的依赖库为闭源依赖库。

一个实施例中,还可以将发生变更的依赖库中的开源版本的依赖库作为目标依赖库,具体请参阅图4,图4是本申请的一个实施例提供的一种应用构建中的预编译方法中确定目标依赖库的流程示意图。

如图4所示,确定目标依赖库的具体步骤可以包括:

步骤s401、获取目标变量;目标变量用于记录发生了变更的依赖库对应的目标名称标识;

步骤s402、从目标变量中获取目标名称标识;

步骤s403、获取与名称标识为各目标名称标识的依赖库相对应的依赖库实例;

步骤s404、对各依赖库实例执行预设命令,得到对应的执行结果;

步骤s405、确定执行结果为目标结果对应的依赖库实例为目标依赖库实例;

步骤s406、确定目标依赖库实例对应的依赖库为目标依赖库。

一个实施例中,可以先确定发生变更的依赖库,然后在发生变更的依赖库中选择开源版本的依赖库在第一环境中进行预先编译。首先获取用于记录发生了变更的依赖库对应的目标名称标识的目标变量,然后从目标变量中获取目标名称标识,再获取与名称标识为各目标名称标识的依赖库相对应的依赖库实例,分别对上述依赖库实例执行预设命令得到对应的执行结果,执行结果分为目标结果时,将该执行结果对应的依赖库实例确定为目标依赖库实例,最后将目标依赖库实例对应的依赖库确定为目标依赖库。

一些是实施例中,上述确定目标依赖库的过程可以发生在步骤s102和步骤s103之间。

一个实施例中,步骤s103的根据二进制文件生成私有依赖库的具体步骤可以参阅图5,图5是本申请的一个实施例提供的一种应用构建中的预编译方法中生成私有依赖库的流程示意图。

如图5所示,生成私有依赖库的具体步骤可以包括:

步骤s501、生成初始私有依赖库;初始私有依赖库的依赖项为空;

步骤s502、将二进制文件设置为初始私有依赖库的依赖项,得到私有依赖库。

一个实施例中,首先生成一个初始私有依赖库,该初始私有依赖库的架构与常规私有依赖库的架构相同,但是所依赖的依赖项为空,然后将预先编译得到的二进制文件设置为初始私有依赖库的依赖项,从而得到私有依赖库。

一个实施例中,步骤s104中还可以包括有移除不需要的依赖库的步骤,该移除步骤可以设置在安装私有依赖库之后,且运行私有依赖库之前。第二环境中,除私有依赖库之外,还可能需要安装其他二进制版本的依赖库,即除私有依赖库外的待安装依赖库,此时,可以先将其他待安装依赖库进行安装,然后获取已经安装好的所有依赖库,最后将安装好的所有依赖库中除待安装依赖库和私有依赖库之外的依赖库移除。

一个实施例中,本申请的预编译方法可以基于应用构建过程中的预设管理工具来实现,比如cocoapods工具。cocoapods工具是osx和ios下的一个第三类库管理工具,通过cocoapods工具可以为项目添加被称为“pods”的依赖库(这些依赖库必须是cocoapods本身所支持的),并且可以轻松管理其版本。当本申请的预编译方法基于cocoapods工具实现时,步骤s101中的环境参数就可以是cocoapods命令入参。

下面以基于cocoapods工具为例对本申请的预编译方法进行说明。请参阅图6,图6是本申请的另一实施例提供的一种应用构建中的预编译方法的流程示意图。

步骤s601、根据cocoapods工具中的预先创建的cocoapods命令入参的参数内容切换当前应用构建环境;当参数内容为true时,应用构建环境为生产环境;当参数内容为false时,应用构建环境为开发环境。

步骤s602、根据参数内容对私有依赖库和各闭源依赖库进行声明。

一个实施例中,闭源依赖库是指二进制版本的依赖库。该处的声明是指指明私有依赖库和一些闭源依赖库是需要进行安装的。

步骤s603、根据cocoapods工具的安装特性安装经过声明的依赖库。

一个实施例中,步骤s602和步骤s603具体可以通过下述程序代码实现,预先创建的cocoapods命令入参的参数类型为布尔型,cocoapods命令入参的命名可以但不仅限于为use_lib。cocoapods命令入参可以称为键值,是为了在函数内部获取参数内容的一个键。其程序伪码可以示例如下:

上述程序伪码中,若use_lib为false(不传入use_lib则默认为false),则是处于开发环境,此时会使用命令envuse_lib=falsepodinstall或者podinstall,则cocoapods工具会进行b、c的安装。如果use_lib为true,则判断为生产环境,此时会使用命令envuse_lib=truepodinstall,则cocoapods会只会进行a库的安装,b、c库则会被移除。由于cocoapods工具的安装特性,即只会安装声明的依赖库,没有声明的但是已经安装的都会被移除。

步骤s604、获取应用构建中发生变更的依赖库。

步骤s605、判断发生变更的依赖库是否为开源依赖库,得到第一判断结果。

步骤s606、当第一判断结果为是时,对发生变更的依赖库进行编译,得到二进制文件。

步骤s607、将二进制文件存储到预设目录中。

步骤s608、根据预设目录中的所有二进制文件生成私有依赖库。

一个实施例中,上述各步骤还可以通过手动方式触发执行。

若通过手动方式触发执行,上述步骤s101中的参数内容由用户进行输入。

而上述步骤s103中的将目标依赖库编译为二进制文件、根据二进制文件生成私有依赖库以及步骤s103中的安装私有依赖库都需要手动进行触发,然后才会执行。

一个实施例中,在安装私有依赖库等依赖库时,需要设置好相应的编译参数和链接参数才能够实现依赖库的安装集成。由于依赖库分为开源依赖库和闭源依赖库,若通过手动方式触发安装依赖库,需要根据依赖库的类型触发不同的安装过程。其中,依赖库可以是开源依赖库和闭源依赖库,而闭源依赖库又分为静态库和动态库。

一个实施例中,若依赖库为闭源依赖库,则需要区分闭源依赖库为静态库还是动态库,静态库需要设置header_search_paths,指定闭源静态依赖库的头文件路径,library_search_paths,指定闭源静态依赖库的可执行文件路径。

如果是动态依赖库,需要设置framework_search_paths,指定闭源动态依赖库的路径。如果闭源依赖库还有更多的链接需求还需要在other_ldflags加入更多设置参数:如使用了ios的category技术对系统类库做了扩展还需要在other_ldflags加入-objc。如果闭源依赖库还依赖了更多的系统类库,也需要在general-linkedframeworksandlibraries中添加依赖的系统类库。

若通过cocoapods工具自动执行,则本实施例的步骤s101可以包括:根据cocoapods工具中的预先创建的cocoapods命令入参的参数内容判断当前应用构建环境;参数内容包括true或false;当参数内容为true时,应用构建环境为生产环境;当参数内容为false时,应用构建环境为开发环境。

一个实施例中,cocoapods在安装依赖库结束时,会回调一个post_install的hook函数,hook函数是指允许开发者将额外逻辑插入到安装依赖库过程中的函数,开发者插入的额外逻辑即为hook,也就是本实施例中的应用构建中的预编译方法。

请参阅图7,图7是本申请的另一实施例提供的一种应用构建中的预编译装置的结构示意图。

如图7所示,本实施例提供的应用构建中的预编译装置可以包括:

获取模块71,用于获取环境参数中的参数内容;

切换模块72,用于根据参数内容对当前的应用构建环境进行切换;

第一处理模块73,用于当当前的应用构建环境切换为第一环境时,将目标依赖库预先编译为二进制文件,根据二进制文件生成私有依赖库;

第二处理模块74,用于当当前的应用构建环境切换为第二环境时,获取私有依赖库并进行安装,运行私有依赖库。

请参阅图8,图8是本申请的另一实施例提供的一种计算机设备的结构示意图。

如图8所示,本实施例提供的计算机设备包括:存储器81和处理器82,存储器存储有计算机程序,处理器执行计算机程序时实现应用构建中的预编译方法的步骤。

本申请的另一实施例提供一种计算机可读存储介质,其上存储有计算机程序,计算机程序被处理器执行时实现应用构建中的预编译方法中的各个步骤。

其中,应用构建中的预编译方法中的各个步骤可参考上述有关该方法的实施例中的说明,此处不做详细阐述说明。

关于上述实施例中的装置,其中各个模块执行操作的具体方式已经在有关该方法的实施例中进行了详细描述,此处将不做详细阐述说明。

可以理解的是,上述各实施例中相同或相似部分可以相互参考,在一些实施例中未详细说明的内容可以参见其他实施例中相同或相似的内容。

需要说明的是,在本申请的描述中,术语“第一”、“第二”等仅用于描述目的,而不能理解为指示或暗示相对重要性。此外,在本申请的描述中,除非另有说明,“多个”的含义是指至少两个。

流程图中或在此以其他方式描述的任何过程或方法描述可以被理解为,表示包括一个或更多个用于实现特定逻辑功能或过程的步骤的可执行指令的代码的模块、片段或部分,并且本申请的优选实施方式的范围包括另外的实现,其中可以不按所示出或讨论的顺序,包括根据所涉及的功能按基本同时的方式或按相反的顺序,来执行功能,这应被本申请的实施例所属技术领域的技术人员所理解。

应当理解,本申请的各部分可以用硬件、软件、固件或它们的组合来实现。在上述实施方式中,多个步骤或方法可以用存储在存储器中且由合适的指令执行系统执行的软件或固件来实现。例如,如果用硬件来实现,和在另一实施方式中一样,可用本领域公知的下列技术中的任一项或他们的组合来实现:具有用于对数据信号实现逻辑功能的逻辑门电路的离散逻辑电路,具有合适的组合逻辑门电路的专用集成电路,可编程门阵列(pga),现场可编程门阵列(fpga)等。

本技术领域的普通技术人员可以理解实现上述实施例方法携带的全部或部分步骤是可以通过程序来指令相关的硬件完成,所述的程序可以存储于一种计算机可读存储介质中,该程序在执行时,包括方法实施例的步骤之一或其组合。

此外,在本申请各个实施例中的各功能单元可以集成在一个处理模块中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个模块中。上述集成的模块既可以采用硬件的形式实现,也可以采用软件功能模块的形式实现。所述集成的模块如果以软件功能模块的形式实现并作为独立的产品销售或使用时,也可以存储在一个计算机可读取存储介质中。

上述提到的存储介质可以是只读存储器,磁盘或光盘等。

在本说明书的描述中,参考术语“一个实施例”、“一些实施例”、“示例”、“具体示例”、或“一些示例”等的描述意指结合该实施例或示例描述的具体特征、结构、材料或者特点包含于本申请的至少一个实施例或示例中。在本说明书中,对上述术语的示意性表述不一定指的是相同的实施例或示例。而且,描述的具体特征、结构、材料或者特点可以在任何的一个或多个实施例或示例中以合适的方式结合。

尽管上面已经示出和描述了本申请的实施例,可以理解的是,上述实施例是示例性的,不能理解为对本申请的限制,本领域的普通技术人员在本申请的范围内可以对上述实施例进行变化、修改、替换和变型。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1