用于计算设备的共享软件库的制作方法

文档序号:17727681发布日期:2019-05-22 02:37阅读:204来源:国知局
用于计算设备的共享软件库的制作方法

本专利申请要求在2017年3月14日提交的题为“sharedsoftwarelibrariesforcomputingdevices(用于计算设备的共享软件库)”的美国临时专利申请no.62/471,298的优先权,其内容通过引用整体并入本文以用于各种目的。



背景技术:

许多计算设备(包括移动计算设备)可以运行应用软件以执行各种功能,例如通信相关功能、数据操纵功能、图像生成和/或呈现功能、音频生成和/或呈现功能以及其他功能。可以将应用软件从服务器或其他计算设备下载或传送到计算设备。在某些情况下,应用软件可以作为软件包的一部分下载。软件包可以包括应用软件和用于安装应用软件的指令。例如,软件包可以是可执行的,以执行安装应用软件的指令。

一些软件应用可以依赖于一个或多个软件库中包含的功能。示例软件库包括具有输入/输出功能、图形用户界面功能、操作系统接口功能、存储器管理功能、数学功能和其他功能的软件。例如,软件应用可以被存储在包括应用使用的软件库的可执行文件中。



技术实现要素:

在一个方面,提供了一种方法。计算设备接收由软件应用使用的至少第一软件库的版本化共享库信息,其中,第一软件库的版本化共享库信息包括第一软件库的标识符。计算设备确定计算设备是否存储由第一软件库的标识符在版本化共享库信息中标识的第一软件库的副本。基于计算设备是否存储第一软件库的副本,计算设备发送对软件应用的完整可执行文件和剥离可执行文件之一的请求,其中,完整可执行文件至少包括第一软件库,并且其中,剥离可执行文件不包括第一软件库。响应于该请求,计算设备接收用于软件应用的完整可执行文件或剥离可执行文件用于存储在计算设备上。

在另一方面,提供了一种计算设备。计算设备包括:一个或多个处理器;以及,数据存储,至少包括被存储在其上的计算机可执行指令,当由一个或多个处理器执行时,该指令使得计算设备执行功能。所述功能包括:接收软件应用使用的至少第一软件库的版本化共享库信息,其中,第一软件库的版本化共享库信息包括第一软件库的标识符;确定计算设备是否被存储由第一软件库的标识符在版本化共享库信息中标识的第一软件库的副本;基于计算设备是否存储第一软件库的副本,发送对软件应用的完整可执行文件和剥离可执行文件之一的请求,其中,完整可执行文件包括第一软件库,并且剥离可执行文件不包括第一软件库;并且响应于该请求,接收软件应用的完整可执行文件或剥离可执行文件用于存储在计算设备上。

在另一方面,提供了一种计算机可读介质。计算机可读介质上存储有指令,当由计算设备的一个或多个处理器执行时,该指令使计算设备执行功能。所述功能包括:接收软件应用使用的至少第一软件库的版本化共享库信息,其中,第一软件库的版本化共享库信息包括第一软件库的标识符;确定计算设备是否存储由第一软件库的标识符在版本化共享库信息中标识的第一软件库的副本;基于计算设备是否存储第一软件库的副本,发送对软件应用的完整可执行文件和剥离可执行文件之一的请求,其中,完整可执行文件包括第一软件库,并且剥离可执行文件不包括第一软件库;并且响应于该请求,接收软件应用的完整可执行文件或剥离可执行文件用于存储在计算设备上。

在另一方面,提供了一种装置。该装置包括:用于接收软件应用使用的至少第一软件库的版本化共享库信息的装置,其中,第一软件库的版本化共享库信息包括第一软件库的标识符;用于确定计算设备是否被存储在版本化共享库信息中由第一软件库的标识符标识的第一软件库的副本的装置;用于基于计算设备是否存储第一软件库的副本来发送对软件应用的完整可执行文件和剥离可执行文件之一的请求的装置,其中,完整可执行文件包括第一软件库,并且剥离可执行文件不包括第一软件库;以及,用于响应于该请求接收软件应用的完整可执行文件或剥离可执行文件用于存储在计算设备上的装置。

前述发明内容仅是说明性的,并不旨在以任何方式进行限制。除了以上描述的说明性方面、实施例和特征之外,通过参考图和以下详细描述以及附图,其他方面、实施例和特征将变得显而易见。

附图说明

图1示出了根据示例实施例的由应用商店存储的软件包。

图2示出了根据示例实施例的工作流。

图3a和3b示出了根据示例实施例的涉及使用软件包和共享存储库创建和安装软件应用的场景。

图4描绘了根据示例实施例的分布式计算架构。

图5a是根据示例实施例的计算设备的功能框图。

图5b描绘了根据示例实施例的布置为基于云的服务器系统的计算集群的网络。

图6是根据示例实施例的方法的流程图。

具体实施方式

用于共享软件库的技术和装置

软件应用可以用一种或多种计算机语言编写为源代码。在某些情况下,可以编译软件应用的源代码,并且可以将编译的源代码存储在可执行文件中,并且可执行文件中的编译代码可以由计算设备执行以执行软件应用的各种功能。这些功能的一些可以被存储在一个或多个软件库中。然后,作为创建软件应用的可执行文件的一部分,一个或多个软件库可以与源代码的编译指令“链接”。可以静态链接这些软件库;即,软件库被包括在可执行文件中。注意,除非通过上下文另外清楚,否则术语“库”和“可执行”分别在整个说明书中指代软件库和可执行文件。

然而,如果若干应用使用公共库,则公共库的静态链接可以创建公共库的若干副本,并且浪费用于保存相同公共库的副本的存储。在一项与超过10,000,000个已安装软件应用的样本相关的研究中,发现移动计算设备应用每个应用使用大约1兆字节(mb)的存储来存储库。许多这些库被多个应用使用,其中,最常用的库被90%以上的采样安装应用使用,并且其中,至少10%的采样安装软件应用使用了至少5个库。此外,库的规模可以随着时间的推移而增长;例如,该研究还表明,库大小在三年内增长了约50%,因此移动计算设备应用可以在几年内每个应用使用超过1.5mb(或更多)的存储来存储库。根据一个估计,如果三个或更多应用共享在计算设备上存储一次的公共库,则用于存储共享公共库的一个存储副本的三个或更多个应用的存储量小于用于存储三个或更多应用的存储量,每个应用中都链接有公共库。因此,即使相对较少的库共享——即在至少三个应用之间的库共享——也可以节省存储空间,并且这些节省可以随着时间的推移而增长。

链接库的另一种技术是动态链接库;也就是说,在运行时将库加载到存储器中;也就是说,将对应于软件应用的源代码的可执行指令加载到存储器中,然后将库加载到存储器中。如果库已经被加载到存储器中(例如,另一个应用正在使用该库),则对已经加载的库的一个或多个存储器引用可以被解析或者引用已经加载的库的存储器地址。然后,如果只有一个库的副本被存储在计算设备上,然后动态加载库,则可以保存存储空间。

但是,随着库的发展,动态加载可能导致困难。通常,动态加载命名库涉及在运行时加载至少部分命名库。在某些情况下,库可以“向后兼容”;也就是说,该库的较新版本支持该库的一个或多个先前版本的所有(或至少大多数)功能。随着库的演进,维持向后兼容性可能很困难,因为重组和/或新功能可能会改变先前的功能。如果库不是真正向后兼容的,这些更改可能会导致以前工作的软件应用出现故障,该应用依赖于早期版本库中实现的功能。

如果使用静态链接库构建应用,则可以保证使用特定版本的库,因为软件应用的开发者或其他作者可以生成包括库的特定版本的可执行文件。如上所述,库的静态链接可以使软件应用的开发者控制库兼容性,代价是(可能)浪费的库存储空间。

这里公开了用于存储、访问、加载/使用和管理版本化共享库的技术和装置。这些技术使软件开发人员能够为动态加载和其他目的指定一个且仅一个版本的共享库,即使共享库的多个版本可用也是如此。也就是说,计算设备可以通过以下方式使用共享库来模拟静态链接库:(a)确保在计算设备上安装共享库的一个或多个版本,然后(b)允许应用准确地指定哪个版本的共享库将在运行时动态链接到应用。

使用动态加载的共享库降低了相同版本的库的多个副本被存储在计算设备上的可能性,从而节省了存储。此外,使用共享库可以减少可执行文件大小,因为使用共享库的可执行文件不需要包含这些共享库的副本。减少可执行文件大小可以缩小相应软件包的大小,通过使得能够下载较小的软件包并在下载时分配和存储应用所花费的时间更少,从而使得应用安装加快。此外,开发人员可以指定使用哪个版本的库来保持对库兼容性的控制。允许指定特定版本的共享库可以允许开发人员按照他们迄今为止所做的那样并确信库不会存在兼容性问题地设计他们的应用。此外,只要旧版本的共享库仍然可用,升级库软件的开发人员就不太关心向后兼容性。

在一些环境中,一个或多个“应用商店”或用于软件应用的分发平台可以存储软件应用和软件应用使用的一个或多个库的一个或多个版本,包括部分地通过诸如版本号的版本信息指定的库的版本化共享库。然后,应用商店可以根据请求向计算设备提供软件应用和相关库。

应用商店可以生成和/或提供多个软件包;例如,第一包,其具有应用a的剥离可执行文件和指定使用一个或多个共享库的信息,其中,剥离可执行文件不包括一个或多个共享库;以及,第二包,其包括包括共享库的应用a的完整可执行文件。在通过目标设备下载第一软件包之前,目标设备和/或一个或多个其他计算设备可以使用共享库信息来确定共享库是丢失还是已经被存储在目标设备上。一旦目标设备存储了在共享库信息中列出的所有共享库的副本,则目标设备可以下载第一软件包。当一个或多个共享库的使用不可行时,可以将第二包提供给目标设备。例如,不是下载和安装应用a的所有设备都支持共享库;在这些情况下,此类设备可以下载并安装第二包以利用应用a的完整可执行文件。

在一些示例中,可以使用部分完整可执行文件。部分完整可执行文件可以共享一个或多个软件库,并且可以包括一个或多个其他软件库。例如,假设应用a_hybrid依赖于两个库:库l_hy1的版本v.1.1和库l_hy2的版本v.1.1。因此,应用a_hybrid可以与至少下面四个可能的软件包相关联:(1)具有a_hybrid的完整可执行文件的完整软件包,(2)带有用于a_hybrid的剥离可执行文件的剥离软件包,其包括用于库l_hy1的版本v.1.1和l_hy2的版本v.1.1的共享库信息,(3)第一部分完整软件包,其带有a_hybrid的部分完整可执行文件,其包含库l_hy1版本v.1.1的副本和库l_hy2版本v.1.1的共享库信息,以及(4)第二部分完整软件包,其带有a_hybrid的部分完整可执行文件,其包含库l_hy2版本v.1.1的副本以及库l_hy1版本v.1.1的共享库信息。在此示例中,进一步假设库l_hy2版本v.1.1不再作为共享库被支持,而库l_hy1版本v.1.1仍然作为共享库被支持。然后,可以使第二部分完整软件包可用于下载而不是剥离软件包或第一部分完整软件包。部分完整可执行文件的其他示例也是可能的。

为了生成用于使用共享库的应用的软件包,开发者可以提供应用的一个或多个可执行文件以及关于共享库的共享库信息。共享库信息可以具有诸如标签的共享库元数据和/或其他数据的形式。共享库信息可用于“构建”或生成软件应用的可执行文件,并确保可以运行应用的可执行文件;即,在首次执行可执行文件之前确保指定的共享库的副本可用。例如,共享库信息可以包括关于精确共享库的信息,包括库名称、库版本号和/或关于精确共享库的其他数据;例如,特定于精确共享库的散列值。

