发明内容
本公开实施例至少提供一种软件工具包地址定位方法及装置。
第一方面,本公开实施例提供了一种软件工具包地址定位方法,包括:
获取应用程序的链接映射文件,以及所述应用程序的至少一个软件开发工具包的名称信息;
基于每个所述软件开发工具包的名称信息,从所述链接映射文件中查找所述软件开发工具包对应的各个可执行文件的符号信息;
基于查找到的各个符号信息指示的起始地址及存储空间占用大小,确定所述软件开发工具包的地址信息。
一种可选的实施方式中,所述方法还包括:
在检测到应用程序发生崩溃的情况下,获取发生崩溃的目标地址;
基于发生崩溃时所述应用程序的地址空间偏移量,以及所述至少一个软件开发工具包的地址信息,分别确定每个所述软件开发工具包经过地址空间偏移后的绝对地址;
基于所述目标地址及所述绝对地址,确定所述应用程序中发生崩溃的目标软件开发工具包。
一种可选的实施方式中,基于每个所述软件开发工具包的名称信息,从所述链接映射文件中查找所述软件开发工具包对应的各个可执行文件的符号信息,包括:
基于所述软件开发工具包的名称信息,从所述链接映射文件中查找所述软件开发工具包对应的各个可执行文件,并确定所述各个可执行文件被分配的标识信息;
基于所述标识信息,从所述链接映射文件中查找所述软件开发工具包对应的各个可执行文件的符号信息。
一种可选的实施方式中,所述基于所述标识信息,从所述链接映射文件中查找所述软件开发工具包对应的各个可执行文件的符号信息,包括:
根据所述链接映射文件的符号信息列表中各个符号的类型信息,从所述符号信息列表中的符号信息中筛选出多个候选符号信息;
从所述候选符号信息中,查找与所述软件开发工具包对应的各个可执行文件的标识信息匹配的符号信息,作为所述各个可执行文件的符号信息。
一种可选的实施方式中,所述基于查找到的各个符号信息指示的起始地址及存储空间占用大小,确定所述软件开发工具包的地址信息,包括:
基于所述各个符号信息中的起始地址及存储空间占用信息,确定各个符号对应的地址范围;
对所述各个符号的地址范围进行整合,得到至少一个目标地址范围;每个目标地址范围由至少一个符号的地址范围构成;
基于所述至少一个目标地址范围对应的符号所属的软件开发工具包,确定所述应用程序的至少一个软件开发工具包的地址信息。
一种可选的实施方式中,所述对所述各个符号的地址范围进行整合,得到至少一个目标地址范围,包括:
基于所述各个符号的地址范围指示的起始地址与终止地址,若任一符号的终止地址与其它符号的起始地址相邻,则将所述任一符号和所述其它符号的地址范围进行整合,得到至少一个目标地址范围;或者,
基于所述各个符号信息在所述链接映射文件中所在的行数,将对应的行数相邻的符号的地址范围进行整合,得到至少一个目标地址范围。
第二方面,本公开实施例还提供一种软件工具包地址定位装置,包括:
获取模块,用于获取应用程序的链接映射文件,以及所述应用程序的至少一个软件开发工具包的名称信息;
查找模块,用于基于每个所述软件开发工具包的名称信息,从所述链接映射文件中查找所述软件开发工具包对应的各个可执行文件的符号信息;
定位模块,用于基于查找到的各个符号信息指示的起始地址及存储空间占用大小,确定所述软件开发工具包的地址信息。
一种可选的实施方式中,所述定位模块还用于:
在检测到应用程序发生崩溃的情况下,获取发生崩溃的目标地址;
基于发生崩溃时所述应用程序的地址空间偏移量,以及所述至少一个软件开发工具包的地址信息,分别确定每个所述软件开发工具包经过地址空间偏移后的绝对地址;
基于所述目标地址及所述绝对地址,确定所述应用程序中发生崩溃的目标软件开发工具包。
一种可选的实施方式中,所述查找模块具体用于:
基于所述软件开发工具包的名称信息,从所述链接映射文件中查找所述软件开发工具包对应的各个可执行文件,并确定所述各个可执行文件被分配的标识信息;
基于所述标识信息,从所述链接映射文件中查找所述软件开发工具包对应的各个可执行文件的符号信息。
一种可选的实施方式中,所述查找模块在基于所述标识信息,从所述链接映射文件中查找所述软件开发工具包对应的各个可执行文件的符号信息时,用于:
根据所述链接映射文件的符号信息列表中各个符号的类型信息,从所述符号信息列表中的符号信息中筛选出多个候选符号信息;
从所述候选符号信息中,查找与所述软件开发工具包对应的各个可执行文件的标识信息匹配的符号信息,作为所述各个可执行文件的符号信息。
一种可选的实施方式中,所述定位模块在基于查找到的各个符号信息指示的起始地址及存储空间占用大小,确定所述软件开发工具包的地址信息时,用于:
基于所述各个符号信息中的起始地址及存储空间占用信息,确定各个符号对应的地址范围;
对所述各个符号的地址范围进行整合,得到至少一个目标地址范围;每个目标地址范围由至少一个符号的地址范围构成;
基于所述至少一个目标地址范围对应的符号所属的软件开发工具包,确定所述应用程序的至少一个软件开发工具包的地址信息。
一种可选的实施方式中,所述定位模块在对所述各个符号的地址范围进行整合,得到至少一个目标地址范围时,用于:
基于所述各个符号的地址范围指示的起始地址与终止地址,若任一符号的终止地址与其它符号的起始地址相邻,则将所述任一符号和所述其它符号的地址范围进行整合,得到至少一个目标地址范围;或者,
基于所述各个符号信息在所述链接映射文件中所在的行数,将对应的行数相邻的符号的地址范围进行整合,得到至少一个目标地址范围。
第三方面,本公开实施例还提供一种电子设备,包括:处理器、存储器和总线,所述存储器存储有所述处理器可执行的机器可读指令,当电子设备运行时,所述处理器与所述存储器之间通过总线通信,所述机器可读指令被所述处理器执行时执行上述第一方面,或第一方面中任一种可能的实施方式中的步骤。
第四方面,本公开实施例还提供一种计算机可读存储介质,该计算机可读存储介质上存储有计算机程序,该计算机程序被处理器运行时执行上述第一方面,或第一方面中任一种可能的实施方式中的步骤。
本公开实施例提供的软件工具包地址定位方法及装置,首先获取应用程序的链接映射文件,以及所述应用程序的至少一个软件开发工具包的名称信息;然后,基于每个所述软件开发工具包的名称信息,从所述链接映射文件中查找所述软件开发工具包对应的各个可执行文件的符号信息;最后,基于查找到的各个符号信息指示的起始地址及存储空间占用大小,确定所述软件开发工具包的地址信息。本公开实施例根据链接映射文件及软件开发工具包的名称信息,查找出软件开发工具包对应的可执行文件的符号信息,再根据符号信息的起始地址及存储空间占用大小,确定软件开发工具包的地址信息,不需要对每个SDK代码进行修改,方便快捷,无代码入侵性。
为使本公开的上述目的、特征和优点能更明显易懂,下文特举较佳实施例,并配合所附附图,作详细说明如下。
具体实施方式
为使本公开实施例的目的、技术方案和优点更加清楚,下面将结合本公开实施例中附图,对本公开实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本公开一部分实施例,而不是全部的实施例。通常在此处附图中描述和示出的本公开实施例的组件可以以各种不同的配置来布置和设计。因此,以下对在附图中提供的本公开的实施例的详细描述并非旨在限制要求保护的本公开的范围,而是仅仅表示本公开的选定实施例。基于本公开的实施例,本领域技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都属于本公开保护的范围。
应注意到:相似的标号和字母在下面的附图中表示类似项,因此,一旦某一项在一个附图中被定义,则在随后的附图中不需要对其进行进一步定义和解释。
本文中术语“和/或”,仅仅是描述一种关联关系,表示可以存在三种关系,例如,A和/或B,可以表示:单独存在A,同时存在A和B,单独存在B这三种情况。另外,本文中术语“至少一种”表示多种中的任意一种或多种中的至少两种的任意组合,例如,包括A、B、C中的至少一种,可以表示包括从A、B和C构成的集合中选择的任意一个或多个元素。
经研究发现,若想要确定SDK的地址信息,则需要在SDK内增加两个源文件,并调整源文件的编译链接顺序,使增加的两个源文件分别是首个和最后一个进行编译链接的,这样,即可根据增加的两个源文件的地址确定SDK的地址。然而,这种方式操作繁琐,效率较低,且容易导致代码在二进制重排后的结果不可靠。
基于上述研究,本公开提供了一种软件工具包地址定位方法及装置,根据链接映射文件及软件开发工具包的名称信息,查找出软件开发工具包对应的可执行文件的符号信息,再根据符号信息的起始地址及存储空间占用大小,确定软件开发工具包的地址信息,不需要对每个SDK代码进行修改,方便快捷,无代码入侵性。
为便于对本实施例进行理解,首先对本公开实施例所公开的一种软件工具包地址定位方法进行详细介绍,本公开实施例所提供的软件工具包地址定位方法的执行主体一般为具有一定计算能力的计算机设备。在一些可能的实现方式中,该方法可以通过处理器调用存储器中存储的计算机可读指令的方式来实现。
参见图1所示,为本公开实施例提供的软件工具包地址定位方法的流程图,所述方法包括步骤S101~S103,其中:
S101、获取应用程序的链接映射文件,以及所述应用程序的至少一个软件开发工具包的名称信息。
该步骤中,上述应用程序可以为运行于iOS系统下的程序,可以包含有多个组件,组件的表现形式可以为SDK,各个SDK都存在相应的名称信息(也即标识信息),链接映射文件可以为对应用程序的源文件进行编译时产生的中间产物,在将源文件编译为可执行的二进制文件的过程中,通常会生成链接映射(Link Map)文件,该文件可以展示整个可执行文件的全貌,列出编译后的每一个目标文件的信息,以及每一个目标文件的代码段、数据段存储详情,目标文件可以为后缀为.o的可执行文件及后缀名为.a的静态库文件。
S102、基于每个所述软件开发工具包的名称信息,从所述链接映射文件中查找所述软件开发工具包对应的各个可执行文件的符号信息。
在链接映射文件中,存储有应用程序中各个可执行文件的信息,通过可执行文件信息可以确定各个可执行文件的符号信息,符号信息中通常会包含符号的地址信息。
示例性的,由于链接映射文件中记载了各个可执行文件的信息,可执行文件的信息中通常会包含其所属的SDK的名称信息,因此,可以基于软件开发工具包的名称信息,从所述链接映射文件中查找软件开发工具包包含的各个可执行文件,查找到SDK的名称信息所在位置,进而判断该位置所属的可执行文件,再从该可执行文件的信息中确定可执行文件被分配的标识信息。
通常,一个SDK能够被编译为多个可执行文件,每个可执行文件可以拥有对应的符号,链接映射文件中也包括各个符号的信息,符号信息中包括该符号所对应的可执行文件的标识信息,这样,可以在链接映射文件中查找上述可执行文件的标识信息,从而定位可执行文件对应的符号所对应的符号信息。
由于某些SDK的架构并不支持链接映射文件,可以先对SDK进行筛选,将不支持链接映射文件的SDK筛除,仅获取支持链接映射文件的SDK的名称信息,减少计算资源的消耗。
在确定SDK对应的可执行文件时,可以从链接映射文件中的对象文件Objectfiles中过滤出SDK的可执行文件(如后缀名为.o的文件),示例性的,对象文件中的每一行数据记录了链接进应用程序产物的可执行文件路径,并且为该信息分配了一个编号(标识信息),这样,即可获取到包含SDK名称信息的路径,从而确定这些路径对应的编号。
之后,在得到各个SDK对应的可执行文件的标识信息后,可以读取链接映射文件中的符号Symbols部分,该部分中存储有应用程序对应的符号信息,包括符号的起始地址、所占存储空间大小、所属可执行文件的标识信息、符号名称等,可以根据上述查找到的SDK的可执行文件的标识信息,进行可执行文件对应的符号信息的定位,得到可执行文件对应符号的符号信息。
这里,对于一些符号,如literal string、CFString等,这些符号不会直接出现在崩溃堆栈中,无法对崩溃检测提供参考,因此,在以崩溃定位为目的进行SDK地址定位时,可以不收集这些符号的符号信息,根据链接映射文件的符号信息列表中各个符号的类型信息,从符号信息列表中的符号信息中先筛选出多个候选符号信息,再从候选符号信息中查找与可执行文件的标识信息匹配的符号信息,能够有效提高效率,减少计算资源的消耗。
进一步的,在查找符号信息时,可以使用全局搜索正则表达式并打印文本行(Gloabal Search Regular Expression and Print out the line,grep)命令,由于SDK中可能包含大量可执行文件,若对所有的标识信息都进行查找过滤,可能导致内存溢出,为了避免这种情况,可以进行分组查找,从而降低一次查找加载的数据,降低计算压力。在分组进行查找时,为了避免影响后续确定SDK的地址信息时的性能,可以对过滤出的符号信息进行排序,防止因顺序被打乱而消耗更多计算资源进行整理。
S103、基于查找到的各个符号信息指示的起始地址及存储空间占用大小,确定所述软件开发工具包的地址信息。
该步骤中,可以根据符号的存储空间占用大小确定符号所占用的地址长度,然后就可以基于起始地址及地址长度确定该符号的地址范围,可以基于各个符号信息中的起始地址及存储空间占用信息,确定各个符号对应的地址范围,通常一个SDK的会包含多个符号,一个SDK的符号通常是连续的,因此,可以对各个符号的地址范围进行整合,将连续的符号地址整合在一起,得到至少一个目标地址范围,得到的目标地址范围由至少一个符号的地址范围构成。
示例性的,可以基于各个符号的地址范围指示的起始地址与终止地址,若任一符号的终止地址与其它符号的起始地址相邻,则认为上述符号为连续的符号,直到确定出所有连续的符号后,可以将连续的符号的地址范围进行整合,得到至少一个目标地址范围。
然而,上述方式需要对每个符号的起始地址与其他符号的终止地址进行比较,存在大量的计算,可能对设备的性能有一定影响,因此,可以不利用符号的起始地址及终止地址进行地址范围整合,而是利用各个符号信息中起始地址与终止地址所在的链接映射文件中的行数进行地址范围整合,在链接映射文件中,符号信息本身就是按照位置顺序进行排列的,行数连续的符号信息,其对应的符号也是连续的,因此,可以判断两个符号信息在链接映射文件中所在的行数,若两个符号信息对应的行数是相邻的,则可以确定两者也是连续的,将其对应的地址范围进行整合,整合后的地址范围可以继续和其他符号的地址范围进行整合,最后得到目标地址范围。
并且,在某些架构,如armv7架构下,由于内存对齐机制的存在,一些连续的符号地址不一定连续,即两个符号之间会出现一些空字节,根据行数进行地址范围整合,得到的目标地址范围通常会比利用起始地址与终止地址进行整合得到的数量更低,有利于后续的使用。
这样,得到的所属SDK相同的目标地址范围,即可作为对应的SDK地址信息。
上述两种方式都可以用于确定目标地址范围,可以根据精确度和性能的要求选择具体使用的方式。
在得到各个SDK的地址信息之后,可以利用得到的地址信息进行异常定位,示例性的,在检测到应用程序发生崩溃的情况下,可以获取崩溃堆栈中记录的发生崩溃的目标内存地址,然后基于发生崩溃时应用程序的地址空间偏移量,对各个SDK的地址信息进行偏移,确定各个SDK经过地址偏移后的绝对地址,该绝对地址通常为一个或多个地址范围,得到绝对地址后,即可判断目标地址是否处于某个绝对地址内,并根据判断结果进行崩溃的定位,确定出应用程序中发生崩溃的目标软件开发工具包。
本公开实施例提供的软件工具包地址定位方法,首先获取应用程序的链接映射文件,以及所述应用程序的至少一个软件开发工具包的名称信息;然后,基于每个所述软件开发工具包的名称信息,从所述链接映射文件中查找所述软件开发工具包对应的各个可执行文件的符号信息;最后,基于查找到的各个符号信息指示的起始地址及存储空间占用大小,确定所述软件开发工具包的地址信息。本公开实施例根据链接映射文件及软件开发工具包的名称信息,查找出软件开发工具包对应的可执行文件的符号信息,再根据符号信息的起始地址及存储空间占用大小,确定软件开发工具包的地址信息,不需要对每个SDK代码进行修改,方便快捷,无代码入侵性。
参见图2所示,为本公开实施例所提供的另一种软件工具包地址定位方法的流程图,首先需要对应用程序的源代码接入用于崩溃定位的脚本,接入的脚本可以对应用程序的运行状态进行监测,在发生崩溃时获取目标内存地址,并执行定位发生崩溃SDK的指令,在接入脚本后,即可将应用程序打包,并在打包的过程中生成了链接映射Link Map文件,得到链接映射文件后,即可对链接映射文件进行处理,从链接映射文件中查找可执行文件的标识信息,再利用查找到的标识信息查找SDK的符号信息,最后利用查找到的符号信息进行地址范围整合,得到各个SDK的地址信息,并将其写入到打包后的应用程序中,示例性的,可以将确定的SDK的地址信息写入plist文件中,在打包后的应用程序运行时,若发生崩溃,则可以利用接入的脚本获取发生崩溃的目标内存地址,并根据SDK的地址信息进行崩溃定位,定位到具体的SDK。
本领域技术人员可以理解,在具体实施方式的上述方法中,各步骤的撰写顺序并不意味着严格的执行顺序而对实施过程构成任何限定,各步骤的具体执行顺序应当以其功能和可能的内在逻辑确定。
基于同一发明构思,本公开实施例中还提供了与软件工具包地址定位方法对应的软件工具包地址定位装置,由于本公开实施例中的装置解决问题的原理与本公开实施例上述软件工具包地址定位方法相似,因此装置的实施可以参见方法的实施,重复之处不再赘述。
参照图3所示,为本公开实施例提供的一种软件工具包地址定位的示意图,所述装置包括:
获取模块310,用于获取应用程序的链接映射文件,以及所述应用程序的至少一个软件开发工具包的名称信息;
查找模块320,用于基于每个所述软件开发工具包的名称信息,从所述链接映射文件中查找所述软件开发工具包对应的各个可执行文件的符号信息;
定位模块330,用于基于查找到的各个符号信息指示的起始地址及存储空间占用大小,确定所述软件开发工具包的地址信息。
一种可选的实施方式中,所述定位模块330还用于:
在检测到应用程序发生崩溃的情况下,获取发生崩溃的目标地址;
基于发生崩溃时所述应用程序的地址空间偏移量,以及所述至少一个软件开发工具包的地址信息,分别确定每个所述软件开发工具包经过地址空间偏移后的绝对地址;
基于所述目标地址及所述绝对地址,确定所述应用程序中发生崩溃的目标软件开发工具包。
一种可选的实施方式中,所述查找模块320具体用于:
基于所述软件开发工具包的名称信息,从所述链接映射文件中查找所述软件开发工具包对应的各个可执行文件,并确定所述各个可执行文件被分配的标识信息;
基于所述标识信息,从所述链接映射文件中查找所述软件开发工具包对应的各个可执行文件的符号信息。
一种可选的实施方式中,所述查找模块320在基于所述标识信息,从所述链接映射文件中查找所述软件开发工具包对应的各个可执行文件的符号信息时,用于:
根据所述链接映射文件的符号信息列表中各个符号的类型信息,从所述符号信息列表中的符号信息中筛选出多个候选符号信息;
从所述候选符号信息中,查找与所述软件开发工具包对应的各个可执行文件的标识信息匹配的符号信息,作为所述各个可执行文件的符号信息。
一种可选的实施方式中,所述定位模块330在基于查找到的各个符号信息指示的起始地址及存储空间占用大小,确定所述软件开发工具包的地址信息时,用于:
基于所述各个符号信息中的起始地址及存储空间占用信息,确定各个符号对应的地址范围;
对所述各个符号的地址范围进行整合,得到至少一个目标地址范围;每个目标地址范围由至少一个符号的地址范围构成;
基于所述至少一个目标地址范围对应的符号所属的软件开发工具包,确定所述应用程序的至少一个软件开发工具包的地址信息。
一种可选的实施方式中,所述定位模块330在对所述各个符号的地址范围进行整合,得到至少一个目标地址范围时,用于:
基于所述各个符号的地址范围指示的起始地址与终止地址,若任一符号的终止地址与其它符号的起始地址相邻,则将所述任一符号和所述其它符号的地址范围进行整合,得到至少一个目标地址范围;或者,
基于所述各个符号信息在所述链接映射文件中所在的行数,将对应的行数相邻的符号的地址范围进行整合,得到至少一个目标地址范围。
关于装置中的各模块的处理流程、以及各模块之间的交互流程的描述可以参照上述方法实施例中的相关说明,这里不再详述。
对应于图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执行的指令中,所述基于查找到的各个符号信息指示的起始地址及存储空间占用大小,确定所述软件开发工具包的地址信息,包括:
基于所述各个符号信息中的起始地址及存储空间占用信息,确定各个符号对应的地址范围;
对所述各个符号的地址范围进行整合,得到至少一个目标地址范围;每个目标地址范围由至少一个符号的地址范围构成;
基于所述至少一个目标地址范围对应的符号所属的软件开发工具包,确定所述应用程序的至少一个软件开发工具包的地址信息。
一种可选的实施方式中,所述处理器41执行的指令中,所述对所述各个符号的地址范围进行整合,得到至少一个目标地址范围,包括:
基于所述各个符号的地址范围指示的起始地址与终止地址,若任一符号的终止地址与其它符号的起始地址相邻,则将所述任一符号和所述其它符号的地址范围进行整合,得到至少一个目标地址范围;或者,
基于所述各个符号信息在所述链接映射文件中所在的行数,将对应的行数相邻的符号的地址范围进行整合,得到至少一个目标地址范围。
本公开实施例还提供一种计算机可读存储介质,该计算机可读存储介质上存储有计算机程序,该计算机程序被处理器运行时执行上述方法实施例中所述的软件工具包地址定位方法的步骤。其中,该存储介质可以是易失性或非易失的计算机可读取存储介质。
本公开实施例还提供一种计算机程序产品,该计算机程序产品承载有程序代码,所述程序代码包括的指令可用于执行上述方法实施例中所述的软件工具包地址定位方法的步骤,具体可参见上述方法实施例,在此不再赘述。
其中,上述计算机程序产品可以具体通过硬件、软件或其结合的方式实现。在一个可选实施例中,所述计算机程序产品具体体现为计算机存储介质,在另一个可选实施例中,计算机程序产品具体体现为软件产品,例如软件开发包(Software Development Kit,SDK)等等。
所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的装置的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。在本公开所提供的几个实施例中,应该理解到,所揭露的装置和方法,可以通过其它的方式实现。以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,又例如,多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些通信接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本公开各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。
所述功能如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个处理器可执行的非易失的计算机可读取存储介质中。基于这样的理解,本公开的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本公开各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(Read-OnlyMemory,ROM)、随机存取存储器(Random Access Memory,RAM)、磁碟或者光盘等各种可以存储程序代码的介质。
最后应说明的是:以上所述实施例,仅为本公开的具体实施方式,用以说明本公开的技术方案,而非对其限制,本公开的保护范围并不局限于此,尽管参照前述实施例对本公开进行了详细的说明,本领域的普通技术人员应当理解:任何熟悉本技术领域的技术人员在本公开揭露的技术范围内,其依然可以对前述实施例所记载的技术方案进行修改或可轻易想到变化,或者对其中部分技术特征进行等同替换;而这些修改、变化或者替换,并不使相应技术方案的本质脱离本公开实施例技术方案的精神和范围,都应涵盖在本公开的保护范围之内。因此,本公开的保护范围应所述以权利要求的保护范围为准。