PR0M)和/或闪存存储器的 存储介质。应用加速器103还可以包括处理器,其可以包括被配置为执行与所公开的主题 相关联的功能、技术和处理任务的处理逻辑。应用加速器103的附加部件可以包括一个或 多个盘驱动。应用加速器103可以包括用于与外部设备通信的一个或多个网络端口。应用 加速器103还可以包括键盘、鼠标、其它输入设备等等。应用加速器103还可以包括视频显 示器、手机、其它输出设备等等。网络107可以包括通信介质,诸如导线、光纤、微波、无线电 波及其它电磁载波和/或光学载波和/或前述的任意组合。
[0027] 图2示出了根据所公开的主题、用于经网络107将改进的应用以目标设备101所 使用的本机代码格式从应用源105提供给目标设备101的示例性方法。参照图2,在一种实 施例中,应用加速器103可以从目标设备101接收对应用的请求(201)。例如,该请求可以 包括目标设备101的信息以及目标设备101的操作系统。在一个例子中,应用加速器103 随后可以确定应用是否之前已被高速缓存(203)。这可以包括确定应用是否之前已被下载 或获得或者应用是否已经被转换为用于目标设备101的类型的本机代码格式。
[0028] 在一个例子中,如果应用还没有被高速缓存,则应用从应用源105被下载或获得 (205)。应当理解的是,应用源105可以是应用中介。当获得该应用时,应用加速器103随 后可以将该应用(可能是字节代码形式)处理为用于目标设备101的本机代码格式(207)。 在一个例子中,整个应用被转换为本机代码格式。在另一个例子中,应用的一些部分被转换 为本机代码格式。在一个例子中,应用加速器103随后可以向目标设备101提供本机代码 格式的应用(209)。
[0029] 图3示出了根据所公开的主题、用于经网络107将改进的应用以目标设备101所 使用的本机代码格式从应用源105提供给目标设备101的示例性方法。参照图3,在一种实 施例中,应用加速器103可以从目标设备101接收对应用的请求(201)。在一个例子中,应 用加速器103随后可以确定应用是否之前已被高速缓存(203)。这可以包括确定应用是否 之前已被下载或获得或者应用是否已经被转换为用于目标设备101的类型的本机代码格 式。在一个例子中,如果应用还没有被高速缓存,则应用从应用源105被下载或获得(205)。 当获得该应用时,应用加速器103可以将该应用(可能是字节代码形式)处理为用于目标 设备101的本机代码格式(207)。在一个例子中,应用加速器可以例如以本机代码格式高速 缓存该应用(301)。然后,应用加速器103可以向目标设备101提供本机代码格式的应用 (209)。
[0030] 图4示出了根据所公开的主题的示例性系统体系架构。该体系架构可以包括应用 加速器103、406,这些应用加速器可以被理解为代理(proxy)。该系统体系架构还可以包括 应用源105或应用中介408,从其可以获得应用。该系统体系架构还可以包括用户的设备或 目标设备101,诸如电话402或平板电脑等等。目标设备10U402可以包括字节代码框架、 修改后的Dalvik虚拟机(VM)、操作系统(0S)以及诸如ARM处理器的处理器。
[0031] 当目标设备10U402想要下载应用时,目标设备10U402可以经网络107向应用 加速器103、406发送请求。该请求可以包括诸如设备类型和系统版本的信息。如果这是第 一次为给定的环境请求该应用,则应用加速器103、406可以从应用源408下载应用。应用 可以按字节代码版本被下载。在一个例子中,如果应用加速器1〇3、406还没有为给定的环 境下载该应用,则应用加速器103、406可以从应用源105、408下载该应用的字节代码版本。 然后,应用加速器103、406可以利用提前(Α0Τ)编译器410将该应用编译为本机代码格式, 例如,这种本机代码格式是为在目标设备10U402的环境中执行而被优化的。然后,应用加 速器103、406可以高速缓存应用的本机版本。例如,这可以摊销编译成本并且更快地响应 来自相同设备类型和0S版本的后续请求。
[0032] 进一步参照图4,在一种实施例中,应用加速器103、406和Α0Τ-编译器410可以 被放置在应用分发路径中的不同位置处。例如,应用加速器1〇3、406和Α0Τ编译器410可 以被放置在应用开发者工作站、应用源105服务器、用户台式机、目标设备101,或者被放置 在应用源105、408的地点处。这种位置可以提供透明度和效率。由Α0Τ-编译器410执行 的Α0Τ编译会招致冗余的工作,因为具有相同类型和相同系统版本的每个设备仍然会需要 对应用执行样本编译工作。它还可以要求设备上的编译基础设施支持。在用户台式机或开 发者工作站的Α0Τ编译可以要求用户或开发者建立该基础设施。
[0033] 进一步参照图4,在一种实施例中,应用加速器103可以位于应用分发路径之外的 位置。例如,应用加速器103可以位于独立于分发路径的服务器处。在一个例子中,服务器 可以要求目标设备101上传例如应用的字节代码或预处理后的应用的字节代码等等。在另 一种实施例中,应用加速器103可以位于目标设备101处。在这种实施例中,应用加速器 103可以例如有选择地在目标设备101上优化应用。
[0034] 示例
[0035] 递增部署的提前编译器
[0036] 为了说明而非限制,现在将描述所公开的主题的示例性实施例。虽然所公开的技 术可以是多样化的,但是为了说明现在将联系所公开的主题进行描述。Α0Τ编译器410可以 被实现为使得由Α0Τ编译器410生成的本机代码与系统中的字节代码可以无缝地互操作。 此外,Α0Τ编译器410可以被实现为使得在两个方向进行调用的开销都可以被减小。此外或 作为替代,与仅仅字节代码相比,组合的本机代码和字节代码系统的整体性能可以被提高, 并且随着更多的字节代码被转换为本机代码而可以普遍提高。
[0037] 在示例性说明中,应用加速器103可以通过利用JNI来生成本机代码,这至少部分 因为JNI可以被设计为允许字节代码和本机代码互操作。但是,跨JNI调用的开销会相对 较高,如表1中所示。例如,JNI方法可以传递Java对象并且因此可以针对访问对象的字 段、方法或类型。但是,JNI方法可能不能直接执行这种访问,这至少部分因为它由于可移 植性原因而可能没有对字段、方法或类型的实际引用。相反,JNI方法可以只具有对数据的 整数索引,并且可以利用对JNI环境的调用来将索引解析成实际的引用并执行方法调用, 这可以包括频繁的"上下文切换"。如表1中所示,简单的字段或方法访问可以具有4倍至 20倍的减速。如本文所体现的,包括跨本机和字节代码边界的调用会是频繁的。
[0039] 表 1 :示例 Android JNI 开销
[0040] 此外或作为替代,并且如本文所体现的,Α0Τ编译器410可以直接针对Dalvik VM 的内部本机方法接口。所生成的本机代码可以被Dalvik VM调用,就好像代码是Dalvik VM的一部分,这可以避免JNI的不必要的可移植性开销。所生成的本机代码可以具有与 Dalvik VM相同的用于代表类、方法和字段的数据结构,并且可以调用Dalvik VM的函数用 于解析它们。Α0Τ编译器410还可以通过在字节代码方法上调用Dalvik解释器/JIT引擎 来调用字节代码方法。
[0041] 递增部署的设计还可以允许应用加速器103执行更积极的优化技术。Java类加 载可以改变类层次结构和方法的实现方式,如本文进一步讨论的。应用加速器103可以通 过动态监视类加载并且只在有利的时候执行某些积极的优化来解决这个挑战。即,应用加 速器103可以在运行时检测类加载,并且可以通过在字节代码方法上调用Dalvik解释器/ JIT引擎来丢弃翻译后的代码。在实践中,既没有评估应用,Android框架通常也不利用类 加载,并且因此应用加速器103可以利用诸如完全优化的技术来运行所有被评估的应用。
[0042] 根据所公开的主题的另一方面,应用加速器103可以执行多种技术来进一步改善 应用,诸如但不限于提高应用的速度。应用加速器103可以在运行时之前执行编译,并且因 此可以执行全局优技术,诸如但不限于常常会扫描整个程序的全局优化。
[0043] 在所公开的主题的示例性实施例中,Α0Τ编译器410可以利用诸如优化技术的技 术。这些示例性技术可以包括但不限于,寄存器再分配、方法内联、常量传播、消除无法访问 的代码从而消除冗余的加载存储、去除不必要的空引用检查以及去除不必要的数组边界检 查等等。
[0044] 在某些实现方式中,Java类加载可以使本文所使用的全局分析失效,这至少是因 为类加载会改变方法实现方式和类层次结构。为了限制或防止由于类加载造成的错误,如 本文所讨论的,如果程序在运行时加载类,则应用加速器103可以监视类加载并且可以在 字节代码方法上调用Dalvik解释器/JIT引擎。
[0045] 为了说明所公开的主题而不是限制,应用加速器103可以为Android而实现。但 是,将认识到,本文中所描述的系统和技术可以在任何合适的平台中使用。
[0046] 在一种实施例中,应用加速器103可以部分地通过执行对Dalvik VM的某些修改 来实现。这种修改可以包括粘接代码,这种代码可以提供要由Α0Τ编译后的本机代码调用 的一组支持函数和对Dalvik本身的补丁代码。
[0047] 例如,粘接代码可以导出被Α0Τ编译器410所生成的本机代码调用的函数。这 些函数可以包括例如且不限于,进行类型转换的函数、解析字段、方法和类的函数(诸如 resolveField、getObjectField和resolveMethod函数)、分配对象和数组的函数以及从常