一个或多个应用编程接口(api)可以使应用商店和/或其他实体例如在目标设备上执行的应用商店客户端能够确定共享库和/或共享库的特定版本是否是从计算设备丢失或已经被存储在计算设备例如下载软件包的目标设备上。如上所述,软件包的共享库信息可以包括版本控制信息。然后,api可用于获取用于确定共享库信息中指定的共享库的特定版本是否从目标设备丢失或已被存储在目标设备上的信息。在一些示例中,当一个或多个共享库从目标设备中丢失时,目标设备可以从应用商店获得丢失的共享库;例如,在应用下载过程期间。

软件实用程序可以帮助生成和分发具有共享库的软件包。例如,上载软件实用程序可以将具有完整可执行文件的完整软件包作为输入,其中,完整可执行文件包括应用软件的编译副本和应用软件使用的任何共享库的副本。执行时,上载软件实用程序可以生成相应的剥离软件包,其包括剥离可执行文件和共享库信息,其中,剥离可执行文件可以是完整可执行文件的版本而不包含共享库的副本,并且共享库信息可以提供有关被移除以创建剥离可执行文件的共享库的名称和版本的信息。在某些情况下,完整软件包可以包括有关应用软件使用的一个或多个可能共享库的共享库信息。因此,上载软件实用程序可以确定共享库信息对于每个可能共享的库是否正确(即,确保库的版本实际上可用作共享库)。如果有关共享库的信息正确,则上载软件实用程序可以从可执行文件中剥离共享库,并提供有关剥离共享库的共享库信息来作为剥离软件包的一部分。在一些示例中,可以使用可以与上载软件实用程序不同的软件编译/构建工具来生成剥离可执行文件、剥离软件包、共享库信息、完整可执行文件和完整软件包。例如,应用开发人员可以使用这些软件编译/构建工具来生成可执行文件、包和共享库信息,而无需上载(或下载)信息

上载软件实用程序可以与应用商店相关联,并且因此开发者可以将完整软件包上载到应用商店。作为上载过程的一部分,应用商店可以使用上载的完整软件包作为输入来调用上载软件实用程序,以生成相应的一个或多个剥离软件包。在一些示例中,共享库信息可以包括用于创建具有共享库信息、构建信息、软件、资源和其他依赖信息(例如,关于哪些软件组件依赖于其他软件组件的信息)的单个(二进制)文件的构建信息,用于构建软件应用。然后,可以将(二进制)文件上载到应用商店,以便由上载软件实用程序分析、处理和生成软件包。在其他示例中,上载过程可以包括应用商店以剥离可执行文件和共享库信息作为输入使用上载的剥离软件包调用上载软件实用程序,以生成包括完整可执行文件的相应完整软件包,其中,该完整可执行文件包括剥离可执行文件和共享库信息中引用的库的副本。

在已经执行上载软件实用程序之后,应用商店然后可以使完整和/或剥离软件包可用于随后的下载和安装。在一些示例中,上载软件实用程序可以生成一个或多个完整和/或剥离软件包,这些软件包已经被定制以供特定品牌和/或型号的计算设备使用;例如,针对屏幕尺寸、可用存储器、处理器和/或计算设备的其他特征进行定制。上载软件实用程序可以简化应用软件的软件分发,因为开发人员无需构建同一应用的多个版本;相反,软件实用程序可以生成多个定制的软件包,用于分发软件应用。

下载软件实用程序可以接收对应用软件的请求,并传递适合于由请求设备使用的软件包。在一些示例中,下载软件实用程序可以直接在应用商店服务器上执行;而在其他示例中,下载软件实用程序可以是应用商店客户端的一部分和/或在发送请求应用软件的请求设备上执行的其他软件。

下载软件实用程序可以与请求设备通信以根据请求设备是否可以假设使用共享库提供完整软件包或剥离软件包。下载软件实用程序可以下载,并如果请求设备不支持使用共享库,则安装完整软件包,或者如果请求设备支持使用共享库,则安装剥离软件包。

如果可以安装剥离软件包,则下载软件实用程序可以验证请求设备具有可以在剥离软件包中使用的共享库的版本的副本。要执行此验证,下载软件实用程序可以检查剥离软件包中的共享库信息,以查看软件应用是否使用任何共享库。然后,相关软件实用程序可以使用版本匹配来将剥离软件包使用的任何共享库与可用共享库列表进行比较。如果检测到共享库的版本匹配,则下载软件实用程序可以根据需要:与在请求设备上执行的软件实用程序的版本通信,以确定匹配的共享库是否已经驻留在共享设备上;并通过至少从完整软件包中剥离共享库来生成引用匹配的共享库的剥离软件包。

如果请求设备丢失一个或多个匹配的共享库,则可以在安装剥离软件包期间从应用商店下载那些丢失的共享库。如果必须“修补”或更新软件包以修复错误和/或以其它方式改进软件应用和/或软件包,则修补软件可以支持剥离和完整软件包的补丁,不同该补丁因基于软件包的类型和/或其内容而不同;例如,被修补的库是否存在于软件包中。在某些情况下,软件实用程序可以使用可用共享库列表来验证软件包的正确性。例如,如果剥离软件包包含对不在可用共享库列表中的共享库的引用,则可以更新剥离软件包以移除对不在可用共享列表中的共享库的引用。

此外,应用商店可以限制或以其它方式控制在任何时间支持的库的版本的数量。限制可用于共享库的版本的数量可能是有益的,因为具有非流行库和/或可用于流行库的太多版本可能占用大量存储以用于共享库的版本的扩展。

为了支持共享库的使用,诸如移动计算设备之类的计算设备可以包括用于共享库的数据存储和用于管理所存储的共享库的库管理软件;例如,用于安装、移除和维护关于存储的共享库的信息的软件以及api和/或使得能够访问关于被存储在计算设备上的共享库的信息的其他软件。库管理软件可以包括强制移除和/或垃圾收集共享库的软件;也就是说,移除在一段时间内未被利用和/或未被至少阈值数量的应用(例如,一个、两个)作为共享库引用的共享库。引用特定共享库sl1的应用的数量、也称为共享库sl1的“引用计数”可以被初始化为零,当安装引用sl1的软件应用时递增,并且当卸载引用sl1的软件应用时递减。库管理软件可以包括用于将软件应用的剥离可执行文件替换为包括共享库的副本的对应的完整可执行文件的软件使得可以移除共享库。例如,如果被存储在计算设备cd1上的仅一个应用a1引用共享库sl1的特定版本v1,那么库管理软件可以用a1的包括共享库sl1的版本v1的副本的对应的完整可执行文件f1替换a1的剥离可执行文件se1。然后,库管理软件可以移除共享库sl1的版本v1的存储副本。在某些情况下,库管理软件可以从剥离可执行文件se1和共享库v1的版本v1的副本生成完整可执行文件f1;在生成完整可执行文件f1之后,库管理软件可以用a1的完整可执行文件f1替换a1的剥离可执行文件se1

此外,引用计数可用于确定是否应下载剥离可执行文件或完整可执行文件。例如,如果共享库的引用计数小于阈值,表明最多只有少数应用将使用或可能使用共享库,则可以下载完整可执行文件而不是共享库。使用共享库的可能性的这种指示可以基于除相应的引用计数之外的附加判据。这样的判据可以包括但不限于哪些应用当前在设备上、来自其他设备的关于共享库的使用的数据;例如,基于其他设备正在使用什么应用和/或关于包括共享库的共享库包的多个下载的数据。因此,基于共享库的引用计数和/或附加判据,设备可以确定是否请求具有剥离可执行文件的应用的软件包或具有相应的完整可执行文件的应用的相应软件包。

在一些示例中,可以用对应的剥离可执行文件和一个或多个共享库替换一个或多个完整可执行文件。继续上面的示例,在已从cd1中移除a1的完整可执行文件f1(包括共享库sl1的v1版本副本和共享库sl1的v1版本的存储副本)之后,假设已下载并在cd1上安装了两个可执行文件f2和f3,其中每个都是剥离可执行文件,它们依赖于共享库sl1的版本v1(即利用其功能)。然后,在cd1上安装共享库sl1之后,库管理软件可以通过a1的剥离可执行文件se1的副本替换a1的完整可执行文件f1。

在一些示例中,库可以被分割或被部分包括以用于剥离可执行文件。例如,假设共享库sl_partial包括用于十个不同功能f1、f2...f10的软件和相关资源,并且应用a2仅使用用于一个功能f2的软件和相关资源。因此,如果执行a2,则可以在运行时加载包括用于功能f2的软件和相关资源的sl_partial的一个或多个段/部分。然后,a2的剥离可执行文件se2可能仅具有在运行时从库加载的相关软件和资源;例如,功能f2的软件和资源。相反,a2的完整可执行文件将在运行时加载所有sl_partial。可以通过支持静态共享库的资源拆分来减轻这种差异。

共享库用户界面诸如计算设备的图形用户界面(gui)可以包括与提供关于共享库的信息和共享库的控件有关的功能。例如,计算设备“cd1”上的gui和/或其他用户界面可以提供列出当前安装在cd1上的共享库的共享库显示。共享库显示可以包括关于共享库的相关数据,例如但不限于:库版本号、库创建和/或安装的时间、库大小、关于利用共享库的应用的信息、关于共享库提供的功能的信息以及有关共享库的作者和/或源的信息。共享库用户界面可以提供一个或多个控件;例如,图标、按钮、菜单,以使得能够呈现关于上面提到的共享库的一些或所有相关数据。在一些情况下,由计算设备提供的存储设置gui或其他gui可以包括用于共享库的用户界面。

计算设备可以具有用于测试具有共享库软件应用的测试软件。例如,测试软件可以列出、下载、安装和/或卸载一个或多个共享库的特定版本。测试软件可以具有提供转储命令的接口,而平台日志记录可以通过存储的共享库名称引用共享库。在一些示例中,可以通过共享库用户界面访问测试软件。

在将剥离软件包安装到计算设备“cd”上期间,可以使用查询来确定cd是否存储一个或多个共享库的一个或多个版本。在某些情况下,查询可以限制为共享库的特定版本;即,可以将查询限制为由剥离软件包引用的共享库的版本。例如,假设剥离软件包p依赖于库l、版本v1和该cd存储库l的两个版本-版本v1和v2。然后,代表用于库l的剥离软件包p运行的查询将返回库l的版本v1被存储在cd上,但不返回库l的版本v2也被存储在cd上。在这些示例中,代表不引用任何共享库的软件包运行的查询将不返回有关被存储在cd上的库的任何信息。在其他情况下,上述下载软件实用程序可以执行执行查询所需的部分或全部功能,以确定cd是否被存储在诸如剥离软件包的软件包中的共享库信息中列出的一个或多个共享库的一个或多个版本。

库可能或可能没有资格被视为共享库;例如,由于以下限制:测试特定库、共享库的存储、共享库的数量和/或可用于共享库的版本的数量。对于有资格共享库的库,可以按标识符和版本指定共享库,因此有资格的库可以具有名称或其他标识符,并包含版本信息。在一些示例中,库可以关联于用于验证库的数据完整性的验证信息,例如一个或多个散列和、加密散列和和/或其他信息。在这些示例中,特别是,验证信息可以充当库的标识符;即,代替库的名称和/或版本或与库的名称和/或版本一起使用。此外,可以更新有资格的库,以包括构建软件应用时使用的存档和其他信息,以使应用能够将有资格的库称为共享库。

在确定哪些版本的库可以被使得有资格用作共享库时,可能稳定且不破坏软件应用的库的版本可以优先于不太可能稳定的版本。例如,关于特定库sl2的历史数据可以指示sl2的初始版本v1.0、v2.0......可能不稳定。因此,如果正在考虑sl2的新版本v3.0是否有资格,则历史数据表明sl2的v3.0的早期版本例如v3.0、v3.0.1和v3.0.2可能无资格用作共享库,但基于稍后版本的版本例如,sl2的v3.0.3可能有资格。继续此示例,针对sl2的版本v3.0、v3.0.1和v3.0.2构建的应用可以被打包为具有静态链接到应用可执行文件的sl2副本的完整软件包,而针对sl2版本v3.0.3构建的应用可以被打包为带有sl2的v3.0.3的副本的完整软件包,也可以被打包为使用共享库sl2版本v3.0.3的剥离软件包。

针对v3.0.3构建的应用可以被打包为剥离软件包,其中,应用可执行文件不包括sl2的v3.0.3的链接副本。在一些示例中,软件应用可能必须在构建软件应用时具体指示共享库的使用。也就是说,为了构建剥离软件包,可能需要开发人员在构建时明确指示剥离软件应用包的使用。

库的后续版本可以是稳定的但无资格共享。例如,库的这种稳定版本可以相对较短地生存,具有相对少量的修复和/或可以基于库的支持版本的总数来限制。继续上面的示例,假设sl2具有稍后的版本v3.0.4和v3.0.5;两者都被认为是稳定的,但只有v3.0.5才有资格用作共享库。然后,针对sl2的v3.0.4版构建的应用可以被打包为完整软件包,其具有静态链接到应用可执行文件的sl2,v3.0.4的副本,而针对sl2的v3.0.5版本构建的应用可以被打包为具有sl2,v3.0.5的副本的完整软件包或使用共享库sl2版本v3.0.5的剥离软件包。在一些实施例中,针对作为共享库的sl2的版本v3.0.3构建的应用将继续使用sl2的版本v.3.0.3作为共享库。在其他实施例中,针对作为共享库的sl2的v3.0.3版本构建的应用将被“升级”以使用最新版本的sl2,即,sl2的v3.0.5版本作为共享库。

在这些其他实施例的一些中,应用可以决定是使用特定版本的共享库还是使用最新版本的共享库。更具体地,使用共享库的应用可以声明对共享库的一个或多个版本的依赖。可以使用以下依赖类型之一指定依赖:

·精确依赖类型——在构建时要求版本1.2.3的共享库,并在运行时精确地获取共享的版本1.2.3

·最小依赖类型——在构建时要求版本1.2.3的共享库,并在运行时获得1.2.3或任何较晚版本;即,获取至少作为版本1.2.3的最新版本的共享库

·最大依赖类型——在构建时要求版本1.3.2的共享库,并在运行时获得1.3.2或任何较早版本;即,获取不晚于1.3.2版本的最新版本的共享库。最小和最大依赖类型的组合允许指定库版本的窗口;例如,不早于由最小依赖类型指定的版本1.2.3并且不晚于由最大依赖类型指定的版本1.3.2的库版本。

·模板依赖类型——使用“*”和其他字符指定共享库的版本号的模板,其中,“*”匹配零个或多个字符的字符串。例如,使用模板在构建时询问共享库的版本“1.2。*”,并获取共享库的1.2。*版本中的任何一个(例如,1.2.0,1.2.1,1.2.1.1,1.2.2等)在运行时但不是与模板不匹配的共享库(例如,1.3,1.3.2,2.0等)

其他依赖类型也是可能的。

在一些示例中,共享库可以依赖于一个或多个其他库,包括一个或多个共享库。在这些示例中,可以声明在库之间的依赖。更具体地说,如果共享库l1的版本v1依赖于共享库l2的版本v1.7.13a或更高版本,则可以声明l1和l2之间的依赖,其中,该依赖声明包括库l1的版本v1依赖于库l2的信息,最小依赖类型为版本v1.7.13a。库之间的依赖的其他示例也是可能的。

可以使用软件包以与用于安装(或卸载)软件应用相同或相似的方式在计算设备上安装(或卸载)静态共享库。通常,一次只安装一个版本的软件应用;相反,可以同时安装多个版本的共享库版本。卸载共享库可以包括要卸载的共享库的一个或多个版本的规范。用于卸载共享库的对象“packageinstaller”的示例规范是:

publicvoidpackageinstaller#uninstall(@nonnullversionedpackageversionedpackage,

@nonnullintentsenderstatusreceiver);

共享库的安装可以包括确定存储的共享库名称,该名称可以是用于在计算设备上存储共享库的一个或多个包、文件、目录、文件夹和/或其他存储实体的名称。存储的共享库名称可以是基于库名称和/或库版本的唯一名称。例如,如果库名称为“foo.bar.baz”,则存储的共享库名称可以是“foo.bar.baz”或相关名称;例如,用下划线替换库名称中的句点的“foo_bar_baz”。作为另一示例,如果库名称是“foo.bar.baz”并且库版本是“v1”,则存储的共享库名称可以是“foo.bar.baz_v1”或相关名称。由于可以通过库的名称和库的版本唯一标识共享库,因此以这种方式生成的名称是唯一的。

在一些情况下,存储的共享库名称可以是由计算设备的操作系统和/或其他系统软件在内部使用的“合成”名称,但是否则不泄露。在其他情况下,可以在内部和外部两者使用存储的共享库名称;也就是说,可以在操作系统和/或其他系统软件之外使存储的共享库可见。在其他情况下,共享库用户界面和/或测试软件使用的共享库的名称可以是基于基于上面的库名称和/或库版本的存储的共享库名称;例如,支持转储命令和平台日志记录的测试/调试接口可以通过存储的共享库名称来引用共享库。

对共享库使用不同的存储的共享库名称可以简化库的特定版本的识别;例如,检查存储的共享库名称“foo.bar.baz_v1”和“foo.bar.baz_v2”允许将“foo.bar.baz_v1”标识为库的版本v1,并且将“foo.bar.baz_v2“作为库的版本v2。在一些示例中,对存储的库的操作可以依赖于库信息的精确匹配。一个这样的操作是更新存储的共享库,只有当库名称和库版本两者在存储的共享库的名称和版本以及在用于(根据推测)相同的共享库的更新的名称和版本之间完全匹配时才会发生这种情况。如果没有这样的匹配,可能会不正确地更新共享库。

可以使用一个或多个api来获得关于被存储在计算设备上的库的信息。例如,api可以指示库是否构建到软件应用中(例如,是完整应用的一部分)、可动态加载还是共享。作为另一示例,api(和/或另一api)可用于获得关于在计算设备上何处存储共享库的信息。另一个示例是用于查询特定版本的包的信息和卸载包的平台ap——示例平台api如下表1所示:

表1

共享库可以被存储在计算设备的数据存储的一个或多个储存库/分区中。每个储存库/分区可以存储一个或多个不同库的一个或多个不同版本。在一些情况下,计算设备上的库管理软件可以确定要存储多少版本的特定库。例如,库管理软件可以维护共享库的x个版本(x>0)的滑动窗口。可以移除或标记滑动窗口之外的共享库的版本,以便静态链接到可执行文件中。使用滑动窗口仅存储x个最新版本的共享库可以激励开发人员将该x个最新版本的共享库中的一个用于其应用软件。

在一些示例中,应用的卸载/移除可以导致移除现在卸载的应用所使用的共享库。在其他示例中,应用的卸载/移除不会导致移除现在卸载的应用使用的共享库;相反,只有没有安装的应用引用共享库时才能考虑移除部分或全部这些共享库。然后,如果现在卸载的应用是引用特定共享库(的特定版本)的最后一个应用,则可以考虑移除特定共享库(的特定版本)。

在其他示例中,可以基于每设备和/或每储存库/每分区收集使用统计。例如,如果计算设备的分区存储y个不同版本的共享库,则可以认为每个y版本由计算设备用于确定共享库的使用统计。这些使用统计可用于确定哪些库适合预安装;也就是说,使用统计可以指示哪些是最常用的(版本的)共享库,然后可以在新设备上预先安装最常用的(版本的)共享库。

应用商店(或其他实体)可以包括一个或多个web页面或其他库及其版本列表,其被支持作为使用应用商店(或其他实体)的应用的共享库。用于共享库的受支持版本的web页面或其他列表可以包括以下中的一个或多个:(a)到共享库的受支持版本的链接;即,使开发者能够下载共享库的受支持版本用于软件开发、测试和/或构建;(b)共享库的受支持版本的散列和信息;(c)有关使用共享库构建的信息,例如有关构建包括受共享库的受支持版本的剥离软件包和/或创建不包含受共享库的受支持版本的剥离可执行文件的信息,(d)有关受共享库的受支持版本的其他信息,例如共享库大小、有关库的作者/实体信息、创建和/或发布日期、库名称、库版本号等。在某些情况下,web页面/列表可以包括有关一个库的多个支持版本的信息;例如,对于库共享库sl3,web页面/列表可以包括关于sl3的版本1.1和1.2的信息,假设sl3的版本1.1和1.2是支持的版本。

图1示出了根据示例实施例的由充当应用商店100的服务器的一个或多个计算设备存储的软件包110、120。库软件包110可用于提供一个或多个软件库,例如包括的软件库112。库软件包110还包括用于声明属性和/或提供关于软件库112的数据的库信息114。例如,库信息114可以包括具有关于软件库112的数据的共享库元数据,例如一个或多个标签。

将软件库112声明为名为“foo.bar.lib”的静态库的版本1.2.3的示例“静态库(static-library)”标签是:

<static-library

name="foo.bar.lib"

version="1.2.3"/>.

如上所示,示例“static-library”标志可以指定库名称,例如,“foo.bar.lib”;以及,版本号,例如,“1.2.3”。

诸如应用软件之类的其他软件可以依赖于一个或多个库,例如软件库112。可以在共享库信息中声明这种依赖,该共享库信息是提供请求软件的软件包的一部分。图1示出了包括软件应用122、共享库信息124和应用信息126的应用软件包120。在一些示例中,共享库信息124和/或应用信息126不存在于应用软件包120中。

软件应用122可包括具有指令的一个或多个可执行文件,所述指令在被加载到计算设备中并执行时使计算设备执行软件应用122的功能。可执行文件可以是完整可执行文件或剥离可执行文件。例如,完整可执行文件可以是包括软件应用122的指令和一个或多个库的指令的可执行文件;即,完整可执行文件可以包括软件应用122和一个或多个静态链接库的部分或全部。作为另一示例,剥离可执行文件可以是包括软件应用122的指令的可执行文件,该软件应用122依赖于但不包括一个或多个软件库的指令;也就是说,剥离可执行文件包括依赖于剥离可执行文件中未包括的一个或多个动态链接的共享库的软件应用。

共享库信息124可以使用一个或多个标签来声明软件应用122对一个或多个共享库的依赖。例如,声明使用名为“foo.bar.lib”的静态共享库的版本1.2.3的示例标志是:

如上所示,示例“uses-static-library”标志可以指定库名称,例如,“foo.bar.lib”;以及,版本号,例如,“1.2.3”。

在一些示例中,上述标签可以包括关于与库相关联的数字证书的信息。例如,包含与上述“foo.bar.lib”库的版本“1.2.3”相关联的签名证书的sha-256散列和的示例“uses-static-library”标志是:

在上面的示例中,“uses-static-library”标签的“certdigest”字段包括与“foo.bar.lib”库的版本“1.2.3”相关联的签名证书的sha-256散列。在一些示例中,使用签名证书时可以支持密钥轮换。在其他示例中,“uses-static-library”标签的“certdigest”字段可以包括库的散列和;例如,“foo.bar.lib”库的版本“1.2.3”的sha-256散列或其他散列和。

在其他示例中,可以提供库的组合名称和版本标识符。例如,可以通过将库名称附加下划线和版本来形成组合的名称和版本标识符。作为特定示例,可以修改包括sha-256散列和的上述示例“uses-static-library”标签以使用组合的名称和版本号字段“name_version”,其指定组合名称和版本标识符库“foo.bar.lib”和版本“1.2.3”:

在其他示例中,可以使用其他命名方案来组合名称和版本信息以形成库的组合名称和版本标识符;例如,可以使用与下划线不同的分隔符,版本可以在组合标识符中的库名称之前等。

名称、版本、散列的其他表示和/或关于与库相关联的数字证书的信息也是可能的。此外,其他标签在声明静态库时可以具有与上述“static-library”标签不同的信息和/或在声明静态库使用时可以具有与上述“uses-static-library”标签不同的信息。

即使使用正确的名称和版本号,使用签名证书声明和/或散列也可以降低使用库的错误和/或恶意版本的可能性。此外,使用签名证书声明和/或散列允许具有库版本的不同子版本,其中,库的子版本可以针对特定设备被定制;例如,针对特定屏幕尺寸、处理器和/或其他设备组件和/或特性进行优化。

应用信息126可以包括可以不由共享库信息124指定的关于软件应用122的数据。例如,应用信息126可以包括数据,诸如软件应用122的名称、软件应用122的版本、软件应用122的最近改变/错误修复、关于构建软件应用122的信息、最终用户文档以及可能的其他数据。在一些示例中,可以组合共享库信息124和应用信息126;例如,应用信息126可以包括共享库信息124。

在一些示例中,软件应用120与软件应用120的一个或多个“拆分”或附加功能相关联,其可以递增地且与软件应用120的安装分开地安装。在这些示例中,可以为软件应用120的拆分生成类似于应用软件包126的应用软件包,其中,共享库信息124和/或应用信息126指示正在安装软件应用120的拆分。在这些示例中的一些示例中,用于软件应用120的拆分的共享库信息124可以添加新库作为依赖,但是不能改变先前声明的软件应用120的依赖。更具体地,假设安装的软件应用120具有对共享库sl_presplit版本v_presplit的依赖,并且要安装软件应用120的拆分app120_split。如果与app120_split相关联的共享库信息124将对共享库sl_presplit版本v_presplit的依赖例如改变到对于共享库sl_presplit版本v_presplit+1的依赖,则可以拒绝共享库信息124。然而,在这些示例中,将不拒绝与app120_split相关联的共享库信息124,app120_split声明对共享库sl_split1的版本v_split2的新依赖。

图2示出了根据示例实施例的工作流200。工作流200示出了使用应用商店服务器100向计算设备240提供完整软件包(fsp)和共享软件包(ssp)中所涉及的示例动作。工作流200开始于框250,其中,一个或多个库开发计算设备210构建/生成具有库sl1的库软件包(lsp)。在工作流200中,库sl1是版本号为v23.2的版本化软件库。库开发计算设备210可以将库软件包上载到应用商店服务器100,应用商店服务器100可以在框264处存储库软件包。

工作流200可以继续一个或多个应用开发计算设备220构建/生成完整软件包(fsp)和剥离软件包(ssp),其每个包括应用app123的可执行文件。在框252处,应用开发计算设备220可以构建完整软件包,其包括app123的完整可执行文件。在框260处,应用开发计算设备220可以将完整软件包上载到应用商店服务器100,然后应用商店服务器100可以存储完整软件包。

由于在框252处构建的app123的完整可执行文件包括app123所依赖的任何库,因此在框252处构建的完整软件包不包括共享库信息。在其他工作流中,上述上载软件实用程序可以由应用开发计算设备220和/或应用商店服务器100执行,以尝试生成剥离软件包,其获取在块260上载的完整软件包作为输入。

在框254处,应用开发计算设备220可以构建剥离软件包,其包括用于app123的剥离可执行文件和用于app123所依赖的库的共享库信息。在框262处,应用开发计算设备220可以将剥离软件包上载到应用商店服务器100,然后应用商店服务器100可以存储完整软件包。

在工作流200中,在框254处构建的共享库信息是版本化共享库信息。例如,如果app123依赖于库sl1的版本v23.2(即,在框250处构建的库),则在框254处构建的共享库信息可以指定app123使用共享库sl1的版本v23.2。在一些工作流中,上述上载软件实用程序可以由应用开发计算设备220和/或应用商店服务器100执行,以验证在剥离软件包的版本化共享库信息中列出的任何库有资格分享;也就是说,版本化共享库信息中的指定库的指定版本实际上可用于共享。

在完成块260、262和264之后,应用商店服务器100存储app123的至少完整和剥离软件包以及用于库sl1的版本v23.2的库软件包。在工作流200中,app123仅依赖于一个库——库sl1版本v23.2——其可通过应用商店服务器100获得,因此有资格共享。在其他工作流中,其他应用可能依赖于零个或多个库,这些库可能与库sl1版本v23.2不同。

工作流200继续于应用商店服务器100与一个或多个计算设备230通信以下载app123的完整和剥离软件包;即,先前在框260和262上载的完整和剥离软件包。在工作流200期间下载app123的完整软件包的计算设备230的计算设备可以执行框270和272的过程。在框270,计算设备从应用商店服务器100下载app123的完整软件包。在块272,在下载app123的完整软件包之后,计算设备使用下载的完整软件包安装app123。

在工作流200期间下载app123的剥离软件包的计算设备230的计算设备可以执行框280、282、284和286的过程。在框280,计算设备从应用商店服务器100下载app123的剥离软件包。在块282,计算设备和/或应用商店服务器100可以确定剥离软件包的共享库信息中列出的共享库是否被存储在计算设备中。例如,计算设备和/或应用商店服务器100可以执行上述查询中的一个或多个以确定计算设备是否存储一个或多个共享库的一个或多个版本。如果这些查询指示共享库信息中列出的共享库的所有版本都被存储在计算设备上,则可以完成框282的过程。否则,对于未被存储在计算设备上的每个共享库的每个版本,计算设备和应用商店服务器100可以通信以将共享库的版本下载到计算设备上。

在框284,如果在框282处下载了任何共享库,则可以将那些下载的共享库安装到计算设备上。在工作流200中,计算设备在下载剥离软件包之前已经安装了共享库sl1版本23.2的副本,因此在块284没有安装共享库。在相关的工作流中,在框264上载的库软件包的副本可以在框282处从应用商店服务器下载,并且在框284处安装。在框286处,计算设备可以使用剥离软件包来安装app123。在框286完成后,可以完成工作流200。

图3a和3b示出了根据示例实施例的涉及使用软件包和共享储存库创建和安装软件应用的场景300。在场景300中,一个或多个应用计算开发设备220为三个应用a1、a2和a3创建软件包并将软件包上载到一个或多个应用商店服务器100。a1依赖于两个库:库l1版本v1和库l2版本v1.2。a2依赖于一个库:库l1版本v1.1。并且,a3依赖于一个库——库l2版本v1.3.2。在场景300中,库l1的版本v1和库l2的版本v1.2和v1.3.2有资格共享,而库l1的版本v1.1无资格共享。因此,剥离软件包可用于随后下载a1和a3,但不适用于a2。

场景300继续于包括应用商店客户端304的计算设备302请求从应用商店服务器100下载应用a1、a2和a3。在这些请求开始时,计算设备302支持使用共享库并且已经安装了库l1版本v1和库l2版本v1.2,但没有安装库l2版本v1.3.2。在场景300中,应用商店客户端304执行下载软件实用程序的上述功能,如下面详细讨论的。在其他场景中,可以由应用商店服务器100提供这里描述为应用商店客户端304的一部分的一些或所有功能。

更一般地,计算设备302对使用共享库的支持包括计算设备302被配置成存储由标识符和版本标识的特定共享库的多个版本,其中,特定共享库的多个版本中的每个版本共享公共名称/标识符,并且其中,特定软件库的多个版本中的每一个具有不同的版本/版本号。例如,计算设备302可以存储具有库l1、库l2和/或一个或多个其他命名库的不同版本号的多个版本;例如,存储库l3的两个版本——一个具有版本号“v3.1”,另一个具有版本号“v4.0”。在其他示例中,计算设备302可以存储至多到最大数量的不同软件库,其中,通过名称/标识符和版本/版本号两者来标识每个不同的软件库;例如,最大5、10、12,或被存储在其上的所有命名库的一些其他数量的版本。在一些示例中,计算设备302可以将最大存储量(例如,10兆字节、100兆字节、10千兆字节)分配给存储共享库。与存储多个共享库有关的其他示例也是可能的。

在此上下文中,计算设备302和应用商店客户端304下载并安装:a1的剥离软件包、a2的完整软件包和库l2版本v1.3.2的库软件包和a3的剥离软件包。

随后,计算设备302确定要释放的数据存储量;并且作为释放数据存储量的一部分,确定要清理共享库。例如,计算设备302可以确定要释放数据存储量,包括清理共享库,这是由于:存储的最大数量的共享库、用于存储共享库的最大数据存储量、对数据存储的周期性的(例如,每小时、每周、每日)或按需审计表明要清理共享库,可能是因为计算设备302可用的免费数据存储量相对较低、共享库的年龄和/或其他原因。这样,计算设备302随后可以尝试清理共享库。

共享库的年龄可以是:与共享库的存在相关联的时间量;自创建共享库以来的时间量;自共享库被存储在计算设备上以来的时间量;或其他某个时间量。然后,可以根据其各自的年龄清理共享库。例如,在计算设备302确定共享库sl_old版本v_old的年龄并且确定共享库sl_old版本v_old的年龄超过阈值年龄(例如,6个月、1年、2年等)后,则计算设备302可以确定共享库sl_old版本v_old的引用计数是否大于零。如果共享库sl_old版本v_old的引用计数大于零,则计算设备302可以确定依赖于共享库sl_old版本v_old的应用a_old,并且可以例如通过下载a_old的完整可执行文件用包含共享库sl_old版本v_old的副本的完整可执行文件替换依赖于共享库sl_old版本v_old的a_old的剥离可执行文件。然后,在用相应的完整可执行文件替换a_old的剥离可执行文件之后,计算设备302可以释放计算设备上的用于共享库sl_old版本v_old的数据存储。

在清理时,使用库l1版本v1和库l2版本v1.2中的每一个的应用的数量/或库l1版本v1和库l2版本v1.2中的每一个的引用计数超过阈值,但是使用库l2的v1.3.2的应用/库l2的v1.3.2的引用计数的数量不超过阈值。这样,通过安装应用a3的完整可执行文件(依赖于库l2版本v1.3.2),然后从计算设备302的存储删除先前安装的剥离可执行文件和库l2版本v1.3.2的副本两者,来清理库l2的版本v1.3.2。在完成库l2版本v1.3.2的清理之后,场景300可以结束。

图3a示出了场景300可以开始于应用计算开发设备220生成并向应用商店服务器100发送上载消息310。上载消息310包括应用a1的两个软件包——完整软件包和剥离软件包。完整软件包包括应用a1的完整可执行文件。剥离软件包包括应用a1的剥离可执行文件和关于应用a1所依赖的两个共享库(sl)的共享库信息:“l1,v1”和“l2,v1.2”。

在场景300中,应用商店服务器100执行上载软件实用程序以处理上载消息310。上载软件实用程序验证共享库信息中列出的两个共享库——库l1版本v1和库l2版本v1.2——有资格共享,并随后存储收到的完整和剥离软件包。此时,应用a1的完整和剥离软件包都可从应用商店服务器100下载。

然后,应用计算开发设备220生成上载消息312并将其发送到应用商店服务器100。上载消息312包括应用a2的两个软件包——完整软件包和剥离软件包。完整软件包包括应用a2的完整可执行文件。剥离软件包包括应用a2的剥离可执行文件和关于应用a2所依赖的共享库“l1,v.1.1”的共享库信息。

在场景300中,应用商店服务器100执行上载软件实用程序以处理上载消息312,其确定在共享库信息中指定的库l1的版本v1.1无资格共享。响应于确定库l1的版本v1.1不适合共享,应用商店服务器100生成并发送无资格的共享库消息314,以向应用计算开发设备220通知关于无资格的共享库。然后,上载软件实用程序拒绝剥离软件包并存储收到的完整软件包。此时,应用a2的完整软件包可从应用商店服务器100下载。

在其他场景中,上载软件实用程序和/或应用商店服务器100的其他组件可以由于无资格的共享库而静默地拒绝剥离软件包;也就是说,在这些其他场景中可能不会发送无资格的共享库消息314。在一些其他场景中,应用计算开发设备220可以生成并发送一个或多个附加上载消息,其具有仅列出有资格的共享库的不同的共享库信息;例如,具有剥离软件包的上载消息312的版本,该剥离软件包包括列出对有资格的共享库l1的版本v1的依赖的共享库信息。附加上载消息可以具有或不具有伴随具有不同的共享库信息的剥离软件包的完整软件包。

在其他场景中,上载软件实用程序和/或应用商店服务器100的其他组件可以确定即使库l1版本v1.1当前无资格共享,库l1版本v1.1应该被使得有资格响应于上载消息312和/或包括列出库l1版本v1.1的共享库信息列表的其他上载消息而共享。例如,如果应用商店服务器100至少接收对于特定库的特定版本的阈值数量的引用(例如,4、10、20、100、15000等),并且如果应用商店服务器100存储特定库的特定版本的库软件包的副本,则应用商店服务器100可以确定特定库的特定版本是有资格的共享库。

然后,应用计算开发设备220生成上载消息316并将其发送到应用商店服务器100。上载消息316包括应用a3的完整软件包和剥离软件包。完整软件包包括应用a3的完整可执行文件。剥离软件包包括应用a3的剥离可执行文件和关于应用a3所依赖的共享库“l2,v.1.3.2”的共享库信息。在场景300中,应用商店服务器100执行上载软件实用程序以处理上载消息316。上载软件实用程序验证库l2的版本v1.3.2是否有资格共享,并且随后存储所接收的完整和剥离软件包。此时,应用a3的完整和剥离软件包都可从应用商店服务器100下载。

场景300继续于计算设备302生成getapp消息320并将其发送到应用商店客户端304,请求应用a1的副本。包括在计算设备302上执行的软件的应用商店客户端304接收getapp消息320,并且将getapp消息322发送到应用商店服务器100,请求应用a1的副本和用于请求应用a1的共享库信息的“slinfo”指示。通过“slinfo”指示,计算设备302用信号通知对应用a1的共享库的支持。在其他情况下,可以使用对于共享库的支持或缺少其的其他标志;例如,支持或不支持共享库的计算设备302正在使用或操作系统的版本的指示。

在接收到getapp消息322之后,应用商店服务器100可以生成slinfo消息324并将其发送到应用商店客户端304。slinfo消息324可以向应用商店客户端304提供关于应用a1的版本化的共享库信息,并因此向计算设备302提供关于应用a1的版本化的共享库信息。特别地,slinfo消息324指示应用a1依赖于库“l1”版本“v1”并且依赖于库“l2”版本“v1.2”。

在接收到slinfo消息324之后,应用商店客户端304可以代表应用商店服务器100获得关于什么共享库被存储在计算设备302上的信息。为了获得该信息,应用商店客户端304生成并向计算设备302的其他组件发送slquery消息326;例如,库管理软件以确定计算设备302是否存储库“l1”版本“v1”的副本,因为应用a1依赖于库l1版本v1,如上面在slinfo消息324的上下文中所指示的。

计算设备302可以接收slquery消息326,其包括查询的库标识符“l1”和查询的库版本“v1”。然后,计算设备302可以确定计算设备302是否存储由存储的库“l1”的标识符和存储的版本“v1”标识的库“l1”的版本“v1”的副本;例如,存储的标识符和/或存储的版本可以是:在由计算设备302存储的共享库信息中使用上面讨论的唯一名称生成技术和/或使用其他技术确定的存储的库的唯一名称的一部分或全部。然后,计算设备302可以将查询的库版本“v1”与库“l1”的存储版本“v1”进行匹配。例如,计算设备302可以基于例如上面讨论的作为精确依赖类型、最小依赖类型和模板依赖类型的依赖类型将查询的库版本“v1”与库“l1”的存储版本“v1”进行匹配。

如上所述,精确的依赖类型匹配涉及将查询的库标识符和查询的库版本与相应的存储的库标识符和存储的库版本完全匹配;最小依赖类型匹配涉及将查询的库标识符与存储的库标识符匹配,并匹配查询的库版本,只要存储的库版本大于或等于查询的库版本;模板依赖类型涉及将查询的库标识符与存储的库标识符进行匹配,并匹配查询的库版本,只要存储的库版本与模板化的查询库版本匹配。其他匹配技术也是可能的。

在将查询的库版本与存储的版本匹配之后,计算设备302可以确定计算设备确实存储了库“l1”版本“v1”的副本。在确定计算设备确实存储了库“l1”版本“v1”的副本之后,计算设备302可以用指示计算设备302确实存储所查询的软件库的副本的响应来响应于slquery消息326。

在场景300中,计算设备302确实存储库l1版本v1的副本,并且随后生成并发送slqueryresp消息328,其具有“ok”指示以通知应用商店客户端304计算设备302确实存储了库l1版本v1的副本。

应用商店客户端304可以生成slquery消息330并将其发送到计算设备302以确定计算设备302是否储存库“l2”的版本“v1.2”的副本,因为应用a1也依赖于库l2的版本v1.2,如上面在slinfo消息324的上下文中所指示的。在场景300中,计算设备302可以使用上面在slquery消息326的上下文中讨论的技术来确定计算设备302确实存储了库l2的版本v1.2的副本。计算设备302随后生成并发送slqueryresp消息332,其具有“ok”指示以通知应用商店客户端304计算设备302确实存储了库l2的版本v1.2的副本。

在接收到slqueryresp消息332之后,应用商店客户端304可以生成并发送getapp消息334以用“slok”指示传送对应用a1的请求。“slok”指示通知应用商店服务器100计算设备302可以利用依赖于共享库的剥离可执行文件,并且已经存储应用a1所依赖的所有共享库的副本。然后,应用商店服务器100可以生成并发送strippedpkg消息336,其包括具有应用a1的剥离可执行文件的剥离软件包的副本。

在框338处,计算设备302和应用商店客户端304安装来自经由strippedpkg消息330接收的剥离软件包的应用a1。安装应用a1涉及安装经由strippedpkg消息330接收的a1的剥离可执行文件。在其他场景中,应用商店客户端304不涉及在计算设备302上安装软件包。

然后,计算设备302生成getapp消息340并将其发送到应用商店客户端304,请求应用a2的副本。应用商店客户端304接收getapp消息340,并将getapp消息342发送到应用商店服务器100,请求应用a2的副本和用于请求应用a2的共享库信息的“slinfo”指示。

在场景300中,由于如上面在消息312和314的上下文中所讨论的无资格的库,仅有完整的应用包可用于应用a2。因此,应用商店服务器100生成并发送包括带有应用a2的完整可执行文件的完整软件包的副本的fullpkg消息344。在框346处,计算设备302和应用商店客户端304安装来自完整软件包的应用a2。安装应用a2涉及安装经由fullpkg消息344接收的a2的完整可执行文件。

然后,计算设备302生成getapp消息350并将其发送到应用商店客户端304,请求应用a3的副本。应用商店客户端304接收getapp消息350,并将getapp消息352发送到应用商店服务器100,请求应用a3的副本和用于请求应用a3的共享库信息的“slinfo”指示。

在接收到getapp消息352之后,应用商店服务器100可以生成slinfo消息354并将其发送到应用商店客户端304。slinfo消息354可以向应用商店客户端304和计算设备302提供关于应用a3的版本化共享库信息。特别地,slinfo消息354指示应用a3依赖于库“l2”版本“v1.3.2”。

在接收到slinfo消息354之后,应用商店客户端304可以代表应用商店服务器100获得关于什么共享库被存储在计算设备302上的信息。为了获得该信息,应用商店客户端304生成并向计算设备302的其他组件例如用于确定计算设备302是否存储计算设备302是否存储库“l2”版本“v1.3.2”的副本的库管理软件发送slquery消息356,因为应用a3依赖于库l2版本v1.3.2,如上在slinfo消息354的上下文中所述。

在场景300中,计算设备302可以使用上面在slquery消息326的上下文中讨论的技术来确定计算设备302不存储库l2版本v1.3.2的副本。计算设备302随后生成并发送slqueryresp消息358,其具有“否”指示以通知应用商店客户端304计算设备302不存储库l2版本v1.3.2的副本。这样,slqueryresp消息358可以充当对应用商店客户端304的请求,以基于丢失的库的名称/标识符“l2”和版本号“v.1.3.2”来定位丢失的库l2的版本v1.3.2的副本。

响应于slqueryresp消息358,应用商店客户端304可以生成getsl消息360并将其发送到应用商店服务器100,以请求用于库l2的版本1.3.2的库软件包。响应于getsl消息360,应用商店服务器100可以将具有库l2版本1.3.2的库软件包的副本的libpkg消息362发送到应用商店客户端304。

在接收libpkg消息362之后,应用商店客户端304可以确定计算设备302具有应用a3使用的所有共享库的副本。然后,应用商店客户端304可以生成并发送getapp消息364以用“slok”指示传送对应用a3的请求。“slok”指示通知应用商店服务器100计算设备302可以利用依赖于共享库的剥离可执行文件,并且已经存储了应用a3所依赖的所有共享库的副本。然后,应用商店服务器100可以生成并发送strippedpkg消息366,其包括具有应用a3的剥离可执行文件的剥离软件包的副本。

转到图3b,在接收到libpkg消息362和strippedpkg消息366时,计算设备302和应用商店客户端304可以执行框368的过程。在框368,计算设备302和应用商店客户端304安装来自经由libpkg消息362接收的库软件包的库l2版本v1.3.2和来自经由strippedpkg消息366接收的剥离软件包的应用a3。

libpkg消息362可以被视为对slqueryresp消息358体现的用于定位丢失的库l2版本v1.3.2的副本的请求的响应,并且因此应用商店客户端304已成功定位了计算设备302的丢失的库l2版本v1.3.2。通过安装经由libpkg消息362接收的先前丢失的库l2版本v1.3.2,计算设备302可以存储先前丢失的库l2的版本v1.3.2。安装应用a3涉及安装经由strippedpkg消息366接收的a3的剥离可执行文件。

在框370处,计算设备302执行应用a1、a2和a3中的每一个至少一次。例如,执行应用a1可以涉及将a1的可执行文件和a1所依赖的任何共享库加载到计算设备302的数据存储(即,ram和/或高速缓冲存储器)中。在这种情况下,加载a1的可执行文件和a1所依赖的共享库可以包括加载在块332安装的a1的剥离可执行文件,并加载共享库库l1版本v1.1和库l2版本v1.2,其中,两个共享库可以使用它们各自的名称/标识符“l1”和“l2”以及各自的版本“v1.1”和“v1.2”来标识。在一些示例中,库l1版本v1.1和/或库l2版本v1.2可以已经被加载到数据存储中;在这些示例中,a1的剥离可执行文件可以引用已经加载的一个或多个库,并且可以省略已加载的一个或多个库的重新加载。

然后,在加载a1的可执行文件和a1所依赖的共享库之后,计算设备302可以执行加载的软件可执行文件以使计算设备执行应用a1的一个或多个功能,其中,使用被存储在库l1版本v1.1和/或库l2版本v1.2中的软件来执行一个或多个功能的这些功能中的至少一个。类似的技术可用于执行应用a2或应用a3;对于具有完整可执行文件的应用a2,可以省略与加载共享库相关的技术。

在框380处,计算设备302确定要清理共享库存储。也就是说,计算设备302继续尝试减少被存储在计算设备上的共享库的使用的存储量。为了清理共享库存储,计算设备302可以确定每个共享库的每个版本的引用计数。特定共享库的特定版本的引用计数可以是依赖于特定共享库的特定版本的应用的数量。例如,可以如上面在库管理软件的上下文中所讨论的那样确定引用计数。

然后,如果特定共享库的特定版本的引用计数小于阈值引用计数,则可以卸载特定共享库的特定版本。此外,依赖于现在卸载的特定共享库的特定版本的任何剥离可执行文件可以由相应的完整可执行文件替换。

在框382处,计算设备302确定共享库l1版本v1的引用计数或使用共享库l1版本v1的应用的数量超过阈值引用计数。在场景300中,阈值引用计数被设置为2;在其他场景中,可以使用不同的阈值引用计数值;例如,1、3、4、5、10。因此,共享库l1版本v1不受该清理的影响。

在框384处,计算设备302确定共享库l2版本v1.2的引用计数超过阈值引用计数。因此,共享库l2版本v1.2不受此清理的影响。

在框386处,计算设备302确定共享库l2版本v1.3.2的引用计数小于阈值引用计数。在场景300中,仅应用a3依赖于共享库l2版本v1.3.2,因此相应的引用计数是1,其小于阈值引用计数2。因此,共享库l2版本v1.3.2是要清理的对象;也就是说,可以卸载共享库l2版本v1.3.2,并且可以用相应的完整可执行文件替换依赖于共享库l2版本v1.3.2的任何剥离可执行文件。

这样,在框368处安装的应用a3的剥离可执行文件可由相应的完整可执行文件替换。为了获得应用a3的完整可执行文件,计算设备302生成getapp消息388并将其发送到应用商店客户端304,以请求递送应用“a3”。应用商店客户端304将getapp消息388作为getapp消息390传送到应用商店服务器100,以请求递送应用“a3”。

getapp消息388和390包括指示“slno”,用于分别通知应用商店客户端304和应用商店服务器100对于应用a3不支持共享库;这样,getapp消息388和390有效地请求递送应用a3的完整可执行文件。用于请求完整可执行文件的其他技术也是可能的。

响应于getapp消息390,应用商店服务器100可以使用“a3”和“slno”指示来确定已经请求了应用a3的完整软件包。然后,应用商店服务器100利用具有应用a3的完整可执行文件的完整软件包的副本生成fullpkg消息392并将其发送到应用商店客户端304。

在框394处,计算设备302和应用商店客户端304通过卸载先前安装的应用a3的剥离可执行文件来继续清理库l2版本v1.3.2。在框396处,计算设备302和应用商店客户端304卸载先前安装的共享库l2版本v1.3.2。在块396已经完成之后,仍然在计算设备100上安装至少两个共享库——库l1版本v1和库l2版本v1.2。在框396完成后,场景300可以完成。在其他场景中,应用商店客户端304不涉及可执行文件、库和/或软件包的卸载。

在框398,计算设备302和应用商店客户端304安装来自经由fullpkg消息392接收的完整软件包的应用a3。安装应用a3涉及安装经由fullpkg消息392接收的a3的完整可执行文件。在一些场景中,框394、396和398的执行顺序可以与场景300期间使用的这三个框的执行顺序不同。

示例数据网络

图4描绘了根据示例实施例的具有服务器设备408、410的分布式计算架构400,服务器设备408、410被配置成经由网络406与可编程设备404a、404b、404c、404d、404e通信。网络406可以对应于lan、广域网(wan)、公司内联网、公共因特网或被配置成提供联网计算设备之间的通信路径的任何其他类型的网络。网络406还可以对应于一个或多个lan、wan、公司内联网和/或公共因特网的组合。

尽管图4仅示出了五个可编程设备,但是分布式应用架构可以服务于数十、数百或数千个可编程设备。此外,可编程设备404a、404b、404c、404d、404e(或任何附加可编程设备)可以是任何种类的计算设备,例如普通膝上型计算机、桌面型计算机、可穿戴计算设备、移动计算设备、可头戴设备(hmd)、网络终端和无线通信设备(例如,智能电话和/或蜂窝电话)等。在一些实施例中,例如用可编程设备404a、404b、404c表示,可编程设备可以直接连接到网络406。在其他实施例中,例如用可编程设备404d和404e表示,可编程设备可以通过诸如可编程设备404c的相关的计算设备间接连接到网络406。在该示例中,可编程设备404c可以充当相关联的计算设备以在可编程设备404d和404e与网络406之间传递电子通信。在图4中未示出的其他实施例中,可编程设备可以直接和间接地连接到网络406。

服务器设备408、410可以被配置成执行可编程设备404a-404e所请求的一个或多个服务。例如,服务器设备408和/或410可以向可编程设备404a-404e提供内容。内容可以包括但不限于web页面、超文本、脚本、诸如编译软件、图像、音频和/或视频的二进制数据。内容可以包括压缩和/或未压缩的内容。内容可以被加密和/或不加密。其他类型的内容也是可能的。

作为另一示例,服务器设备408和/或410可以向可编程设备404a-404e提供对用于数据库、搜索、计算、图形、音频、视频、万维网/因特网利用和/或其他功能的软件的访问。服务器设备的许多其他示例也是可能的。

计算设备架构

图5a是根据示例实施例的计算设备500的功能框图。特别地,图5a中所示的计算设备500可被配置成执行以下或与以下相关的至少一个功能:本文描述的软件、应用商店服务器100、库软件包110、应用软件包120、工作流200、库开发计算设备210、应用开发计算设备220、计算设备230、302、场景300、应用商店客户端304、可编程设备404a、404b、404c、404d、404e、网络406、服务器设备408、410和方法600。

计算设备500可以包括用户接口模块501、网络通信接口模块502、一个或多个处理器503、数据存储504和一个或多个传感器520,所有这些都可以通过系统总线、网络或其他连接机制505链接在一起。

用户接口模块501可用于向外部用户输入/输出设备发送数据和/或从外部用户输入/输出设备接收数据。例如,用户接口模块501可以被配置成向用户输入设备发送和/或从用户输入设备接收数据,用户输入设备例如是键盘、小键盘、触摸屏、计算机鼠标、跟踪球、操纵杆、相机、语音识别模块和/或其他类似设备。用户接口模块501还可以被配置成向用户显示设备提供输出,用户显示设备例如是现在已知或以后开发的一个或多个阴极射线管(crt)、液晶显示器、发光二极管(led)、使用数字光处理(dlp)技术的显示器、打印机、灯泡和/或其他类似设备。用户接口模块501还可以被配置成生成可听输出,诸如扬声器、扬声器插孔、音频输出端口、音频输出设备、耳机和/或其他类似设备。用户接口模块501还可以配置有一个或多个触觉设备,该触觉设备可以生成触觉输出,诸如通过与计算设备500的触摸和/或物理接触可检测的振动和/或其他输出。在一些实施例中、用户接口模块501可用于提供用于利用计算设备500的图形用户界面。

网络通信接口模块502可以包括一个或多个无线接口507和/或一个或多个有线接口508,其可以被配置成经由网络进行通信。无线接口507可以包括一个或多个无线发射器、接收器和/或收发器,诸如蓝牙tm收发器、收发器、wi-fitm收发器、wimaxtm收发器和/或可以被配置成通过无线网络进行通信的其他类似类型的无线收发器。有线接口508可以包括一个或多个有线发射器、接收器和/或收发器,例如以太网收发器、通用串行总线(usb)收发器或可以被配置成通过双绞线、同轴电缆、光纤链路、或与有线网络的类似的物理连接进行通信的类似收发器。

在一些实施例中,网络通信接口模块502可以被配置成提供可靠、安全和/或认证的通信。对于这里描述的每个通信,可以提供用于确保可靠通信(即,保证的消息传递)的信息,可能作为消息报头和/或页脚的一部分(例如,分组/消息序列信息、封装报头和/或页脚、大小/时间信息和传输验证信息例如crc和/或奇偶校验值)。可以使用一种或多种加密协议和/或算法诸如但不限于数据加密判据(des)、高级加密判据(aes)、rivest-shamir-adelman(rsa)算法、diffie-hellman算法、诸如安全套接字层(ssl)或传输层安全性(tls)的安全套接字协议和/或数字签名算法(dsa)使通信安全(例如,被编码或加密)和/或解密/解码。也可以或者除了这里列出的那些之外可以使用其他加密协议和/或算法,以保护(然后解密/解码)通信。

一个或多个处理器503可以包括一个或多个通用处理器和/或一个或多个专用处理器(例如,数字信号处理器、图形处理单元、专用集成电路等)。一个或多个处理器503可以被配置成执行包含在数据存储504中的计算机可读程序指令506和/或如本文所述的其他指令。

数据存储504可以包括一个或多个计算机可读存储介质,其可以由一个或多个处理器503中的至少一个读取和/或访问。一个或多个计算机可读存储介质可以包括易失性和/或非易失性存储组件,例如光学、磁性、有机或其他存储或盘存储,其可以整体或部分地与一个或多个处理器503中的至少一个集成。在一些实施例中,可以使用单个物理设备(例如,一个光学、磁性、有机或其他存储或盘存储单元)实现数据存储504,而在其他实施例中,可以使用两个或更多个物理设备来实现数据存储504。

数据存储504可包括计算机可读程序指令506和可能的附加数据。在一些实施例中,数据存储504可以另外包括用于执行本文描述的方法、场景和技术的至少部分和/或本文描述的设备和网络的至少部分功能所需的存储。

在一些实施例中、计算设备500可以包括一个或多个传感器520。传感器520可以被配置成测量计算设备500的环境中的条件并提供关于该环境的数据。例如,传感器520可包括以下中的一个或多个:(i)识别其他对象和/或设备的识别传感器,例如但不限于射频识别(rfid)读取器、接近传感器、一维条形码读取器、二维条形码(例如,快速响应(qr)代码)读取器和激光跟踪器,其中,识别传感器可被配置成读取诸如rfid标签、条形码、qr码的标识符和/或被配置成被读取并提供至少识别信息的其他设备和/或对象;(ii)用于测量计算设备500的位置和/或移动的位置传感器,例如但不限于陀螺仪、加速度计、多普勒传感器、全球定位系统(gps)设备、声纳传感器、雷达装置、激光位移传感器和指南针;(iii)环境传感器,用于获得指示计算设备500的环境的数据,例如但不限于红外传感器、光学传感器、光传感器、相机、生物传感器、电容传感器、触摸传感器、温度传感器、无线传感器、无线电传感器、运动传感器、麦克风、声音传感器、超声波传感器和/或烟雾传感器;(iv)力传感器,用于测量作用于计算设备500的一个或多个力(例如,惯性力和/或g力),诸如但不限于测量以下各项的一个或多个传感器:一个或多个维度上的力、扭矩、地面力、摩擦:和/或零力矩点(zmp)传感器,其识别zmp和/或zmp的位置。传感器520的许多其他示例也是可能的。

基于云的服务器

图5b描绘了根据示例实施例的被布置为基于云的服务器系统的计算集群509a、509b、509c的网络514。计算集群509a、509b、509c可以是基于云的设备,其存储基于云的应用和/或服务的程序逻辑和/或数据;例如,执行以下的或与以下相关的至少一个功能:本文描述的软件、应用商店服务器100、库软件包110、应用软件包120、工作流200、库开发计算设备210、应用开发计算设备220、计算设备230、302、场景300、应用商店客户端304、可编程设备404a、404b、404c、404d、404e、网络406、服务器设备408、410和方法600。

在一些实施例中,计算集群509a、509b、509c可以是驻留在单个计算中心中的单个计算设备。在其他实施例中,计算集群509a、509b、509c可以被包括在单个计算中心中的多个计算设备,或甚至位于位于不同地理位置的多个计算中心中的多个计算设备。例如,图5b描绘了驻留在不同物理位置中的每个计算集群509a、509b和509c。

在一些实施例中,计算集群509a、509b、509c处的数据和服务可以被编码为被存储在非暂时性有形计算机可读介质(或计算机可读存储介质)中并且可由其他计算设备访问的计算机可读信息。在一些实施例中,计算集群509a、509b、509c可以被存储在单个磁盘驱动器或其他有形存储介质上,或者可以在位于一个或多个不同地理位置的多个磁盘驱动器或其他有形存储介质上实现。

图5b描绘了根据示例实施例的基于云的服务器系统。在图5b中,本文描述的软件、应用商店服务器、应用商店客户端、库开发计算设备、应用开发计算设备和/或计算设备的功能可以分布在计算集群509a、509b、509c之间。计算集群509a可以包括由本地集群网络512a连接的一个或多个计算设备500a、集群存储阵列510a和集群路由器511a。类似地,计算集群509b可以包括由本地集群网络512b连接的一个或多个计算设备500b、集群存储阵列510b和集群路由器511b。同样地、计算集群509c可以包括由本地集群网络512c连接的一个或多个计算设备500c、集群存储阵列510c和集群路由器511c。

在一些实施例中,计算集群509a、509b和509c中的每一个可以具有相同数量的计算设备、相同数量的集群存储阵列和相同数量的集群路由器。然而,在其他实施例中,每个计算集群可以具有不同数量的计算设备、不同数量的集群存储阵列和不同数量的集群路由器。每个计算集群中的计算设备、集群存储阵列和集群路由器的数量可以取决于分配给每个计算集群的计算任务。

在计算集群509a中,例如,计算设备500a可以被配置成执行本文描述的软件、应用商店服务器、应用商店客户端、库开发计算设备、应用开发计算设备和/或计算设备的各种计算任务。在一个实施例中,本文描述的软件、应用商店服务器、应用商店客户端、库开发计算设备、应用开发计算设备和/或计算设备的各种功能可以分布在一个或多个计算设备500a、500b、500c之间。各个计算集群509b和509c中的计算设备500b和500c可以与计算集群509a中的计算设备500a类似地配置。另一方面,在一些实施例中,计算设备500a、500b和500c可以被配置成执行不同的功能。

在一些实施例中,至少部分地基于本文描述的软件、应用商店服务器、应用商店客户端、库开发计算设备、应用开发计算设备和/或计算设备的处理要求、计算设备500a、500b、500c的处理能力、每个计算集群中的计算设备之间以及计算集群本身之间的网络链接的等待时间和/或可以有助于整个系统架构的成本、速度、容错性、弹性、效率和/或其他设计目标的其他因素,可以在计算设备500a、500b和500c上分发与本文描述的软件,应用商店服务器,应用商店客户端,库开发计算设备,应用开发计算设备和/或计算设备相关联的计算任务和存储数据。

计算集群509a、509b、509c的集群存储阵列510a、510b、510c可以是数据存储阵列,其包括被配置成管理对硬盘驱动器组的读和写访问的磁盘阵列控制器。磁盘阵列控制器单独或与其各自的计算设备一起还可以被配置成管理被存储在集群存储阵列中的数据的备份或冗余副本,以防止磁盘驱动器或其他集群存储阵列故障和/或网络故障,其阻止一个或多个计算设备访问一个或多个集群存储阵列。

与本文描述的软件、应用商店服务器、应用商店客户端、库开发计算设备、应用开发计算设备和/或计算设备的功能可以跨计算集群509a、509b、509c的计算设备500a、500b、500c分布的方式类似,这些组件的各种活动部分和/或备份部分可以分布在集群存储阵列510a、510b、510c上。例如、一些集群存储阵列可以被配置成存储本文描述的软件、应用商店服务器、应用商店客户端、库开发计算设备、应用开发计算设备和/或计算设备的一部分数据,而其他集群存储阵列可以存储本文描述的软件、应用商店服务器、应用商店客户端、库开发计算设备、应用开发计算设备和/或计算设备的其他部分数据。此外,某些集群存储阵列可以被配置成存储被存储在其他集群存储阵列中的数据的备份版本。

计算集群509a、509b、509c中的集群路由器511a、511b、511c可以包括被配置成为计算集群提供内部和外部通信的网络设备。例如,计算集群509a中的集群路由器511a可以包括一个或多个互联网交换和路由设备,其被配置成(i)经由本地集群网络512a提供计算设备500a和集群存储阵列510a之间的局域网通信,以及(ii)经由到网络406的广域网连接513a提供在计算集群509a与计算集群509b和509c之间的广域网通信。集群路由器511b和511c可以包括类似于集群路由器511a的网络设备,并且集群路由器511b和511c可以执行与集群路由器511a对于计算集群509a执行的类似的计算集群509b和509b的网络功能。

在一些实施例中、集群路由器511a、511b、511c的配置可以至少部分地基于计算设备和集群存储阵列的数据通信要求、集群路由器511a、511b、511c中的网络设备的数据通信能力、本地网络512a、512b、512c的等待时间和通过量、广域网链路513a、513b、513c的等待时间、通过量和成本和/或可能有助于成本、速度、容错性、弹性、效率和/或中等系统架构的其他设计判据的其他因素。

示例操作方法

图6是根据示例实施例的方法600的流程图。方法600可以由诸如计算设备500之类的计算设备来执行。方法600可以在框610处开始,其中,计算设备可以接收由软件应用使用的至少第一软件库的版本化共享库信息,其中,第一软件库的版本化共享库信息可以包括第一软件库的标识符,诸如前面至少在图2-3b的上下文中所讨论的。在一些实施例中,至少第一软件库的版本化共享库信息还包括与第一软件库的散列和有关的信息,诸如前面至少在图1的上下文中讨论的。

在框620处,计算设备可以确定计算设备是否被存储由第一软件库的标识符在版本化共享库信息中标识的第一软件库的副本,例如上面至少在图2-3b的上下文中讨论的。

在一些实施例中,第一软件库的版本化共享库信息还可以包括第一软件库的版本,并且还由第一软件库的版本标识第一软件库;即,计算设备可以确定计算设备是否存储由第一软件库的标识符在版本化共享库信息中和第一软件库的版本来标识的第一软件库的副本,例如上面在至少在图2-3b的上下文中讨论的。在这些实施例的特定实施例中,第一软件库的版本化共享库信息可以包括指定第一软件库的名称和第一软件库的版本的组合标识符,例如上面至少在图1的上下文中讨论的。

在其他实施例中,确定计算设备是否存储由第一软件库的标识符和第一软件库的版本标识的第一软件库的副本可以包括:接收关于软件库的存储的查询,查询包括查询的库标识符和查询的库版本;通过至少使查询的库版本与第一软件库的存储版本匹配,确定计算设备是否存储由存储的第一软件库的标识符和第一软件库的存储版本标识的第一软件库的副本;在将查询的库版本与第一软件库的存储版本进行匹配之后,确定计算设备确实存储了第一软件库的副本,诸如前面至少在图3a和3b的上下文中所讨论的。在这些实施例的特定实施例中,将查询的库版本与第一软件库的存储版本匹配可以包括将查询的库版本与第一软件库的存储版本精确匹配,诸如前面至少在图3a和3b的上下文中所讨论的。在这些实施例的其他特定实施例中,将所请求的库版本与第一软件库的存储版本匹配可以包括确定所存储的软件库版本是否至少是查询的库版本,诸如前面至少在图3a和3b的上下文中讨论的。

在框630处,计算设备可以基于计算设备是否存储第一软件库的副本,发送对软件应用的完整可执行文件和剥离可执行文件之一的请求,其中,完整可执行文件包括第一软件库,并且其中,剥离可执行文件不包括第一软件库,诸如前面至少在图2-3b的上下文中所讨论的。

在框640处,响应于该请求,计算设备可以接收用于软件应用的完整可执行文件或剥离可执行文件,用于被存储在计算设备上,诸如前面至少在图2-3b的上下文中所讨论的。

在一些实施例中,接收完整可执行文件或剥离可执行文件包括接收剥离可执行文件;然后,方法600还可以包括:将剥离可执行文件和第一软件库加载到计算设备的数据存储中,其中,使用第一软件库的标识符和第一软件库的版本来识别第一软件库;在将剥离可执行文件和第一软件库加载到数据存储中之后,计算设备执行加载的剥离可执行文件以使计算设备执行一个或多个功能,其中,使用被存储在第一软件库中的软件执行一个或多个功能的至少一个功能,诸如前面至少在图3a和3b的上下文中所讨论的。在这些实施例的特定实施例中,方法600还可以包括:在确定计算设备不存储第一软件库的副本之后,基于第一软件库的标识符和第一软件库的版本定位第一软件库的副本,并且将所定位的第一软件库的副本存储在计算设备上,诸如前面至少在图3a和3b的上下文中所讨论的。在这些实施例的更多的特定实施例中,定位第一软件库的副本包括:发送对第一软件库的副本的请求,其中,该请求包括第一软件库的标识符和第一软件库的版本,以及在发送请求之后,在计算设备处接收第一软件库的副本,诸如前面至少在图3a和3b的上下文中所讨论的。

在其他实施例中,计算设备可以被配置成存储由标识符和版本标识的第二软件库的多个版本,其中,第二软件库的多个版本中的每个版本共享公共标识符,并且其中,第二软件库的多个版本的每个版本不同,诸如前面至少在图1-3b的上下文中所讨论的。在这些实施例的一些中,计算设备可以被配置成存储第二软件库的特定数量的版本,诸如前面至少在图3a和3b的上下文中所讨论的。在这些实施例的进一步中,计算设备可以被配置成确定使用第二软件库的第一版本的应用的时刻,诸如前面至少在图3a和3b的上下文中所讨论的。在这些实施例的更进一步中,方法600还可以包括:确定释放计算设备的数据存储;在确定释放数据存储之后,计算设备确定使用第二软件库的第一版本的应用的数量是否小于阈值;并且在确定使用第二软件库的第一版本的应用的数量小于阈值之后,从计算设备上的数据存储中移除第二软件库的第一版本,例如上面至少在图3a和3b的上下文中所讨论的。

在这些实施例的更进一步中,发送对软件应用的完整可执行文件和剥离可执行文件之一的请求可以包括:计算设备确定使用第二软件库的第一版本的应用的数量是否小于阈值;在确定使用第二软件库的第一版本的应用的数量小于阈值之后,发送对软件应用的完整可执行文件的请求,诸如如上所述。在这些实施例中的另一些的特定实施例中,发送对软件应用的完整可执行文件和剥离可执行文件之一的请求还可以包括:在确定使用第二软件库的第一版本的应用的数量不小于阈值后,发送对软件应用的剥离可执行文件的请求,诸如如上所述。在这些实施例的更进一步的其他特定实施例中,阈值数量可以是1,诸如前面至少在图3a和3b的上下文中所讨论的。

在这些实施例的又一些中,方法600还可以包括:确定从计算设备移除利用第二软件库的第一版本的第一软件可执行文件;并且在确定移除第一软件之后,计算设备:移除第一软件可执行文件,并且递减使用第二软件库的第一版本的应用的数量,诸如前面至少在图3a和3b的上下文中所讨论的。在这些实施例的另一些中,方法600还可以包括:接收包括第二软件可执行文件的第一软件包和第一包信息,该包信息包括第一版本化共享库信息,其包括第二软件库的标识符和特定软件库的第一版本;将第二软件可执行文件和第一包信息存储在计算设备上;并且递增使用第二软件库的第一版本的应用的数量,诸如前面至少在图3a和3b的上下文中所讨论的。

在这些实施例的另一些中,第二软件库的多个版本中的每一个都可以具有年龄;那么,方法600还可以包括:确定第二软件库的第二版本的年龄是否超过阈值年龄;并且在确定第二软件库的第二版本的年龄超过阈值年龄之后:确定依赖于第二软件库的第二版本的第三软件可执行文件;用包括第二软件库的第二版本的第四软件可执行文件替换第三软件可执行文件;并且在替换第三软件可执行文件之后,在计算设备上为第二软件库的第二版本释放数据存储,诸如前面至少在图3a和3b的上下文中所讨论的。在这些实施例的另一些中,计算设备还被配置成为第二软件库的多个版本中的每个版本生成唯一名称,例如上面讨论的。

在这些实施例的特定实施例中,将查询的库版本与第一软件库的存储版本匹配可以包括将查询的库版本与第一软件库的存储版本完全匹配,例如上面至少在图3a和3b的上下文中讨论的。在这些实施例的其他特定实施例中,将查询的库版本与第一软件库的存储版本匹配可以包括确定所存储的软件库版本是否至少是所请求的库版本,诸如前面至少在图3a和3b的上下文中讨论的。

在其他实施例中,方法600还可以包括:在计算设备处接收由第二软件应用使用的至少第四软件库的版本化共享库信息,其中,第四软件库的版本化共享库信息包括第四软件库的标识符和第四软件库的版本,并且其中,第二软件应用依赖于第四软件库和第五软件库;在确定计算设备存储在版本化共享库信息中通过第四软件库的标识符和第四软件库的版本标识的第四软件库的副本之后,从计算设备发送对于第二软件应用的剥离可执行文件之一的请求,其中,剥离可执行文件不包括第四软件库;响应于该请求,接收用于存储在计算设备上的第二软件应用的部分完整可执行文件,其中,第二软件应用的部分完整可执行文件不包括第四软件库并包括第五软件库的副本,如上所述。

其他示例实施例

提供以下条款作为本公开的进一步描述。

条款1-一种方法,包括:在计算设备处接收至少由软件应用使用的第一软件库的版本化共享库信息,其中,所述第一软件库的所述版本化共享库信息包括所述第一软件库的标识符;确定所述计算设备是否存储由所述第一软件库的所述标识符在所述版本化共享库信息中标识的所述第一软件库的副本;基于所述计算设备是否存储所述第一软件库的所述副本,发送对所述软件应用的完整可执行文件和剥离可执行文件之一的请求,其中,所述完整可执行文件包括所述第一软件库,并且其中,所述剥离可执行文件不包括所述第一软件库;以及响应于所述请求,接收所述软件应用的完整可执行文件或剥离可执行文件用于存储在所述计算设备上。

条款2-条款1的方法,其中,所述第一软件库的所述版本化共享库信息还包括所述第一软件库的版本;并且由所述第一软件库的所述版本进一步标识所述第一软件库。

条款3-条款2的方法,其中,用于所述第一软件库的所述版本化共享库信息包括指定所述第一软件库的名称和所述第一软件库的所述版本的组合标识符。

条款4-条款1-3中任一条款的方法,其中,接收所述完整可执行文件或所述剥离可执行文件包括:接收所述剥离可执行文件,并且其中,所述方法还包括:将所述剥离可执行文件和所述第一软件库加载到所述计算设备的数据存储中,其中,使用所述第一软件库的所述标识符和所述第一软件库的版本来识别所述第一软件库;以及,在将所述剥离可执行文件和所述第一软件库加载到数据存储中之后,所述计算设备执行所加载的剥离可执行文件以使所述计算设备执行一个或多个功能,其中,使用在所述第一软件库中存储的软件执行所述一个或多个功能的至少一个功能。

条款5-条款1-4中任一条款的方法,还包括:在确定所述计算设备未存储所述第一软件库的所述副本之后,基于所述第一软件库的所述标识符和所述第一软件库的版本定位所述第一软件库的副本,以及,将所定位的所述第一软件库的副本被存储在所述计算设备上。

条款6-条款5的方法,其中,定位所述第一软件库的所述副本包括:发送对所述第一软件库的副本的请求,其中,所述请求包括所述第一软件库的所述标识符和所述第一软件库的所述版本,以及,在发送所述请求之后,在所述计算设备处接收所述第一软件库的所述副本。

条款7-条款1-6中任一项的方法,其中,至少所述第一软件库的所述版本化共享库信息还包括与所述第一软件库的散列和有关的信息。

条款8-条款1-7中任一条款的方法,其中,所述计算设备被配置成存储由标识符和版本标识的第二软件库的多个版本,其中,所述第二软件库的所述多个版本中的每个共享公共标识符,并且其中,所述第二软件库的所述多个版本中的每一个都不同。

条款9-条款8的方法,其中,所述计算设备被配置成存储所述第二软件库的特定数量的版本。

条款10-条款8或条款9的方法,其中,所述计算设备被配置成确定使用所述第二软件库的第一版本的多个应用。

条款11-条款10的方法,还包括:确定释放所述计算设备的数据存储;在确定释放数据存储之后,所述计算设备确定使用所述第二软件库的所述第一版本的应用的数量是否小于阈值;以及,在确定使用所述第二软件库的第一版本的应用的所述数量小于所述阈值之后,从所述计算设备上的数据存储中移除所述第二软件库的所述第一版本。

条款12-条款10或条款11的方法,其中,发送对所述软件应用的完整可执行文件和剥离可执行文件之一的所述请求包括:所述计算设备确定使用所述第二软件库的所述第一版本的应用的数量是否小于所述阈值;以及,在确定使用所述第二软件库的所述第一版本的应用的数量小于所述阈值之后,发送对所述软件应用的完整可执行文件的请求。

条款13-条款12的方法,其中,发送对所述软件应用的完整可执行文件和剥离可执行文件之一的所述请求还包括:在确定使用所述第二软件库的所述第一版本的应用的数量不小于所述阈值之后,发送对所述软件应用的剥离可执行文件的请求。

条款14-条款11-13中任一条款的方法,其中,所述阈值数量是1。

条款15-根据条款10-14中任一项所述的方法,还包括:确定从所述计算设备中移除利用所述第二软件库的所述第一版本的第一软件可执行文件;以及,在确定移除所述第一软件可执行文件之后,所述计算设备:移除所述第一软件可执行文件,以及减少使用所述第二软件库的所述第一版本的应用的数量。

条款16-根据条款10-15中任一项所述的方法,还包括:接收包括第二软件可执行文件和第一包信息的第一软件包,所述包信息包括包括用于所述第二软件可执行文件的标识符和所述特定软件库的第一版本的第一版本化共享库信息;将所述第二软件可执行文件和第一包信息存储在所述计算设备上;以及,递增使用所述第二软件库的所述第一版本的应用的数量。

条款17-条款8-16中任一项的方法,其中,所述第二软件库的所述多个版本中的每一个具有年龄,并且其中,所述方法还包括:确定所述第二软件库的第二版本的年龄是否超过阈值年龄;以及,在确定所述第二软件库的所述第二版本的所述年龄超过所述阈值年龄之后:确定依赖于所述第二软件库的所述第二版本的第三软件可执行文件;用包括所述第二软件库的所述第二版本的第四软件可执行文件替换所述第三软件可执行文件;以及,在替换所述第三软件可执行文件之后,释放所述计算设备上的用于所述第二软件库的所述第二版本的数据存储。

条款18-根据条款8-17中任一项所述的方法,其中,所述计算设备还被配置成为所述第二软件库的所述多个版本中的每个版本生成唯一名称。

条款19-条款1-18中任一项的方法,其中,确定所述计算设备是否存储由所述第一软件库的所述标识符标识的所述第一软件库的所述副本包括:接收关于软件库的存储的查询,所述查询包括查询的库标识符和查询的库版本;通过至少使所述查询的库版本与所述第一软件库的存储的版本匹配,确定所述计算设备是否存储由所述第一软件库的存储的标识符和所述第一软件库的所述存储的版本标识的所述第一软件库的副本;以及,在将所述查询的库版本与所述第一软件库的所述存储的版本匹配之后,确定所述计算设备确实存储了所述第一软件库的副本。

条款20-条款19的方法,其中,将所述查询的库版本与所述第一软件库的所述存储的版本进行匹配包括:将所述查询的库版本与所述第一软件库的所述存储的版本精确匹配。

条款21-条款19或条款20的方法,其中,将所述查询的库版本与所述第一软件库的所述存储的版本进行匹配包括:确定是否所述软件库的所述存储的版本至少是所述查询的库版本。

条款22-根据权利要求1-21中任一项所述的方法,还包括:在所述计算设备处接收由第二软件应用使用的至少第四软件库的版本化共享库信息,其中,所述第四软件库的所述版本化共享库信息包括所述第四软件库的标识符和所述第四软件库的版本,并且其中,所述第二软件应用依赖于所述第四软件库和第五软件库;在确定所述计算设备存储由所述第四软件库的所述标识符和所述第四软件库的所述版本在所述版本化共享库信息中标识的所述第四软件库的副本之后,从所述计算设备发送对所述第二软件应用的剥离可执行文件之一的请求,其中,所述剥离可执行文件不包括所述第四软件库;以及,响应于所述请求,接收用于存储在所述计算设备上的所述第二软件应用的部分完整可执行文件,其中,所述第二软件应用的所述部分完整可执行文件不包括所述第四软件库并包括所述第五软件库的副本。

条款23-一种计算设备,包括:一个或多个处理器;以及,数据存储,至少包括被存储在其上的计算机可执行指令,当由一个或多个处理器执行时,所述指令使所述计算设备执行包括第1-22条中任一项的方法的功能。

条款24-一种计算机可读介质,其上存储有指令,当由计算设备的一个或多个处理器执行时,所述指令使得所述计算设备执行包括第条款1-22中任一项的方法的功能。

条款25-条款24的计算机可读介质,其中,所述计算机可读介质包括非暂时性计算机可读介质。

条款26-一种装置,包括:用于执行条款1-22中任一项的方法的部件。

本公开不限于本申请中描述的特定实施例,其旨在作为各个方面的说明。在不脱离本发明的精神和范围的情况下,可以进行许多修改和变化,这对本领域技术人员来说是显而易见的。除了本文列举的那些之外,本公开范围内的功能等同的方法和装置对于本领域技术人员而言从前面的描述中是显而易见的。这些修改和变化旨在落入所附权利要求的范围内。

以上详细描述参考附图描述了所公开的系统、设备和方法的各种特征和功能。在附图中,除非上下文另有指示,否则类似的符号通常标识类似的组件。在详细说明、附图和权利要求中描述的说明性实施例并不意味着是限制性的。在不脱离本文提出的主题的精神或范围的情况下,可以利用其他实施例,并且可以进行其他改变。容易理解的是,可以以各种不同的配置来布置、替换、组合、分离和设计如本文一般描述的并且在附图中示出的本公开的方面,所有这些都是在此明确设想的。

关于图中的任何或所有梯形图、场景和流程图并且如本文所讨论的,每个块和/或通信可以表示根据示例实施例的信息处理和/或信息传输。替代实施例被包括在这些示例实施例的范围内。在这些替换实施例中,例如,被描述为块、传输、通信、请求、响应和/或消息的功能可以以相对于所示或讨论的顺序不同的顺序执行,包括基本上同时或以相反的顺序,这取决于所涉及的功能。此外,可以将更多或更少的块和/或功能用于这里讨论的梯形图、场景和流程图的任何一个,并且这些梯形图、场景和流程图可以部分地或全部地彼此组合。

表示信息处理的块可以对应于可以被配置成执行本文描述的方法或技术的特定逻辑功能的电路。替代地或另外地,表示信息处理的块可以对应于模块、段或程序代码的一部分(包括相关数据)。程序代码可以包括可由处理器执行的一个或多个指令,用于实现该方法或技术中的特定逻辑功能或动作。程序代码和/或相关数据可以被存储在任何类型的计算机可读介质上,例如包括磁盘或硬盘驱动器或其他存储介质的存储设备。

计算机可读介质还可以包括非暂时性计算机可读介质,诸如非暂时性计算机可读介质,其存储短时间段的数据,如寄存器存储器、处理器高速缓存和随机存取存储器(ram)。计算机可读介质还可以包括非暂时性计算机可读介质,其存储较长时间段的程序代码和/或数据,例如二级或持久长期存储器,如只读存储(rom)、光盘或磁盘、紧凑型只读存储器(cd-rom)。计算机可读介质还可以是任何其他易失性或非易失性存储系统。计算机可读介质可以被认为是计算机可读存储介质,例如有形存储设备。

此外,表示一个或多个信息传输的块可以对应于同一物理设备中的软件和/或硬件模块之间的信息传输。然而,其他信息传输可以在不同物理设备中的软件模块和/或硬件模块之间。

虽然本文已经公开了各种方面和实施例,但是其他方面和实施例对于本领域技术人员而言将是显而易见的。这里公开的各个方面和实施例仅用于说明目的而不是限制性的,真实范围由所附权利要求指示。

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