CN108027722A - 在编译和部署中动态更新应用 - Google Patents
在编译和部署中动态更新应用 Download PDFInfo
- Publication number
- CN108027722A CN108027722A CN201680053784.1A CN201680053784A CN108027722A CN 108027722 A CN108027722 A CN 108027722A CN 201680053784 A CN201680053784 A CN 201680053784A CN 108027722 A CN108027722 A CN 108027722A
- Authority
- CN
- China
- Prior art keywords
- compiling
- target
- renewal
- subset
- composer
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/60—Software deployment
- G06F8/65—Updates
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3664—Environments for testing or debugging software
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3668—Software testing
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/48—Incremental compilation
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/60—Software deployment
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/60—Software deployment
- G06F8/65—Updates
- G06F8/656—Updates while running
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/70—Software maintenance or management
- G06F8/71—Version control; Configuration management
Abstract
在一些示例中,方法包括:响应于接收到使构建器计算系统将用于应用的源代码的集合编译成编译目标的集合的初始用户输入,部署所述编译目标的集合以发起所述应用的执行,其中,将所述源代码的集合的子集编译成所述编译目标的集合的初始子集;在对所述源代码的集合的至少所述子集进行修改之后,接收使所述构建器计算系统将所述源代码的集合的至少所述子集编译成所述编译目标的集合的更新子集的后续用户输入;以及响应于确定所述更新子集与所述初始子集不同,在不终止所述应用的执行的情况下部署编译目标的所述更新子集以基于所述更新子集更新所述应用。
Description
背景技术
软件开发人员可以用符合特定语法的人类可读源代码来编写计算机程序。通过用人类可读源代码来编写计算机程序,软件开发人员可以比直接用机器可读代码来编写程序更高效地设计并且实施计算机程序。为了执行最初用人类可读源代码编写的计算机程序,编译器可以将人类可读源代码变换成机器可读代码,该机器可读代码可以由虚拟机解释或者由特定计算机处理单元(CPU)架构直接执行。每次软件开发人员在计算机程序中改变人类可读源代码时,为了测试或者观察功能方面的变化,软件开发人员必须发起构建过程以将源代码重新编译成机器可读代码。构建过程可以包括:编译、封装、部署、和执行机器可读代码以观察或者测试改变后的功能。随着计算机程序中代码的行增加,构建过程可能需要更大量的时间来完成。因此,经常执行构建过程的软件开发人员可能会遇到由于开发人员在等待构建过程完成时引起的停工时间而导致的随着应用的大小增长在生产力方面的损失增加。
附图说明
图1是图示了根据本公开的技术的构建器计算系统的概念图,该构建器计算系统可以检测对在应用的构建过程中生成的目标的集合的改变,并且可以将已经改变的目标的子集部署到在测试环境系统处执行的应用。
图2是图示了根据本公开的一个或多个方面的可以由图1的构建器计算系统执行的软件编译和构建过程的流程图。
图3是图示了根据本公开的一个或多个方面的作为配置为执行示例软件编译和构建过程的示例计算装置的构建器计算系统的框图。
图4是图示了根据本公开的一个或多个方面的作为配置为执行应用的示例计算装置的测试环境系统的框图。
图5是图示了根据本公开的技术的配置为执行热交换技术的构建器计算系统的示例操作的流程图。
图6是图示了根据本公开的技术的配置为执行热交换技术的测试环境系统的示例操作的流程图。
图7是图示了根据本公开的技术的配置为执行冷交换技术的构建器计算系统的示例操作的流程图。
图8是图示了根据本公开的技术的配置为执行冷交换技术的测试环境系统的示例操作的流程图。
图9是图示了根据本公开的技术的配置为执行暖交换技术的构建器计算系统的示例操作的流程图。
图10是图示了根据本公开的技术的配置为执行暖交换技术的测试环境系统的示例操作的流程图。
具体实施方式
本公开的技术大体上针对通过减少在应用内构建和部署增量变化所需的时间量来提高软件开发人员的生产力。例如,构建器计算系统最初可以生成代表应用的应用程序包。该应用程序包可以包括从源代码编译的机器可读代码(例如,编译目标(compiledtargets)),并且还可以包括资源,诸如,图像或者任何其它未编译内容。当软件开发人员最初构建应用程序包时,构建器计算系统对源代码进行编译,对资源进行汇编,将资源和机器可读代码两者封装到应用程序包中,以及将应用程序包发送至测试环境系统以供执行。每次软件开发人员对源代码和/或资源的子集进行改变时,本公开的技术可以针对增量变化将改变后的编译和未编译目标的子集发送至测试环境系统,而不是重复该过程。按照这种方式,可以避免每次构建整个应用程序包的更大量并且更耗时的过程。
本技术还可以使应用能够在不终止应用的执行的情况下执行更新的机器可读代码。例如,当最初构建应用程序包时,构建器计算系统可以将字节码注入到原始编译目标中,该字节码使原始编译目标检查是否存在所编译目标的更新版本,并且如果是,则执行来自更新的编译目标的程序逻辑。当将原始编译目标加载到测试环境系统的存储器中并且执行原始编译目标时,原始编译目标的程序逻辑被执行。然而,如果软件开发人员对编译目标的源代码进行了改变,则构建器计算系统可以生成更新的编译目标,该更新的编译目标包括更新的编译目标是原始编译目标的修改版本的一个或多个指示符。构建器计算系统可以将更新的编译目标部署到测试环境系统,并且测试环境系统可以将在原始编译目标内的参考存储到更新的编译目标。如果稍后执行原始编译目标的程序逻辑,则原始编译目标可以确定存在原始编译目标的更新版本,并且调用更新的编译目标的程序逻辑。因为可以在不终止应用的执行的情况下基于改变来更新应用,所以应用可以在执行期间保持其状态,同时通过更新的编译目标来展示其功能的更新。本公开的另外的技术可以更新诸如资源的未编译目标,并且如果无法在不重新启动的情况下将改变应用到应用,则还可以恢复回到重新启动该应用。
图1是图示了根据本公开的技术的构建器计算系统102的概念图,该构建器计算系统102可以检测对在应用的构建过程中生成的目标的集合的改变,并且将已经改变的目标的子集部署到在测试环境系统124处执行的应用。在图1的示例中,构建器计算系统102可以是台式计算机。然而,在其它示例中,构建器计算系统102可以是平板计算机、智能电话、膝上型计算机、工作站、服务器、或者另一类型的计算装置。构建器计算系统102可以是由软件开发人员使用以编写由源代码组成的计算机程序并且按照可执行计算机程序来对源代码进行编译的计算装置。在一些示例中,构建器计算系统102可以是由软件开发人员的计算装置经由网络访问以将源代码编译成计算机程序的服务器。虽然在图1中未示出,但是构建器计算系统102可以包括除了构建器模块108之外的应用和/或模块。例如,计算装置102可以包括:操作系统、web浏览器、命令行终端、或者可由计算装置执行的任何其它应用和/或模块,仅举几例。
构建器计算系统102可以包括集成开发环境(IDE)104。IDE 104可以被实施为硬件、软件、或者硬件和软件的组合。在一些示例中,IDE104是包括用于设计、调试、建档、和部署(仅举几例)应用的工具的集合的软件应用。如在图1中示出的,IDE 104包括编辑器106和构建器模块108。在一些示例中,示出为包括在构建器模块108内的一个或多个模块可以与构建器模块108分离开存在。在一些示例中,构建器模块108可以包括未在构建器模块中示出的其它组件,诸如,用于测量应用性能的建档工具或者用于可视地表示和设计分量的建模工具,仅举几例。
在一些示例中,编辑器106是文本编辑器。文本编辑器106可以提供用于编辑源代码和其它文本的功能。例如,文本编辑器106可以包括:语法突出显示、代码完成、重新因子分解、和/或代码生成功能,仅举几例。使用文本编辑器106,软件开发人员可以构成并且编辑用于应用130的源代码118。应用源代码118可以限定用于应用130的控制器逻辑、模型、和表示逻辑的功能。除了源代码118之外,软件开发人员还可以生成、汇编、或者组织在应用130中包括或者由构建器模块108使用以生成应用的应用资源120。应用资源120可以包括但不限于:构建限定外观图形用户界面的脚本、源代码或者标记语言、和数据文件(例如,在应用中包括的文本文件、图像等)。
构建器模块108可以接收一个或多个应用资源120和源代码118,构建器模块108可以将该一个或多个应用资源120和源代码118编译和/或汇编到一个或多个应用中,诸如,应用130。构建器模块108可以包括用于处理和编译应用资源120和应用源代码118的一个或多个子组件。例如,如在图1中示出的,构建器模块108可以包括预处理器104和编译器114。预处理器116可以在编译器114处进行编译之前对源代码118和/或资源120执行初步分析和/或变换。例如,预处理器116可以对限定图形用户界面的特定视觉布局的布局文件进行解析和/或变换,或者对依赖性或者语法错误执行初步检查。在一些示例中,预处理器116可以基于一个或多个构建脚本来安排或者协调构建过程。
构建器模块108还可以包括编译器114。编译器114可以将人类可读源代码编译成机器可执行代码。例如,编译器114可以对人类可读源代码执行词法分析。词法分析可以包括将源代码的语法元素划分成令牌。每个令牌可以与编程语言中的符号相对应,诸如,键盘、变量、或者数字。编译器114还可以对这些令牌执行语法分析。例如,编译器114可以生成被称为语法树或者分析树的树数据结构,该树数据结构基于在与令牌相对应的语法元素之间的关系来组织令牌。语法树的每个节点可以表示令牌。同样,语法树可以表示计算机程序的结构或者组织。编译器114还可以对语法树执行类型检查以确定是否违反了一个或多个编程语言要求。
编译器114可以将语法树中的人类可读源代码转换成机器无关中间代码,而在其它示例中,编译器114可以将人类可读源代码转换成用于特定机器架构的汇编语言。出于本公开的目的,机器可执行代码可以指用于特定计算机架构的机器无关中间代码或者汇编语言。机器无关中间代码可以由已经针对特定计算机架构进行编译的运行时间环境或者虚拟机执行,而用于特定机器架构的汇编语言由具有特定计算机架构的处理器直接执行。
如在图1中示出的,构建器模块108包括调试器117。调试器117提供调试功能,诸如,单步执行通过和断开通过应用130的执行。在一些示例中,调试器117可以提供在执行期间检查分配给应用130中的变量的值,使得软件开发人员能够查看这些值。
编译器114可以生成包括一个或多个目标的目标集合112。目标可以是编译的或者未编译的。在一些示例中,目标是单个文件。例如,目标可以是包括由人类可读源代码编译的机器可执行代码的集合(例如,“编译目标”)的文件。可以将编译目标称为面向对象的编程中的对象限定。在一些示例中,目标可以具有特定名称并且可以是机器可执行代码的逻辑分组。例如,在Java编程语言中,编译目标可以是具有与限定编译的类文件的逻辑的源文件相同的名称的编译类文件(例如,对象限定)。
在一些示例中,目标可以是未编译目标。未编译目标的示例可以是被访问、集成、或者以其它方式与应用一起使用的资源。例如,未编译目标可以是图像、布局限定、颜色限定等。当构建应用130时,构建器模块108可以汇编包括共同表示应用130的编译和未编译目标的目标集合112。例如,应用130可以是被捆绑成称为应用程序包的单个文件的编译目标和未编译目标的类集。
如在图1中示出的,在软件开发过程期间,软件开发人员可以使构建器模块108对源代码118进行编译并且将资源120汇编到目标集合112中,该目标集合112可以由构建器模块108捆绑到表示应用130的应用程序包中。可以在测试环境系统124中执行应用130以观察或者测试在应用130中实施的功能。在图1中,测试环境系统124被实施为通过通信链路119耦合至构建器计算系统102的单独的计算装置。测试环境系统124的示例可以包括但不限于:平板计算机、个人数字助理(PDA)、膝上型计算机、服务器、台式计算机、便携式游戏装置、便携式媒体播放器、电子书阅读器、智能手表、电视平台、或者另一类型的计算装置。通信链路119可以是将构建器计算系统102可操作地耦合至用户计算系统124的有线链路或者无线链路。构建器模块108可以部署应用130以通过经由通信链路119向测试环境系统124发送表示应用130的编译目标和未编译目标的类集来测试环境系统124。例如,构建器模块108可以通过向测试环境124发送表示应用130的应用程序包来部署应用130。
如在图1中示出的,测试环境124可以包括存在敏感显示器126。测试环境124的存在敏感显示器126可以用作用于测试环境124的输入装置和输出装置。在一些示例中,存在敏感显示器126可以包括集成式存在敏感输入装置和显示装置。例如,存在敏感显示器126可以使用存在敏感屏幕(诸如电阻式触摸屏幕、表面声波触摸屏幕、电容式触摸屏幕、投射电容触摸屏幕、压敏屏幕、声脉冲识别触摸屏幕、或者另一存在敏感屏幕技术)来用作存在敏感输入装置。存在敏感显示器126可以使用能够向测试环境124的用户输出可视信息的液晶显示器(LCD)、点阵显示器、发光二极管(LED)显示器、有机发光二极管(OLED)显示器、电子墨水、或者类似的单色或者彩色显示器中的任何一个或多个来用作输出装置(诸如,显示装置)。
存在敏感显示器126可以通过检测由测试环境124接收到的一个或多个轻击和/或非轻击手势、连续手势、或者其它任何触摸手势(例如,多点触摸手势)(例如,用户用手指或者触控笔触摸或者指向存在敏感显示器126的一个或多个位置)来接收用户输入的指示。基于用户输入的指示,存在敏感显示器126的显示装置可以向用户呈现输出。例如,存在敏感显示器126的显示装置可以呈现在测试环境124处执行的应用的各种用户界面。测试环境124的用户可以在存在敏感显示器126的在存在敏感输入装置处提供用户输入以与这些应用中的一个或多个应用进行交互。
测试环境124还可以包括用户界面(UI)模块128。测试环境124的UI模块128可以从存在敏感显示器126接收在存在敏感显示器126处检测到的用户输入的一个或多个指示。通常,每次存在敏感显示器126接收到在存在敏感显示器126的预定义位置处检测到的用户输入的指示时,UI模块128可以从存在敏感显示器126接收关于用户输入的信息。UI模块128可以将从存在敏感显示器126接收到的信息汇编到指示手势的事件的集合中,该事件的集合可以是时间排序的,诸如,一个或多个触摸事件的序列。序列中的每个触摸事件可以包括表示表征在存在敏感屏幕处的输入的存在和/或运动的参数(例如,时间、地点、发起方向)的数据或者分量。序列中的每个触摸事件可以包括与存在敏感显示器126的位置相对应的位置分量、与存在敏感显示器126在位置处检测到用户输入的时间相关的时间分量、和/或与触摸事件是否与在位置处的抬起或者按下相对应相关的动作分量。此外,事件中的一个或多个事件可以具有并发时间分量,并且仅出于示例之目的将这种事件描述为触摸事件,并且这种事件可以指示在任何形式的存在敏感输入装置处的姿势。
UI模块128可以基于触摸事件序列来确定用户输入的一个或多个特征,并且包括关于在触摸事件序列中的每个触摸事件内的这些一个或多个特征的信息。例如,UI模块128可以确定用户输入的开始位置、用户输入的结束位置、用户输入的部分的密度、用户输入的部分的速度、用户输入的部分的方向、和用户输入的部分的弯曲。在触摸事件序列中的一个或多个触摸事件可以包括(除了如上所述的时间分量、位置分量、和动作分量之外)特征分量,该特征分量包括有关用户输入的一个或多个特征的信息(例如,密度、速度等)。UI模块128可以传输包括与每个触摸事件相关联的分量或者参数化数据的触摸事件的序列,或者以其它方式使该触摸事件序列可用于应用模块114。
UI模块128可以充当在测试环境系统124的各个组件之间的中介以基于由存在敏感显示器126检测到的输入来进行确定并且生成由存在敏感显示器126呈现的输出。例如,UI模块128可以接收包括输入字段142A至142C的图形用户界面140的表示作为来自应用130的输入。UI模块128还可以接收从关于由存在敏感显示器126检测到的用户输入的信息生成的触摸事件序列。UI模块128可以基于序列触摸事件中的位置分量来确定一个或多个位置分量近似于对图形用户界面140的一个或多个位置的选择。UI模块128可以将触摸事件的序列作为输出传输至应用130。UI模块128还可以从应用130接收信息,还UI模块128可以输出该信息以供在存在敏感显示器126处显示。UI模块128可以更新图形用户界面140以例如,将数据包括在输入字段142A至142C内。
虽然将测试环境系统124实施为与图1中的构建器计算系统102分离开的计算装置,但是在一些示例中,测试环境系统124可以被实施在构建器计算系统102处。例如,诸如在图3中描述的,测试环境系统124可以是对运行特定操作系统的装置进行仿真的仿真器。在这种示例中,测试环境系统124作为硬件、软件、或者硬件和软件的组合在构建器计算系统102处执行。在一些示例中,测试环境系统124可以被实施为在构建器计算系统102处的虚拟机。在一些示例中,测试环境系统124可以是构建器计算系统102的文件系统中的一个或多个目录,该一个或多个目录包括或者存储表示应用130的一个或多个文件。
在图1的示例中,应用130在由构建器模块106构建时被部署到文本环境系统124以供执行。例如,构建器模块108可以将目标集合112封装到构建器模块108发送至测试环境系统124的单个文件或者文件的集合中。应用130可以包括用于在测试环境系统124内执行各种操作中的任何操作的功能。例如,应用130可以是:电子邮件应用、文本消息收发应用、即时消息收发应用、天气应用、视频会议应用、社交网络应用、天气应用、股票市场应用、紧急警报应用、运动应用、办公效率应用、或者多媒体播放器,仅举几例。
测试环境系统124(诸如,计算装置或者仿真器)可以执行应用130。如在图1中示出的,应用130可以包括但不限于:对象限定132、对象状态134和资源136。如上所述,对象限定132可以是编译目标,诸如,面向对象的编程语言中的编译类。当测试环境系统124执行应用130时,测试环境系统124可以将对象限定132中的一个或多个加载到存储器中。例如,可以将在对象限定132中包括的指令和/或符号加载到随机存取存储器中。如在图1中示出的,应用130可以包括多个对象限定。例如,对象限定144A说明用于名称为USER的类的编译目标的人类可读内容。USER类可以限定三个变量:id(整数)、firstName(字符串)、和lastName(字符串)。此外,对象限定144A包括指定三种功能或者方法的指令:setFirstName、setLastName、和getFullName。在一些示例中,功能可以是指函数、实例方法类方法、lamba、或者任何其它合适的关系。
应用可以基于对象限定来创建多个对象实例。例如,应用130可以在应用130的生命周期期间基于对象限定144A来创建多个对象实例。当应用130基于对象限定132来创建对象实例146A或者将对象实例146A实例化时,应用130可以通过指定对象限定的名称(例如,“USER”)来调用系统运行时间138。该系统运行时间138可以执行一次或多次系统调用,所述一次或多次系统调用在存储器中为基于对象限定144A限定的对象实例的每个变量的内容或者“状态”预留空间。如在图1中示出的,对象状态146A表示名称为Instance_1的对象实例的人类可读状态。对象状态146A包括在对象限定144A中指定的变量的值。例如,对象状态146A包括变量id、firstName、和lastName中的每一个的值。另外,对象状态146A可以包括指定对象实例的对象限定的类型以及对象实例的唯一id的OBJ_TYPE值,诸如,随机生成的哈希码。在一些示例中,目标的类型可以是目标的数据类型。在一些示例中,类型可以是目标的特定文件扩展名。
在操作中,如果应用130中的程序逻使用对对象实例146的参考或者指针来执行对象限定144A的setFirstname方法,则执行对象限定132中的setFirstName的指令,以将'first'的值写入存储器中的与对象状态146A的firstName相对应的位置。除了对象限定132和对象状态134之外,应用130可以包括如上所述的资源136。例如,资源136可以包括由应用130使用的图像或者任何其它资源。
每次开发人员改变应用130的源代码中的功能时,软件开发人员可以提供用于在构建器模块108处发起构建过程的用户输入。随着应用的大小增长,针对测试或者观察功能的每次迭代构建和部署应用所需的时间量还可能增长。因为当针对每次构建和部署迭代改变应用的功能,重新对所有目标的源代码进行编译,将整个目标集合封装到表示应用的文件中,对文件进行签名,以及部署应用可能花费很长一段时间时,软件开发人员通常不修改在源代码中限定的每个源文件或者逻辑分量。由于软件开发人员可能在单个编程会话中多次修改应用,因此当累积地测量用于构建和部署应用的每次迭代的时间量时,用于构建和部署应用的每次迭代的时间量可能会影响软件开发人员在编程会话中的整体生产力。此外,因为针对测试和观察实施并且部署了功能方面的变化,所以先前在测试环境中运行的应用需要被重新启动以执行功能方面的所更新的变化。
本公开的技术可以减少在最初部署了应用之后在源代码中对功能进行增量变化时以完成构建和部署迭代的时间量。例如,构建器模块108可以实施技术以确定构建过程已经递增地生成了更新的编译目标的子集的时间。构建器模块108可以将编译目标的子集发送至测试环境系统124,而不需要将用于应用130的整个目标集合112发送至测试环境系统124。按照这种方式,构建器模块108可以避免构建过程中的不必要的步骤,诸如,重新汇编包括整个目标集合112的整个应用程序包、将整个应用程序包发送至测试环境系统124、和重新启动应用130。构建器模块108可以进一步实施使应用130能够在不终止应用130的执行的情况下更新已经改变的对象限定132的技术。按照这种方式,应用130可以保持其状态,同时展现其功能方面的更新。本文参照图1进一步描述了这些和其它技术。
构建器模块108可以实施使应用130能够在不终止应用130的执行的情况下更新已经改变的对象限定132的技术。按照这种方式,应用130可以在执行期间保持其状态,同时由新构建迭代展现其功能更新。为了使应用130能够在不终止应用130的执行的情况下更新已经改变的对象限定132,构建器模块108可以在编译期间或者在编译之后将程序逻辑注入到编译目标中。附加程序逻辑可以包括以下伪代码的第粗体行2至6粗体行:
在以上的示例中,方法setFirstName(String first)可以是在源文件中限定的类(例如,USER)的方法。最初,测试环境系统124可能不包括应用130,并且构建器计算系统可能不包括目标集合112。为了首次对应用130进行编译,软件开发人员可以提供使构建器模块108在初始构建和部署迭代中构建和部署应用130的用户输入。出于本公开的目的,当构建器计算系统最初构建目标集合112时,目标集合112可能不存在于测试环境系统124上。即,软件开发人员可以在初始构建期间使构建器计算系统102首次生成目标集合112。软件开发人员可以在初始构建期间使构建器计算系统102将目标集合112封装在应用程序包中,并且将该应用程序包部署到测试环境124。在初始构建期间,测试环境124可能不具有在测试环境124处存储的应用程序包的先前版本,或者可能具有以下应用程序包的先前版本:该应用程序包具有比目标集合112不那么新的目标集合。
在初始构建期间,构建器模块108可以向编译目标添加字节码形式的程序逻辑,其中程序逻辑在setFirstName(String first)被调用时执行伪代码的第2行至第6行的功能。例如,构建器模块108可以向从源文件中的USER类编译的对象限定添加$changeLocal变量。可以使用$hangeLocal变量来将参考或者存储器位置存储到USER类的相同类型的对象限定的另一个但是较新的版本。可以将$changeLocal变量初始化为空、0、或者一些其它初始化值。
在初始构建和部署迭代期间,构建器模块108可以包括与USER类的每种方法的第2行至第6行相似的附加程序逻辑,诸如,setFirstName、setLastName、和getFullName。构建器模块108可以将附加程序逻辑作为字节码注入在表示USER类的编译目标的一个或多个位置处。在一些示例中,构建器模块108可以相对于在编译目标的文件内的特定数据确定特定位置。特定数据可以是表示编译目标名称(例如,类名称)、变量名称、或者方法名称的数据。作为示例,构建器模块108可以在编译目标中的指定编译目标名称的数据之前的特定位置处注入用于第2行至第6行的程序逻辑。例如,构建器模块108可以在编译目标中的指定编译目标名称的字节之前但是与字节相邻的字节中写入用于第2行至第6行的程序逻辑。相反,构建器模块108可以在编译目标中的指定编译目标名称的数据之后的特定位置处注入用于第2行至第6行的程序逻辑。在一些示例中,构建器模块108可以在从特定数据偏移了偏移值的特定位置处注入用于第2行至第6行的程序逻辑。
构建器模块108可以利用编译目标以各种级别的粒度注入用于第2行至第6行的程序逻辑。例如,构建器模块108可以如以上描述的那样基于每个编译目标来注入用于第2行至第6行的程序逻辑。在一些示例中,构建器模块108可以基于每种方法和/或每个变量来注入用于第2行至第6行的程序逻辑。作为示例,构建器模块108可以针对目标中的每种方法注入表示用于第2行至第6行的程序逻辑的相对应字节码。在一些示例中,当由软件开发人员创建新的源文件、类、方法、或者变量时,构建器模块108可以将用于第2行至第6行的程序逻辑作为字节码注入到包括对相对应类、方法、或者变量的限定的相对应编译目标中。虽然已经关于在编译之后或者在编译期间将字节码注入到编译目标中对上述技术进行了描述,但是在一些示例中,用于第2行至第6行的程序逻辑可以由预处理器116在编译之前作为人类可读源代码添加到源文件,并且然后对其进行编译以生成表示用于第2行至第6行的程序逻辑的机器可读代码。
在利用附加程序逻辑注入字节码之后,每个编译目标被包括在目标集合112中。然后,构建器模块112可以将目标集合112中的编译目标和未编译目标(例如,资源)封装到构建器模块108可以对其进行签名并且发送至测试环境系统124的应用程序包中。在接收到包括目标集合112的应用程序包之后,测试环境系统124可以执行应用程序包,使得将来自目标集合112的一个或多个对象限定132加载到存储器中。
稍后,软件开发人员可以通过更改用于getFullName的源代码来改变方法getFullName中的功能。在一些示例中,改变源代码的功能可以包括添加源代码、删除源代码、对源代码进行重命名、重新排列源代码、或者对源代码的任何其它修改。软件开发人员可以向IDE 104提供使构建器模块108对USER类进行重新编译的另一用户输入。构建器模块106可以确定与USER类相对应的现有编译目标在目标集合112中。因此,构建器模块106可以将指示编译目标从现有编译目标改变的信息包括在更新的编译目标中。例如,构建器模块106可以修改更新的编译目标内的类名称、方法名称、和/或变量名称以将类名称、方法名称、和/或变量名称与原始编译目标区分开来。作为示例,构建器模块108可以将在更新的编译目标中包括的类名称改变为USER$override。即,构建器模块108可以注入字节码或者以其它方式修改更新的编译目标以将后缀$override添加到现有USER类名称。在一些示例中,构建器模块108可以注入字节码或者以其它方式修改更新的编译目标以向USER类的每个方法签名添加附加自变量。在一些示例中,附加自变量是对称为方法的编译目标的实例的参考。例如,构建器模块108可以在更新的编译目标中重写getFullName(Object obj,intid)。
在一些示例中,构建器模块108可以将实例方法和/或实例变量重写为原始或者更新的编译目标中的类方法和/或类变量。在一些示例中,构建器模块108可以将访问修饰符(例如,public、protected、private)从更多限制性的范围改变为更少限制性的范围。例如,构建器模块108可以将类、方法、和/或变量的访问修饰符从private改变为protected或者从protected改变为public。在一些实例中,利用表示上述源代码第2行至第6行的程序逻辑的字节码的一个或多个实例来注入更新的编译目标。
在构建器模块108已经将USER类的新版本编译成更新的编译目标之后,构建器模块108可以确定哪些其它资源和/或编译目标已经被更新。因为构建器模块108先前将整个应用程序包部署到测试环境系统124,所以构建器模块108可以避免执行不必要的活动,诸如,重新对全新的应用程序包进行封装、对全新的应用程序包进行签名、使全新的应用程序包对齐,并且相反仅确定已经改变的那些资源和/或更新的编译目标的目标子集122。例如,变化检测模块110可以确定由构建器模块108比编译目标的现有版本较新地生成的更新的编译目标是否与现有版本不同。变化检测模块110可以选择已经改变的更新的编译目标和资源作为目标子集122。构建器模块108可以将目标子集122部署到或者发送至测试环境系统124。在一些示例中,构建器模块108部署或者发送目标子集122,同时在目标集合122中避免部署不包括在目标子集122中的其它编译目标和/或资源。按照这种方式,仅资源和编译目标的更新的目标子集122被发送至测试环境系统124。
在接收到目标子集122之后,系统运行时间138可以将用于USER类的更新的编译目标加载到存储器中,同时编译目标的先前版本已经被加载到存储器中以供应用130的执行。在将更新的编译目标加载到存储器中时,系统运行时间138可以确定更新的编译目标的较新版本的存储器位置或者对更新的编译目标的较新版本的参考,并且将该存储器位置或者参考存储在对象限定的先前版本或者原始版本的$change变量中。例如,系统运行时间138可以使用映射来识别和设置对象限定的先前版本的$change变量。按照这种方式,如果应用130执行setFirstName(String first),则因为$changeLocal变量基于$change变量被设置为存储器位置或者对编译目标的更新版本的参考,所以编译目标的先前版本首先执行其setFirstName(String first)方法并且确定($changeLocal!=null)为真。因此,编译目标的先前版本执行$changeLocal.access$dispatch()。该access$dispatch()方法包括接受自变量($changeLocal,“setFirstName(String first)”,first)的调度器程序逻辑。该调度器程序逻辑基于在$changeLocal中包括的参考来访问更新的编译目标。在访问更新的编译目标时,调度器使用自变量first来执行名称为“setFirstName(String first)”的方法。因为调度器程序逻辑能够在应用130执行时使用$changeLocal变量来访问更新的编译目标,所以可以在不终止应用模块130的执行的情况下测试和观察对更新的编译目标的功能方面的变化。由于应用模块130的执行还未终止,因此用于现有对象实例的对象状态134可以保持在存储器中是可访问的。同样,能够使用现有对象状态来测试和观察对更新的编译目标的改变。
如果软件开发人员再次或者多次改变源代码,则可以重复上述用于发送更新的目标集的过程。例如,构建器模块108可以向测试环境系统124发送具有注入的字节码的后续更新的编译目标。测试环境系统124可以将用于相对应的、先前更新的编译目标的$change变量设置为指向或者参考被加载到存储器中的后续更新的编译目标。每次由构建器模块108构件增量变化时,都可以重复该过程。在一些示例中,可以对先前加载到测试环境系统的存储器中的原始编译目标解除参考、将其从存储器中去除、和/或将其作为垃圾采集。如上所述,在本公开的一些示例中,这些技术可以被称为“热交换”。本公开中还描述了用于进行“冷交换”和“暖交换”的其它技术。
图2是图示了根据本公开的一个或多个方面的可以由图1的构建器计算系统102执行的软件编译和构建过程的流程图。在图1的构建器计算系统102的构建器模块108的上下文中描述过程200。
过程200涉及通过执行用于产生处理器可执行应用程序代码的一项或多项操作262至276来操纵和生成中间文件220至244。即,在构建器模块108执行用于生成在计算装置(诸如,图1的测试环境124)处可执行的代码的操作262至276中的一项或多项操作时,中间文件220至244表示构建器计算系统102的构建器模块108可以在过程200的各个阶段处生成的信息(例如,数据)。过程200只是构建器模块108可以执行的一个示例软件编译和构建过程。在一些示例中,构建器模块108可以生成附加的或者更少的中间文件和/或执行与过程200中示出的中间文件和操作相比附加的或者较少的操作。在一些示例中,构建器模块108可以按照与在图2中示出的并且在以下描述的顺序不同的顺序来执行过程200的操作。
构建器模块108可以对一个或多个应用资源220执行资源汇编262以产生生成的源代码224A和224B(统称为“生成的源代码224”)。应用资源220可以表示指定应用的预定义特征(例如,所声明的特征和许可)的信息,诸如,应用用户界面的特征(例如,设计布局、对象、颜色、和其它预定义特征)。与应用资源220相反,应用源代码226通过限定表示应用或者目标内的程序逻辑。例如,虽然应用资源220可以限定应用的用户界面中的对象的形状、颜色、或者样式,但是应用源代码226可以限定在用户与对象进行交互时由计算装置执行的操作。
在一些实例中,可以用标记语言(例如,可扩展标记语言[XML]等)来限定应用资源220,并且可以用通用编程语言或者面向对象的编程语言(例如,Java、C等)来限定应用资源226。构建器模块108可以对应用资源220执行各种资源汇编262任务,以便以被使用来限定应用的由应用源代码226指定的逻辑特征的类似通用编程语言或者面向对象的编程语言的方式来变换和指定应用的预定义特征。例如,构建器模块108的资产封装工具可以汇编资源220并且输出生成的源代码224,以用应用的由应用源代码226限定的逻辑特征来指定应用的在编译时是不可协调的语言中的预定义特征。
构建器模块108可以对生成的源代码224A和应用源代码226执行源编译264A以产生虚拟机(VM)代码228A。VM代码228A可以是可以由计算装置(诸如,测试环境系统124)的一个或多个处理器(例如,在计算装置的一个或多个处理器处执行的虚拟机模块)解释和执行的机器可读的、可执行代码。例如,在Java编程语言中,类文件是VM代码228A的示例。构建器模块108可以通过将与代码224A和226相关联的通用编程语言指令或者面向对象的编程语言指令变换和协调成稍后能够由虚拟机解释并且执行的VM代码228A来对生成的源代码224A和应用源代码226执行源编译264A。
在一些示例中,构建器模块108可以对VM代码228A执行源编译264B以产生与VM代码228A不同的虚拟机(VM)代码228B。例如,一些计算平台可以作为对预先存在的计算平台的定制适应而存在。虽然预先存在的计算平台可能适用于某些应用,但是一些移动计算平台和/或可穿戴计算平台可以提供在需要在底层硬件上执行的不同的VM代码和/或完全不同的虚拟机执行不同的VM代码的执行和性能方面的各种增强。构建器模块108可以对VM代码228A执行源编译264B以将VM代码228A变换和限定成可以由不同于能够执行VM代码228A的虚拟机模块的虚拟机模块来解释和执行的机器可读的、可执行VM代码228B。
在一些示例中,构建器模块108可以接收在构建器模块108执行VM代码228A的源编译264B时可能需要进行编译的任何第三方虚拟机代码230作为输入。例如,构建器模块108可以通过进一步对开发人员已经指示将构建器模块108包括在VM代码228B构建阶段中的任何公开可用或者其它第三方VM代码230进行编译来将VM代码228A编译成VM代码228B。
如在图2中示出的,目标集合239可以包括VM代码228A和/或228B、资源数据224B、和其它资源236。其它资源236通常表示在资源汇编262处未编译的任何“未编译”资源(例如,图像等)。目标集合239可以表示应用的内容。根据本公开的技术,构建器模块108可以在决定框267处确定包括目标集合239的应用程序包是否最初已经生成。例如,如果构建器模块108先前没有在软件开发人员的编程会话中生成应用程序包,则构建器模块108可以将集合239作为产生单个应用程序包238的目标。在一些示例中,编程会话可以是连续时间段,其中,软件开发人员开始编程并且之后停止编程以执行其它活动,而不再返回到在该连续时间段期间的编程。
在一些示例中,在构建器模块108构建应用程序包238之后,构建器模块108可以执行部署应用程序包238以供随后执行(诸如,在图1的测试环境系统124处)的附加操作。例如,在一些实例中,构建器模块108可以执行调试和/或发行应用程序包238的签名270以创建已签名的应用程序包242。即,在安装应用程序包238的内容之前,一些计算环境可能要求内容具有标记内容的作者(例如,开发人员)的标识符(例如,比特、数字签名、证书、或者一些其它标记)以及将内容指定为应用的调试版本或者发行版本的信息。构建器模块108可以利用内容是调试版本或者发行版本,并且输出标记的内容作为已签名的应用程序包242的指示对应用程序包238的内容进行数字签名。
在一些实例中,构建器模块108可以使已签名的应用程序包242对齐,以在上传或者以其它方式发行应用程序包244以供一个或多个计算装置(诸如,图1的测试环境124)稍后执行之前创建已签名的并且对齐的应用程序包244(272)。例如,构建器模块108可以对已签名的应用程序包242执行对齐272,以确保与程序包242相关联的所有未压缩数据以相对于文件的开头从特定(存储器)对齐开始。例如,通过执行对齐272,构建器模块108可以使程序包242内的所有未压缩数据(诸如,图像或者其它未压缩文件)在双字节、四字节、或者其它字节级别边界上对齐。按照这种方式,即使一些部分包括具有对齐限制的二进制数据,随后也能够利用存储器呼叫来直接访问程序包244的所有部分。通过使已签名的应用程序包242对齐,构建器模块108可以使计算装置能够使用较少的存储器来执行应用程序包244。在生成已签名的并且对齐的应用程序包244之后,构建器模块108可以将包裹244部署到或者发送至计算环境,诸如,测试环境系统124。
返回到决定框267,如果构建器模块108确定先前已经生成了用于目标集合239的应用程序包并且将其部署到测试环境系统,则构建器模块108可以确定哪些编译目标在目标集合239内已经改变为对源代码和/或资源的子集的增量修改。例如,构建器模块108可以确定由构建器模块108比编译目标的现有版本较新地生成的更新的编译目标是否与现有版本不同。变化检测模块110可以选择已经改变的更新的编译目标和资源作为目标子集243。构建器模块108可以将目标子集234部署到或者发送至计算环境(诸如,测试环境系统124)276。在一些示例中,构建器模块108部署或者发送目标子集243,同时避免在目标集合239中部署不包括在目标子集243中的其它编译目标和/或资源。按照这种方式,仅资源和编译目标的更新的目标子集243被发送至测试环境系统124。
图3是根据本公开的一个或多个方面的作为配置为执行示例软件编译和构建过程的示例计算装置的构建器计算装置102的框图。图3图示了构建器计算装置102的仅一个特定示例,并且可以存在构建器计算装置102的其它示例。图3的构建器计算装置102可以包括在图1的构建器计算系统102中包括的组件的子集,并且可以包括未在图3中示出的附加组件。构建器计算装置102可以执行图2的过程200。
在图3的示例中,构建器计算装置102可以是台式计算装置,但是在其它示例中,构建器计算装置102可以是够执行本公开的技术的膝上型计算机、平板计算装置、服务器计算装置或者能任何其它计算装置。构建器计算装置102可以是配置为将代码编译为用于创建一个或多个可执行软件应用(诸如,应用程序包)的构建过程(例如,图2的过程200)的部分的软件开发装置。
如在图3的示例中示出的,构建器计算装置102包括一个或多个处理器340、一个或多个输入组件342、一个或多个输出组件344、一个或多个通信组件346、和一个或多个存储组件348。构建器计算装置102的存储组件348包括构建器模块108、目标集合112、插入模块352、调试器117、命令模块352、变化检测模块110、编译器114、预处理器116、部署模块356、封装模块358、验证器模块360、交换启发法362、测试环境364、源代码118、编辑器106、和资源120。
通信信道350可以将组件340、342、344、346、和348中的每个互连以便进行组件间通信(物理地、通信地、和/或可操作地)。在一些示例中,通信信道350可以包括用于在构建器计算装置102的内部组件之间传送数据的有线和/或无线系统总线、有线和/或无线网络连接、进程间通信数据结构、或者任何其它方法。
构建器计算装置102的一个或多个输入组件342可以代表构建器计算装置102的各种其它部件和模块接收输入。例如,来自装置102的用户在用于编写应用源代码326和/或应用资源320的文本编辑器处的键盘输入。输入的示例是触觉输入、音频输入、和视频输入。在一个示例中,构建器计算装置102的输入组件342包括:用于检测来自人类或者机器的输入的存在敏感显示器、触敏屏幕、鼠标、键盘、语音响应系统、摄像机、麦克风或者任何其它类型的装置。
构建器计算装置102的一个或多个输出组件344可以生成供其它计算装置、系统、和装置102的用户接收的输出。例如,一个或多个输出组件344可以在输出组件344的显示器处呈现文本编辑器和/或集成开发环境的用户界面,通过该用户界面,装置102的用户能够查看应用源代码326和/或应用资源320。输出的示例是触觉输出、音频输出、和视频输出。在一些示例中,构建器计算装置102的输出组件344包括:用于向人类或者机器生成输出的存在敏感显示器、声卡、视频图形适配卡、扬声器、阴极射线管(CRT)监视器、液晶显示器(LCD)、发光二极管(LED)显示器、有机发光二极管(OLED)显示器、或者任何其它类型的装置。
构建器计算装置102的一个或多个通信单元346可以通过发送和/或接收在一个或多个网络上的网络信号来经由一个或多个有线和/或无线网络与外部装置进行通信。通信单元346的示例包括:能够发送和/或接收信息的网络接口卡(例如,诸如,以太网卡)、光学收发器、射频收发器、GPS接收器、或者任何其它类型的装置。通信单元346的其它示例可以包括:短波无线电、蜂窝数据无线电、无线网络无线电、以及通用串行总线(USB)控制器。
一个或多个处理器340可以在构建器计算装置102内实施功能和/或执行指令。例如,在构建器计算装置102上的处理器340可以接收并且执行由执行模块106、108(以及构建器模块108的相对应数据和模块)、和测试环境364的功能的存储组件348存储的指令。由处理器340执行的这些指令可以使构建器计算装置102在程序执行期间将信息存储在存储组件348内。处理器340可以执行模块106、108(以及构建器模块108的相对应数据和模块)、和测试环境系统364的指令,以使模块106、108(以及构建器模块108的对应数据和模块)、和测试环境系统364执行本公开的技术。即,根据本公开的技术,模块106、108(以及构建器模块108的相对应数据和模块)、和测试环境系统364可以由处理器340操作,以执行构建器计算装置102的各种动作或者功能。
在构建器计算装置102内的一个或多个存储组件348可以存储信息以便在构建器计算装置102的操作期间进行处理(例如,构建器计算装置102可以存储由106、108(以及构建器模块108的相对应数据和模块)、和测试环境系统364在执行期间访问的数据。在一些示例中,存储组件348是暂时存储器,这意旨存储组件348的主要目的不是长期存储的。可以将在构建器计算装置102上的存储组件348配置用于作为易失性存储器来短期存储信息,并且因此如果该存储组件被断电,则不会保留已存储的内容。易失性存储器的示例包括:本领域已知的随机存取存储器(RAM)、动态随机存取存储器(DRAM)、静态随机存取存储器(SRAM)、和其它形式的易失性存储器。
在一些示例中,存储组件348还包括一种或多种计算机可读存储介质。可以将存储组件348配置为比易失性存储器存储更大量的信息。可以将存储组件348进一步配置用于作为非易失性存储器空间来长期存储信息,并且在通电/断电周期之后保留信息。非易失性存储器的示例包括:磁硬盘、光盘、软盘、闪速存储器、或者电可编程存储器(EPROM)或者电可擦除可编程(EEPROM)存储器的形式。存储组件348可以存储与模块106、108(以及构建器模块108的对应数据和模块)、测试环境系统364、源代码118、和资源120相关联的程序指令和/或信息(例如,数据)。
模块106、108(以及构建器模块108的相对应数据和模块)、和测试环境系统364可以使用软件、硬件、固件、或在构建器计算装置102中驻留的并且在构建器计算装置102上执行的硬件、软件、和/或固件的混合来执行操作。构建器计算装置102可以利用单个或者多个处理器(诸如,处理器340)来执行模块106、108(以及构建器模块108的相对应数据和模块)、和测试环境系统364。构建器计算装置102可以将模块106、108(以及构建器模块108的相对应数据和模块)、和测试环境系统364中的一个或多个执行为在构建器计算装置102的底层硬件组件上执行的虚拟机(VM)。在一些示例中,可以将模块106、108(以及构建器模块108的相对应数据和模块)、和测试环境系统364远程布置为构建器计算装置102,并且可通过构建器计算装置102远程访问,例如,作为可由构建器计算装置102经由网络云访问的一种或多种网络服务。
构建器模块108是图1的构建器模块108的更详细的示例。相较于由图1中的构建器模块108执行的操作,构建器模块108可以执行相同的、附加的、或者更少的操作。例如,构建器模块108可以执行图2的过程200,过程200的子集、或者超过过程200的附加操作。
利用图1的先前示例进一步描述图1和图2的技术。如在图2中示出的,源代码118可以包括源文件,该源文件包括如在图1中描述的那样限定USER类的源代码。限定USER类的源文件可以包括三个变量:Id、firstName、和lastName。USER类还可以包括三种方法:setFirstName、setLastName、和getFullName。作为示例,方法setFirstName(Stringfirst)可以是在源文件中限定的类(例如,USER)的方法。
最初,测试环境系统124可能不包括用于应用130的应用程序包,并且构建器计算系统102可能不包括目标集合112。为了在编程会话中首次对应用130进行编译,软件开发人员可以提供使构建器模块108在初始构建和部署迭代中构建和部署应用130的用户输入。例如,构建器模块108可以包括命令模块354。命令模块354可以接收来自输入组件342的用户输入的指示。例如,如果用户在IDE 104中选择与构建和部署应用相对应的视觉图标,则命令模块354可以接收表示构建和部署应用的用户选择的数据。在其它示例中,如果用户在IDE 104中选择与调试应用相对应的图标,则命令模块354可以接收表示用于调试应用的用户选择的数据。在图3的示例中,命令模块354接收表示用于构建和部署应用的用户选择的数据。
响应于接收到用户输入的用于构建和部署应用的指示,命令模块354可以向预处理器116发送数据以对源代码118和资源120执行任何预处理操作。预处理器116可以基于例如源文件和/或资源的名称、或者指定用于应用130的源文件和/或资源的项目名称或者工作集合来确定与应用130相对应的源代码的文件118的子集和/或资源120的子集。在预处理器116对源代码118和资源120执行任何预处理操作时,编译器114可以对来自源文件的源代码和可以进行编译的任何资源进行编译。例如,编译器114可以将用于应用130的人类可读源代码变换成机器可读代码,诸如,编译目标的集合。
构建器模块108还可以包括插入模块352。在编译器114生成编译目标之后,插入模块352可以以字节码的形式向编译目标添加程序逻辑,其中,程序逻辑在图1中描述的伪代码的2行至6行的功能。例如,插入模块352可以向通过源文件中的USER类编译的对象限定(例如,编译目标)添加$changeLocal。插入模块352可以包括$changeLocal变量以将参考或者存储器位置存储到稍后在测试环境系统364中的执行期间USER类的相同类型的对象限定的另一个但是更新的版本。
插入模块352可以将与如在图1的描述中的行2至6行相似的附加程序逻辑包括到类USER的每种方法,诸如,setFirstName、setLastName、和getFullName。插入模块112可以在注入具有附加程序逻辑的字节码之后将每个编译目标包括在目标集合112中。在一些示例中,变化检测模块110确定构建器模块108是否先前已经生成了表示应用130的应用程序包。
根据本公开的技术,如果变化检测模块110确定应用130先前未被构建,则构建器模块108可以生成表示应用130并且包括目标集合112的内容的应用程序包。例如,封装模块112可以将目标集合112中的编译目标和未编译目标(例如,资源)汇编到应用程序包中。在一些示例中,应用程序包可以被压缩和/或可以包括指示应用程序包的内容和/或结构的一个或多个配置文件。在一些示例中,封装模块358可以用密钥来对应用程序包进行签名,以指示由特定作者生成的程序包的真实性。部署模块356可以将应用部署到或者以其它方式发送至测试环境系统364。在一些示例中,部署模块356可以包括程序逻辑以与在测试环境系统364中包括的服务器通信。例如,部署模块356可以创建套接字以与测试环境系统364中的服务器通信。测试环境系统364中的服务器可以从构建器计算系统102接收应用程序包,并且在一些示例中,发起应用程序包的执行。测试环境系统364中的服务器可以响应于由部署模块356发送至测试环境系统364中的服务器的一个或多个命令而发起应用程序包的执行。
与图1的测试环境系统124相反,测试环境系统364可以是装置的在构建器计算系统102处实施的仿真器,而不是独立的计算装置。例如,测试环境系统364可以对执行操作系统的硬件的集合(例如,处理器、输入组件、输出组件、和通信组件)进行模拟。测试环境系统364可以进一步包括可以提供用于执行应用(诸如,应用130)的一个或多个库、加载器、资源管理器、服务器、或者其它组件的一个或多个系统运行时间,诸如,图1和图4中的系统运行时间138。
如在图1中描述的,稍后,软件开发人员可以通过更改源代码118的源文件中的getFullName的源代码来改变方法getFullName中的功能。软件开发人员可以提供由命令模块354接收的另一用户输入以重建应用130。命令模块354可以接收用户输入并且使预处理器116对源代码118和/或资源120执行任何预处理。编译器114对用于getFullName的所更改的源代码进行编译。在一些示例中,编译器114可以向变化检测模块110进行查询以确定先前已经对哪些其它源文件进行了编译。按照这种方式,如果编译器114确定源文件没有改变并且对于源文件已经存在相对应的编译目标,则编译器114可以不重新对源文件进行编译。在其它示例中,编译器114可以对用于应用130的所有源文件进行重新编译。
在编译器114对源文件进行编译之后,插入模块352可以查询对变化检测模块110,以确定与USER类相对应的现有编译目标是否处于目标集合112中。在确定存在与USER类相对应的先前编译目标时,插入模块352可以在更新的编译目标中插入信息或者以其它方式将信息包括在更新的编译目标中,该信息指示编译目标从现有编译目标进行变化。例如,插入模块352可以在更新的编译目标内修改类名称、方法名称、和/或变量名称以将类名称、方法名称、和/或变量名称与相同类型的现有编译目标区分开来。作为示例,插入模块352可以将在更新的编译目标中包括的类名称改变为USER$override。即,插入模块352可以注入字节码或者以其它方式修改更新的编译目标以将后缀$override添加到现有USER类名称。虽然出于说明之目的使用$override,但是可以将任何合适的前缀、后缀、或者子字符串预先加入、插入、或者附加到现有名称,诸如,类名称、方法名称、和/或变量名称。在一些示例中,插入模块352可以注入字节码或者以其它方式修改更新的编译目标以向USER类的每个方法签名添加附加自变量。如在图1中描述的,附加自变量是对称为方法的编译目标的实例的参考。例如,插入模块可以在更新的编译目标中重写getFullName(Object obj,int id)。
在编译器114已经将USER类的新版本编译成更新的编译目标,并且插入模块352已经添加附加程序逻辑,变化检测模块110可以确定已经更新了哪些资源和/或编译目标。因为构建器模块108先前将用于应用130的整个应用程序包部署到了测试环境系统364,所以构建器模块108可以避免执行不必要的活动,诸如,对全新的应用程序包进行重新封装、对全新的应用程序包进行签名、使全新的应用程序包对齐,并且相反,确定仅已经改变的那些资源和/或更新的编译目标的目标子集。例如,变化检测模块110可以确定由构建器模块108比编译目标的现有版本较新地生成的更新的编译目标是否与现有版本不同。变化检测模块110可以选择已经改变的更新的编译目标和资源作为目标子集。
在一些示例中,封装模块358可以将目标子集发送至测试环境354,而不是利用表示应用130的全部的目标集合112来生成新应用程序包。在一些示例中,封装模块358可以向部署模块356发送单独的改变的编译目标和/或资源,该部署模块356进而可以将单独的改变的编译目标和/或资源发送至测试环境系统364。在其它示例中,封装模块358可以将所改变的编译目标和/或目标子集的资源分组成单个文件,部署模块356可以将该单个文件发送至测试环境系统364。如在图1中描述的,构建器模块108可以部署或者发送目标子集,同时避免在目标集合中部署不包括在目标子集中的其它编译目标和/或资源。按照这种方式,只有资源和编译目标的更新的目标子集可以被发送至测试环境系统124。
在接收到目标子集之后,测试环境系统364可以将USER类的更新的编译目标加载到存储器中,同时编译目标的先前版本已经被加载到存储器中以供执行应用130。在将更新的编译目标加载到存储器中时,测试环境系统364可以确定更新的编译目标的较新版本的存储器位置或者对更新的编译目标的较新版本的参考,并且将该存储器位置或者参考存储在对象限定的先前版本的$change变量中。例如,测试环境系统364可以使用映射以识别和设置对象限定的先前版本的$change变量。按照这种方式,因为$changeLocal变量基于$change变量被设置为存储器位置或者被设置为对编译目标的更新版本的参考,所以如果应用130执行setFirstName(String first),则编译目标的先前版本最初执行其setFirstName(String first)方法并且确定($changeLocal!=null)为真。因此,编译目标的先前版本执行$changeLocal.access$dispatch()。该access$dispatch()方法包括接受自变量($changeLocal,“setFirstName(String first)”,first)的分配器程序逻辑。该调度器程序逻辑基于在$changeLocal中包括的参考来访问更新的编译目标。在访问更新的编译目标之后,调度器使用自变量first来执行名称为“setFirstName(String first)”的方法。因为调度器程序逻辑能够在应用130正在执行时使用$changeLocal变量来访问更新的编译目标,所以可以在不终止应用模块130的执行的情况下测试和观察更新的编译目标的功能变化。这种技术可以称为“热交换”。由于应用模块130的执行还未终止,因此用于现有对象实例的对象状态可以保持在存储器中是可访问的。同样,能够使用现有对象实例来测试和观察对更新的编译目标的改变。
在一些示例中,本公开的技术可以应用于面向对象的编程语言(诸如,Java),在该面向对象的编程语言中,子类的构造函数可以调取super()方法,该super()方法调用父类的构造函数。在一些示例中,父类可以包括多个构造函数,这些多个构造函数中的每个包括具有不同类型和/或数量的自变量的签名。例如,父类A可以包括第一构造函数A(String s)和第二构造函数A(int n)。
如果应用了热交换技术而使得原始编译目标(例如,子类B)包括对A(String s)的呼叫并且由包括对A(int n)的硬编码呼叫的更新的编译目标(例如,子类B)来参考,则使用热交换来执行更新的编译目标可能由于转换异常而失败。同样,应用可以恢复到冷交换技术以将更新的呼叫应用于A(int n),这可能比热交换慢。总之为了避免完全恢复到冷交换或者失败,插入模块352可以为由以下第2行至第11行的代码表示的新构造函数注入字节码:
在第2行中,插入模块352已经生成了包括自变量MarkerType__的构造函数签名,该MarkerType__操作为占位符以避免与现有构造函数签名发生命名空间冲突。StringsuperSignature指示识别将在运行时间处呼叫哪个特定超级构造函数的字符串。Objectargs[]自变量包括将传递给将在运行时间处调取的超级构造函数的自变量。
在第3行,开关语句将识别将在运行时间处呼叫哪个特定超级构造函数的字符串与开关语句的特定情况相匹配。如在第4行和第7行中示出的,本示例中的两个可能字符串是"<init>.(Ljava/lang/String;)V"和"<init>.(I)V"。以下在本示例中进一步描述识别将在运行时间处调用哪个特定超级构造函数的这些字符串的生成。"<init>.(Ljava/lang/String;)V"的语法如下。该<init>字符串指示"<init>.(Ljava/lang/String;)V"字符串表示特定构造函数。Ljava/lang/String;指示构造函数的自变量是字符串类型,并且V指示方法的返回类型是空(例如,因为构造函数不返回任何值)。如果superSignature包括"<init>.(Ljava/lang/String;)V"的值,则超级构造函数A(String s)将由更新的编译目标在运行时间处执行。可替选地,superSignature包括"<init>.(I)V"的值,则超级构造函数A(intn)将由更新的编译目标在运行时间处执行,其中,(I)表示用于A(int n)的超级构造函数的整数自变量。
除了上述代码之外,插入模块352可以包括由以下第2行和第4行至第8行的代码表示的类B(例如,类A的子类)的现有构造函数中的字节码:
如在第2行中示出的,插入模块352检查是否存在编译目标(例如,类B)的更新版本,并且如果不存在,则执行具有整数值100的超级构造函数,这使得父类A执行接受整数自变量的类A的构造函数。然而,如果存在编译目标(例如,类B)的更新版本,则执行由插入模块352作为字节码注入的在第4至第8行中的代码。具体地,第5行至第6行基于指示change.access$dispatch返回两个可能字符串中的一个字符串来生成字符串—"<init>.(Ljava/lang/String;)V"或者"<init>.(I)V"。$signatureOfThis可以指示将被呼叫并且针对其将生成字符串"<init>.(Ljava/lang/String;)V"或者"<init>.(I)V"的父类A的超级构造函数的类型。然后,在第7行中使用所生成的字符串来调用如以上在第1行至第12行中描述的新添加的构造函数以呼叫父类A的所选择的超级构造函数。按照这种方式,即使编译目标(例如,类B)的更新版本呼叫A的不同超级构造函数,表示以上的源代码第1行至第12行以及第1行至第9行的插入的字节码也使所编译的目标(例如,类B)的更新版本也能够使用本公开的热交换技术来执行A的适当超级构造函数,而不是冷交换或者完全失败。
在一些示例中,由软件开发人员对应用130中的源代码实施的结构变化可能不允许应用130在不重新启动应用130的情况下在测试环境系统364中执行更新的编译目标。例如,应用130可以在测试环境系统124中执行为一个或多个进程和/或线程,并且重新启动应用130可以包括在测试环境系统124中终止应用130的进程和线程。重新启动应用130可以包括终止应用130的所有进程和线程,并且随后发起执行应用130。这种结构变化的示例可以包括:在面向对象的应用中的类的层次结构中改变继承层次结构,但是许多其它示例是可能的。更一般地,不许可或者允许应用130在不重新启动应用130的情况下执行更新的对象限定144B的结构变化可以包括对不支持字节码注入或者许可修改编译目标的源代码的改变。
构建器模块108可以实施以下技术:该技术用于向测试环境系统364发送已经改变的编译目标和/或未编译目标的目标子集,并且利用所改变的目标使应用130能够在不重新对全新的应用程序包进行封装并且将新的应用程序包部署到测试环境系统364的情况下重新启动并且执行。这种技术可以称为“冷交换”。编译器114和/或封装模块358可以在表示应用130的应用程序包内插入代码或者修改一个或多个编译目标或者未编译目标,使得将应用130加载到存储器中,其中,按照反向时间顺序次序首先加载较新的编译目标和未编译目标。例如,如在图4中示出的,构建器模块108可以包括作为插入的代码的客户类加载器(classloader),该客户类加载器按照反向时间顺序次序首先加载较新的编译目标和未编译目标,或者客户类加载器可以被包括在系统运行时间138中。如果编译目标或者未编译目标的更新的版本已经被加载到存储器中,则可能不会将较旧的版本加载到存储器中,从而确保编译目标和未编译目标的较新版本被加载到存储器中。
为了提供冷交换,当测试环境系统364中的加载器(例如,图4中的加载器454)加载应用130时,加载器可以在较旧的编译目标和未编译目标之前搜索并且加载较新的编译目标和未编译目标。在一些示例中,将具有机器可执行代码的编译目标存储在测试环境系统124或者364的文件系统中的预定义位置或者目录中。预定义位置或者目录可以是相对目录或者绝对目录。编译器114和/或封装模块358可以将识别预定义位置或者目录的数据包括在用于应用130的应用程序包内。
为了进一步描述冷交换技术,构建器模块108可以最初构建用于应用130的应用程序包,该应用程序包包括如在图3中描述的目标集合112。编译器114和/或封装模块358可以在表示应用130的应用程序包内插入代码或者修改一个或多个编译目标或者未编译目标,使得应用130被加载到存储器中,其中,按照反向时间顺序次序首先加载较新的编译目标和未编译目标。测试环境系统364可以最初执行应用130,从而将一个或多个编译目标和/或未编译目标加载到存储器中。测试环境系统364可以将编译目标与机器可执行代码一起存储在测试环境系统364的由表示应用130的应用程序包指定的预定义位置或者目录中。
稍后,软件开发人员可以按照不允许应用130在需要不重新启动应用130的情况下在测试环境系统364中执行更新的编译目标的方式来更新用于应用130的源代码。构建器模块108可以将更新的源代码编译成如以上在图3中描述的热交换目标子集的一个或多个更新的编译目标,该一个或多个更新的编译目标包括标识符,诸如用于指示编译目标已经改变的$override。构建器模块108还可以将所更新的源代码编译成冷交换目标子集的一个或多个更新的编译目标,该一个或多个更新的编译目标基于源代码变化包括根据最初的以上在图3中描述的编译过程而不是后续的以上在图3中描述的编译过程来进行编译的编译目标和未编译目标。
在一些示例中,构建器模块108可以将热交换目标子集和/或冷交换目标子集发送至测试环境系统364。构建器模块108可以在应用130正在执行时发送热交换目标子集和/或冷交换目标子集。文本环境系统364可以将热交换目标子集目标和/或冷交换目标子集目标存储在最初在表示应用130的应用程序包中指定的预定义位置或者目录中。在一些示例中,构建器模块108可以利用热交换目标子集目标和/或冷交换目标子集目标来发送由测试环境系统364接收的命令。测试环境系统364可以基于命令(例如,指定冷交换操作)来终止应用130的一个或多个过程并且重新执行应用130。
在发起应用130的重新执行之后,用于应用130的加载器可以识别最初在表示应用130的应用程序包中指定的预定义位置或者目录中包括的编译目标的冷交换目标子集。加载器可以确定在预定义位置或者目录中存在编译目标的较旧版本和较新版本(例如,来自冷交换目标子集)。加载器可以基于指示较新的编译目标比较旧的编译目标更新的日期、时间戳、版本号或者其它标识符来识别编译目标的较新版本。基于该确定,加载器可以首先将较新的编译目标加载到存储器中。按照这种方式,应用130可以使用加载到存储器中的较新的编译目标来进行执行。
如上所述,因为在后续迭代中在测试环境系统364处部署更新的编译目标的目标子集而不是全新的应用程序包,所以冷交换可以减少执行后续构建和部署迭代所需的时间的量。由于应用130包括用于识别包括机器可执行代码的编译目标的预定义位置或者目录的数据,并且按照反向时间顺序次序来加载这种编译目标,因此,应用130可以重新启动,其中将最新的编译目标加载到存储器中以供执行。
在一些示例中,构建器模块108可以执行一种或多种补丁压缩技术。每次构建器模块108检测对源文件的编辑时,将这些变化编译成更新的编译目标,并且然后将更新的编译目标推送至装置,测试环境系统可以向应用120已知的预定义位置或者目录添加新的补丁文件(包括更新的编译目标)。即,每个补丁文件可以包括更新的编译目标的不同集合。在启动时,应用130将按照反向次序来向将用于应用130的所有补丁添加到其加载器(例如,图4中的加载器454),使得由加载器首先找到最新的编译的目标,并且因此由应用130加载该最新的编译的目标并且使用。然而,对于较长时间的迭代开发,这可能导致产生许多补丁,全部补丁都被添加到测试环境系统。这可能使应用130的在测试环境系统124处的后续执行花费更长时间,并且应用130可能运行得更慢。
为了避免这种情况,插入模块352和/或封装模块358可以向表示应用130的应用程序包添加执行补丁压缩的运行时代码。当在测试环境系统124处接收到新补丁(例如,更新的编译目标的集合)时,先前添加到应用程序包的补丁压缩运行时代码将执行补丁压缩。为了进行说明,对于每个补丁文件,应用130的补丁压缩运行时代码存储在补丁内包括的编译目标的索引。补丁压缩运行时代码能够按照反向次序来快速遍历通过补丁索引的集合,并且能够保持编译目标或者类可由用于应用130的加载器(例如,类加载器)通过给定补丁发现的追踪。在一些示例中,索引可以被存储在任何合适的数据结构中,诸如,图表、地图、列表等。在最新的补丁文件中,特定类型的每个类或者编译目标都是可用的。在先前补丁中,仅在以后补丁中也不是可用的特定类型的类或者编译目标是可访问的等。不具有任何类或者编译目标的任何补丁不会出现在以后的补丁中,可能不会被应用130使用,以及因此能够被去除。同样,应用130的补丁压缩运行时代码可以删除或者以其它方式去除不具有不存在于以后的补丁中的任何类或者编译目标的任何补丁。这可以在执行应用130时节省空间并且提高性能。实际上,这可以是有益的,因为对于用户而言,一遍一遍地对相同源文件进行多次编辑可能是典型的,并且在这种情况下,只需要在测试环境系统124处保存最后一个补丁。
作为附加性能改进,在Java或者其它类似语言中,通常存在内部类,即使这些内部类在相同的编译单元中,它们也显露出为单独的类。对编译单元的编辑发生在编译单元级别(源文件)而不是单独的类,这可以减少针对类重叠的检查的数目,但是还可以具有以下益处:如果用户去除了内部类,则以后的补丁将不会看到所去除的内部类,并且认为之前的补丁相关仅仅是因为其包括不存在于以后的补丁中的内部类参考。
建模器模块108可以实施以下技术:该技术用于向测试环境系统364发送已经改变的编译目标和/或未编译目标的目标子集,并且重新启动应用130的一个或多个线程(在不完全重新启动应用130的情况下,即,终止所有过程并且随后将执行初始化),以便执行改变的编译目标和/或未编译目标。这种技术可以称为“暖交换”。
在一些示例中,构建器模块108可以确定资源120中的一个或多个可能已经在构建迭代期间进行改变。例如,软件开发人员可能已经添加了或者更新了在应用130中包括的图像。因为该图像没有被编译器114编译但是被包括在目标集合112中,所以该图像可以是未编译目标。不是每次资源120中的一个或多个改变时都对应用130的应用程序包进行重新编译并且重新封装,构建器模块108可以实施“暖交换”技术,在该“暖交换”技术中,其中应用130可以在不完全重新启动应用130的情况下利用一个或多个改变的资源来进行更新。
作为暖交换的示例,如以上先前描述的,构建器模块108可以最初构建包括目标集合112的应用程序包,该目标集合112可以包括编译目标和未编译目标。例如,目标集合112可以包括未编译资源,诸如由应用130使用的图像。当最初在测试环境系统364中部署了应用程序包时,构建器模块108可以如以上描述的那样部署应用程序包。该应用程序包可以包括目标集合112,该目标集合112包括编译资源和未编译资源。测试环境系统364可以执行应用130并且将包括图像的一个或多个编译资源和未编译资源加载到存储器中。更具体地,如在图4中进一步示出的,测试环境(诸如,测试环境系统124)可以包括资源管理器,诸如,资源管理器460。资源管理器460可以是向在测试环境系统124处执行的应用提供一个或多个应用编程接口的模块。应用可以通过库458来直接或者间接地调用API以加载未编译目标,诸如,用于在应用130中显示或者使用的图像。在一些示例中,测试环境可以每个应用或者每个测试环境具有单个资源管理器实例。
稍后,软件开发人员可以修改图像或者用相同文件名称的不同图像来替换图像。软件开发人员可以提供使构建器模块108构建和部署应用130的用户输入。变化检测模块110可以确定原始图像已经被修改并且包括更新的图像作为构建器模块108可以将其发送至测试环境系统364的目标子集的部分。测试环境系统364可以接收目标子集。
在暖交换的一些示例中,资源被存储在测试环境系统124或者364的文件系统中的预定义位置或者目录中。预定义位置或者目录可以是相对目录或者绝对目录。针对资源的预定义位置或者目录可以与由机器可读代码组成的编译目标的预定义位置或者目录不同或者相同。在一些示例中,预定义位置可以由软件开发人员在模块或者应用中进行硬编码,或者可以将预定义位置从配置文件动态地加载到模块或者应用的变量中。如在图4中进一步图示和描述的,资源管理器可以加载未编译目标,诸如,来自预定义位置或者目录的资源。资源管理器可以基于指定在资源管理器或者应用程序包中包括的位置或者目录的数据来加载资源。例如,编译器114和/或封装模块358可以将识别预定义位置或者目录的数据包括在应用130的应用程序包内。
资源管理器可以执行为进程或者线程。在一些示例中,资源管理器可以是从应用130的另一进程或者线程分出的进程或者由应用130的另一进程或者线程创建的线程。在其它示例中,资源管理器可以是在应用130的执行之外发起的系统进程或者线程,但是该系统进程或者线程使用一种或多种进程间通信技术来与应用130通信。无论如何,当测试环境系统364接收到目标子集时,协调器模块将目标子集中的资源存储在协调器模块已知的暂时文件或者目录中。例如,如在图4中进一步描述的,协调器模块(例如,图4中的协调器459)可以从服务器接收资源并且将它们存储在名称与存储资源并且对资源管理器已知的预定义位置或者目录不同的暂时文件或者目录中。
协调器还可以接收在不完全重新启动应用130的情况下重新启动资源管理器的命令。基于该命令,协调器可以交换存储资源并且对资源管理器已知的预定义位置或者目录的名称以及存储更新的资源的暂时文件或者目录的名称。例如,协调器可以将存储资源并且对资源管理器已知的预定义位置或者目录重命名为存储更新的资源的暂时文件或者目录的名称,反之亦然。基于目录名称的交换,协调器可以向资源管理器发出信号或者其它指令以重新启动实施资源管理器的处理器或者线程。当资源管理器在不完全终止或者重新启动应用130的情况下重新启动时,资源管理器打开对资源管理器已知的目录,该目录现在包括更新的资源。新实例化的资源管理器可以参考更新的资源。在一些示例中,协调器可以使用映射来识别已经加载在存储器中的每个编译目标并且参考资源管理器。协调器更新对新实例化的资源管理器的任何这种参考,这包括对更新的资源的参考。协调器可以使用映射以更新这些参考,从而完全避免终止应用130。按照这种方式,应用130可以在不完全重新启动应用130的情况下展示或者以其它方式显示更新的资源。
在一些示例中,资源改变还触发代码改变。例如,拖动布局编辑器中的按钮用户界面元件可以仅编辑布局.xml文件,但是可以在按钮上设置新的并且唯一的“id”属性,诸如,@+id/button。一些资源系统(例如,Android)可以将@+id/button转换成特殊的R.id.button字段,并且在现有R字段上移动数个唯一id。在识别/参考资源的资源字段中的R比特的位置与这些新值相关联,所以构建器模块102还可以更新对R.type字段的所有代码参考。
在一些示例中,包括构建器模块108或者与构建器模块108通信的IDE可以包括“运行”图标,该“运行”图标在被选择时使构建器模块最初构建和部署应用程序包,或者如果在构建器模块最初构建和部署应用程序包之后选择该图标,则构建器模块108可以执行热交换和/或暖交换技术。在一些示例中,运行图标的外观可以从指示构建器模块将最初构建和部署应用程序包的第一视觉外观改变为构建器模块将执行热交换和/或暖交换技术的第二不同视觉外观。IDE还可以包括按照如针对“运行”图标描述的相似方式来操作和出现的“调试”图标,但是执行针对最初部署的应用调试操作或者执行使用热交换和/或暖交换的调试。
在一些示例中,构建器模块108可以包括验证器模块360和启发法362。验证器模块360可以确定对一个或多个编译目标的改变是否许可进行热交换或者暖交换或者需要使用冷交换。验证器模块360可以基于从变化检测模块110和/或启发法362接收到的数据来确定针对在更新的编译目标中进行的改变是否可以在测试环境系统364中使用热交换或者暖交换。
启发法362可以包括表示一个或多个条件的数据。每个条件可以指示是否能够在测试环境系统364处使用热交换或者暖交换。例如,如果改变在更新的编译目标的集合中的继承层次结构将不许可进行热交换,则启发法可以包括用于对在更新的编译目标的源代码或者字节码中的改变的继承层次结构测试的条件。如果验证器模块360确定更新的编译目标的改变的源代码或者字节码满足启发法362中的不能使用热交换或者暖交换的的条件,则验证器模块360可以向封装模块358发送数据,该数据使封装模块358在不能够使用热交换或者暖交换的目标集合或者目标子集内插入数据。如果验证器模块360确定更新的编译目标的改变的源代码或者字节码满足启发法362中不能该使用热交换或者暖交换的条件,则验证器模块360可以向部署模块365发送数据,以发送指示不能够使用热交换或者暖交换和/或应当将冷交换用于更新的目标集合的命令。启发法362可以由软件开发人员基于从测试环境364接收到的热交换或者暖交换数据的先前故障来配置、硬编码、或者学习。
图4是图示了根据本公开的一个或多个方面的作为配置为执行应用130的示例计算装置的测试环境系统124的框图。图4仅图示了测试环境系统124的一个特定示例,并且可以存在测试环境系统124的其它示例。图4的测试环境系统124可以包括在图1的测试环境系统124中包括的组件的子集,并且可以包括未在图4中示出的附加组件。
在图4的示例中,测试环境系统124可以是移动计算装置,诸如,智能电话或者平板,但是在其它示例中,测试环境系统124可以是能够执行本公开的技术的台式计算机、膝上型计算机、服务器计算装置、虚拟机、仿真器、或者任何其它计算装置或者计算装置的模拟器。在其中测试环境系统124是仿真器或者虚拟机的示例中,可以在具有针对图4的硬件描述的类似功能的软件中对针对图4中的测试环境124描述的硬件组件进行仿真。测试环境系统124可以是配置为执行一个或多个应用程序包、模块或者任何其它计算机软件的用户计算装置。
如在图4的示例中示出的,测试环境系统124包括一个或多个处理器440、一个或多个输入组件442、一个或多个输出组件444、一个或多个通信组件446、和一个或多个存储组件448。测试环境系统124的存储组件448包括但不限于:应用130、对象状态134、原始对象限定144A、更新的对象限定144B、先前容器452A、原始资源136A、当前容器452B、更新的资源136B、UI模块128、系统运行时间138、加载器454、服务器456、库458、和资源管理器460。
通信信道450可以将组件440、442、444、446、和448中的每一个互连以供进行组件间通信(物理地、通信地、和/或可操作地)。在一些示例中,通信信道450可以包括有线和/或无线系统总线、有线和/或无线网络连接、进程间通信数据结构、或者用于在测试环境系统124的内部组件之间传送数据的任何其它方法。
测试环境系统124的一个或多个输入组件442可以代表测试环境系统124的各种其它组件和模块接收输入。例如,输入组件442可以接收来自测试环境系统124的用户的触摸输入。输入的示例是触觉输入、音频输入、和视频输入。在一个示例中,测试环境系统124的输入组件442包括:用于检测来自人类或者机器的输入的存在敏感显示器、触敏屏幕、鼠标、键盘、语音响应系统、摄像机、麦克风或者任何其它类型的装置。
构建器测试环境系统124的一个或多个输出组件444可以生成用于其它计算装置、系统、和测试环境系统124的用户接收的输出。例如,一个或多个输出组件444可以呈现由应用130生成的用户界面。输出的示例是触觉输出、音频输出、和视觉输出。在一些示例中,测试环境系统124的输出组件444包括:用于向人类或者机器生成输出的存在敏感显示器、声卡、视频图形适配卡、扬声器、阴极射线管(CRT)监视器、液晶显示器(LCD)、发光二极管(LED)显示器、有机发光二极管(OLED)显示器、或者任何其它类型的装置。
构建器测试环境系统124的一个或多个通信单元446可以通过发送和/或接收在一个或多个网络上的网络信号来经由一个或多个有线和/或无线网络与外部装置进行通信。通信单元446的示例包括:能够发送和/或接收信息的网络接口卡(例如,诸如以太网卡)、光学收发器、射频收发器、GPS接收器、或者任何其它类型的装置。通信单元446的其它示例可以包括:短波无线电、蜂窝数据无线电、无线网络无线电、以及通用串行总线(USB)控制器。
一个或多个处理器440可以在测试环境系统124内实施功能和/或执行指令。例如,在测试环境系统124上的处理器440可以接收并且执行由执行模块130(以及模块130的相对应数据和模块)、模块128和模块138(以及模块138的相对应数据和模块)的功能的存储组件448存储的指令。由处理器440执行的这些指令可以使测试环境系统124在程序执行期间将信息存储在存储组件448内。处理器440可以执行模块130(以及模块130的相对应数据和模块)、模块128和模块138(以及模块138的相对应数据和模块)的指令,以使模块130(以及模块130的相对应数据和模块)、模块128和模块138(以及模块138的相对应数据和模块)执行本公开的技术。即,根据本公开的技术,模块130(以及模块130的相对应数据和模块)、模块128和模块138(以及模块138的相对应数据和模块)可以由处理器440操作,以执行测试环境系统124的各种动作或者功能。
在构建器测试环境系统124内的一个或多个存储组件448可以存储信息以供在测试环境系统124的操作期间进行处理(例如,测试环境系统124可以存储由模块130(以及模块130的相对应数据和模块)、模块128和模块138(以及模块138的相对应数据和模块)在执行期间访问的数据)。在一些示例中,存储组件448是暂时存储器,这意旨存储组件448的主要目的不是长期存储。可以将在测试环境系统124上的存储组件448配置用于作为易失性存储器来短期存储信息,并且因此,如果该存储组件被断电,则不会保留已存储的内容。易失性存储器的示例包括:本领域已知的随机存取存储器(RAM)、动态随机存取存储器(DRAM)、静态随机存取存储器(SRAM)、和其它形式的易失性存储器。
在一些示例中,存储组件448还包括一种或多种计算机可读存储介质。可以将存储组件448配置为比易失性存储器存储更大量的信息。可以将存储组件448进一步配置用于作为非易失性存储器空间来长期存储信息,并且在通电/断电周期之后保留信息。非易失性存储器的示例包括:磁硬盘、光盘、软盘、闪速存储器、或者电可编程存储器(EPROM)或者电可擦除可编程(EEPROM)存储器的形式。存储组件448可以存储与模块130(以及模块130的相对应数据和模块)、模块128和模块138(以及模块138的相对应数据和模块)相关联的程序指令和/或信息(例如,数据)。
模块130(以及模块130的相对应数据和模块)、模块128和模块138(以及模块138的相对应数据和模块)可以使用软件、硬件、固件、或在测试环境系统124中驻留并且在测试环境系统124上执行的硬件、软件、和/或固件的混合来执行操作。测试环境系统124可以利用单个或者多个处理器(诸如,处理器440)来执行模块130(以及模块130的相对应数据和模块)、模块128和模块138(以及模块138的相对应数据和模块)。测试环境系统124可以将模块130(以及模块130的相对应数据和模块)、模块128和模块138(以及模块138的相对应数据和模块)中的一个或多个执行为在如在图3中示出的构建器计算装置102的底层硬件组件上执行的虚拟机(VM)。在一些示例中,可以将模块130(以及模块130的相对应数据和模块)、模块128和模块138(以及模块138的相对应数据和模块)布置为可经由网络云访问的一种或多种网络服务。
测试环境系统124是图1的测试环境系统124的更详细的示例。相较于由图1中的测试环境系统124执行的操作,测试环境系统124可以执行相同的、附加的、或者更少的操作。根据本公开的技术,测试环境系统124可以最初接收表示应用130的应用程序包。例如,图3的部署模块356可以与图4的服务器456建立连接。如在图4中示出的,测试环境系统124可以包括系统运行时间138。系统运行时间138可以包括加载器454、服务器456、库458、和资源管理器460。在一些示例中,系统运行时间138通常提供应用(诸如,应用130)可以使用以在测试环境系统124处执行的服务和库的集合。例如,服务器456可以提供用于从测试环境系统124接收应用程序包、目标集合和子集、或者任何其它信息的服务。服务器456可以实施一种或多种通信协议,诸如,USB、HTTP、TCP/IP或者用于与一个或多个其它计算装置交换信息的任何其它合适的协议。
在接收到用于应用130的应用程序包之后,服务器456可以调用加载器454的一个或多个功能,以执行应用130的一个或多个编译目标(例如,对象限定)。例如,除了应用程序包之外,服务器456可以接收服务器456可以执行或者转发给测试环境系统124内的其它组件的一个或多个命令。作为示例,服务器456可以与应用程序包一起接收命令以执行应用130。因此,服务器456可以发送或者使用用于使加载器454执行应用130的一个或多个编译目标的命令。
在一些示例中,加载器454将编译目标加载到存储器中。在一些示例中,加载器454可以表示多个加载器,其中,每个加载器负责将不同的编译目标加载到存储器中。对于特定编译目标,加载器454可以对由编译目标使用的相对应库458进行定位并且将任何这种库加载到存储器中,使得库可被编译目标访问。在一些示例中,每个应用可以具有一个或多个加载器,这些加载器可以被包括在系统运行时间138中或者应用本身内。在图4的示例中,加载器454可以最初将原始对象限定144A加载到具有来自库458的相对应库的存储器中。原始对象限定144A可以是由包括在图1至图3中描述的附加程序逻辑的编译器114进行编译的USER类,诸如,在以下伪代码中的第2粗体行至6粗体行:
当最初执行应用130时,$change变量为空或者未初始化,因为尚未在测试环境系统124处对更新的USER类进行编译和部署。应用130可以使对象限定144A的多个实例实例化,其中将用于对象限定144A的每个实例的状态信息存储为对象状态134。同样,原始对象限定144A可以对对象限定144A的多个不同实例的状态信息执行操作。
稍后,当应用130在测试环境系统124中执行时,软件开发人员可以修改用于setFirstName(String first)方法的源代码。如在图1至图3中描述的,构建器模块108可以确定用于setFirstName(String first)方法的源代码已经改变。构建器模块108可以注入字节码或者以其它方式修改更新的编译目标以将后缀$override添加到现有的USER类名称,以指示在USER类内(具体地,在setFirstName(String first)内)的程序逻辑已经改变。如在图1至3中描述的,部署模块356可以向测试环境系统124发送改变的编译目标和未编译目标的子集作为目标子集,而不是发送表示应用130的应用程序包中的整个目标集合。
在图4中,服务器456最初接收目标子集。服务器456还可以接收指示目标环境系统124在应用130内应用更新的编译和未编译的目标的命令。基于该命令,服务器456将目标子集发送至加载器454。基于该命令,加载器454可以利用与原始对象限定144A的名称相匹配的相同名称和/或类型来识别子集中的编译目标。加载器454可以将编译目标(例如,更新的对象限定144B)加载到存储器中。在将更新的对象限定144B加载到存储器中之后,加载器454可以确定原始对象限定144A和更新的对象限定144B具有相同名称和/或类型。基于该确定,加载器454可以确定更新的对象限定144B的存储器位置或者地址,并且将原始对象限定144A的$change变量设置为更新的对象限定144B的存储器位置或者地址。
在将原始对象限定144A的$change变量更新为更新的对象限定144B的存储器位置或者地址之后的较晚时间处,应用130可以调用USER类的setFirstName(String first)方法。当调用USER类的setFirstName(String first)方法时,测试环境系统124最初测试条件if($changeLocal!=null)以确定$changeLocal是否包括USER类的更新版本的存储器地址。由于加载器454先前将原始对象限定144A的$change变量设置为更新的对象限定132的存储器位置或者地址,因此该条件解析为真。因此,文本环境系统124执行程序逻辑$changeLocal.access$dispatch(($changeLocal,“setFirstName(String first)”,first)。
该access$dispatch()方法包括接受自变量($changeLocal,“setFirstName(String first)”,first)的分配器程序逻辑。该调度器程序逻辑基于在$changeLocal中包括的参考来访问更新的对象限定144B。在访问更新的对象限定144B之后,调度器使用自变量first来执行名称为“setFirstName(String first)”的方法。更新的对象限定144B包括由软件开发人员提供给setFirstName(String first)方法的更新的程序逻辑,并且因此测试环境系统124执行更新的程序逻辑。因为调度器程序逻辑能够在应用130执行时使用$changeLocal变量来访问更新的编译目标,所以可以在不终止应用模块130的执行的情况下测试和观察更新的编译目标的功能变化。由于应用模块130的执行还未终止,因此用于现有对象实例的对象状态134可以保持在存储器中是可访问的。同样,能够使用现有对象状态来测试和观察对更新的编译目标的改变。
如在图3中描述的,由软件开发人员对应用130中的源代码实施的结构变化可能不允许应用130在不重新启动应用130的情况下在测试环境系统124中执行更新的编译目标。不许可或者允许应用130在不重新启动应用130的情况下执行更新的对象限定144B的结构变化可以包括对不支持字节码注入或者许可对编译目标进行修改的源代码的改变。在这种示例中,测试环境系统124可以实施一种或多种冷交换技术。
在图4的示例中,服务器456可以最初从构建器计算系统102接收用于应用130的应用程序包。图3的编译器114和/或封装模块358可能已经修改了一个或多个编译或者未编译目标或者可能已经在表示应用130的应用程序包内插入代码,使得应用130被加载到存储器中,其中按照反向时间顺序次序首先加载较新的编译目标和未编译目标。作为示例,加载器454可以是先前在应用程序包中包括的客户类加载器,该客户类加载器按照反向时间顺序次序首先加载较新的编译目标和未编译目标。在一些示例中,如果编译或者未编译目标的更新的版本已经被加载到存储器中,则加载器454可以不将较旧的版本加载到存储器中,从而确保编译目标和未编译目标的较新版本被加载到存储器中。
当由测试环境系统124中的加载器454加载应用130时,加载器454可以在较旧的编译目标和未编译目标之前搜索并且加载较新的编译目标和未编译目标。可以将具有机器可执行代码的编译目标存储在测试环境系统124的文件系统中的预定义位置或者目录中。预定义位置或者目录可以是相对目录或者绝对目录。如在图3中描述的,编译器114和/或封装模块358可以将识别预定义位置或者目录的数据包括在应用130的应用程序包内。
稍后,软件开发人员可以按照不允许应用130在不重新启动应用130的情况下在测试环境系统124中执行更新的编译目标的方式来更新用于应用130的源代码。图3的构建器模块108可以将更新的源代码编译成如以上在图3中描述的热交换目标子集的一个或多个更新的编译目标,该一个或多个更新的编译目标包括标识符,诸如,用于指示编译目标已经改变的$override。图3的构建器模块108还可以将更新的源代码编译成冷交换目标子集的一个或多个更新的编译目标,该一个或多个更新的编译目标基于源代码变化包括根据初始的以上在图3中描述的编译过程而不是后续的以上在图3中描述的编译过程来进行编译的编译目标和未编译目标。
服务器456可以在应用130正在执行时从构建器模块108接收热交换目标子集和/或冷交换目标子集。协调器模块459可以从服务器456接收热交换目标子集和/或冷交换目标子集,并且将热交换目标子集和/或冷交换目标子集目标存储最初在表示应用130的应用程序包中指定的预定义位置或者目标中。在一些示例中,可以在协调器459中对识别预定义位置或者目录的数据进行硬编码或者由协调器459来确定识别预定义位置或者目录的数据,或者将识别预定义位置或者目录的数据从配置文件动态地加载到协调器459的变量中。
在一些示例中,服务器456可以利用热交换目标子集目标和/或冷交换目标子集目标来从构建器计算系统102接收命令。测试环境系统124可以基于命令(例如,指定冷交换操作)来终止应用130的一个或多个过程并且重新执行应用130。在发起应用130的重新执行之后,加载器454可以识别最初在表示应用130的应用程序包中指定的预定义位置或者目录中包括的编译目标的冷交换目标子集。加载器454可以确定在预定义位置或者目录中存在编译目标的较旧版本和较新版本(例如,来自冷交换目标子集)。加载器454可以基于指示较新的编译目标比较旧的编译目标较新的日期、时间戳、版本号或者其它标识符来识别编译目标的较新版本。基于该确定,加载器可以首先将较新的编译目标加载到存储器中。按照这种方式,应用130可以使用加载到存储器中的较新的编译目标来进行执行。
如上所述,冷交换可以减少执行后续构建和部署迭代所需的时间的量,因为在后续迭代中,在测试环境系统364处部署更新的编译目标的目标子集而不是整个应用程序包。由于应用130、加载器454和/或协调器459包括用于识别包括机器可执行代码的编译目标的预定义位置或者目录的数据,并且按照反向时间顺序次序来加载这种编译目标,因此应用130可以重新启动,其中将最新的编译目标加载到存储器中以供执行。
如在图3中描述的,建模器模块108可以实施以下技术:该技术用于向测试环境系统124发送已经改变的编译目标和/或未编译目标的目标子集,并且重新启动应用130的一个或多个线程(在不完全重新启动应用130的情况下,即,终止所有过程并且随后将执行初始化)以便执行改变的编译目标和/或未编译目标。这种技术可以称为“暖交换”。作为暖交换的示例,图3的构建器模块108可以最初构建包括目标集合112的应用程序包,该目标集合112可以包括编译目标和未编译目标。例如,目标集合112可以包括未编译资源,诸如,由应用130使用的图像。当最初在测试环境系统142中部署了应用程序包时,服务器456可以从构建器计算系统108接收应用程序包。
加载器454可以将一个或多个编译资源加载到存储器中,并且资源管理器460可以将未编译目标和/或资源(包括图像)加载到存储器中。如在图3中描述的,资源管理器460可以是向在测试环境系统124处执行的应用提供一个或多个应用编程接口而使得应用可以使用资源的模块。应用可以通过库458来直接或者间接地调用API以加载未编译目标,诸如用于显示的图像。
稍后,软件开发人员可以修改图像或者用相同文件名称的不同图像来替换图像。软件开发人员可以提供使图3的构建器模块108构建和部署应用130的用户输入。例如,如在图3中描述的,变化检测模块110可以确定原始图像已经被修改并且包括更新的图像作为构建器模块108可以将其发送至测试环境系统124的目标子集的部分。服务器456可以接收目标子集。
协调器459可以从服务器456接收目标子集并且将资源存储在测试环境系统124的文件系统中的预定位置或者目录中。预定义位置或者目录452B可以是相对目录或者绝对目录。用于资源的预定义位置或者目录452B可以与由机器可读代码组成的编译目标的预定义位置或者目录不同或者相同。资源管理器460可以加载未编译目标,诸如,来自预定义位置或者目录的资源。资源管理器460可以基于指定在资源管理器或者应用程序包中包括的位置或者目录460的数据来加载资源。
资源管理器460可以执行为进程或者线程。如在图3中描述的,资源管理器460可以是从应用130的另一进程或者线程分出的进程或者由应用130的另一进程或者线程创建的线程。在其它示例中,资源管理器460可以是在应用130的执行之外发起的系统进程或者线程,但是该系统进程或者线程使用一种或多种进程间通信技术来与应用130通信。
当服务器456接收到目标子集时,协调器模块459将资源(诸如,更新的图像)存储在暂时文件或者目录中的目标子集中。例如,协调器模块459可以从服务器接收资源并且将它们存储在具有与存储这些资源并且对资源管理器460已知的预定义位置或者目录452B不同的名称的暂时文件或者目录中。协调器还可以接收在不完全重新启动应用130的情况下重新启动资源管理器的命令。基于该命令,协调器459可以将存储更新的资源的暂时文件或者目录的名称更新为存储资源452B并且对资源管理器460已知的预定义位置或者目录的名称。
作为示例,在重命名操作之前,先前目录452A可以具有对资源管理器460已知的预定义位置或者目录的名称。先前目录452A可以包括原始资源136A,诸如用于应用的原始图像。协调器459可以接收目标子集中的更新的图像,并且将更新的图像存储在目录452B中,该目录452B包括更新的资源136B,诸如更新的图像。目录452B可以具有不同于对资源管理器460已知的预定义位置或者目录的名称的名称。协调器模块459可以将存储更新的资源136B的暂时文件或者目录452B的名称设置为存储原始资源136A的预定义位置或者目录452A的名称。按照这种方式,如果重新启动了资源管理器460,则资源管理器460将从当前目录452B加载更新的资源136B,该当前目录452B具有对资源管理器460已知的预定义位置或者目录的名称。
基于当前目录452B的名称的更新,协调器模块459可以向资源管理器460发出信号或者其它指令以重新启动实施资源管理器460的进程或者线程。当资源管理器460重新启动时,在不完全终止或者重新启动应用130的情况下,资源管理器460打开对资源管理器460已知的目录452B,该目录452B现在包括更新的资源136B。新实例化的资源管理器460可以参考更新的资源136B。在一些示例中,协调器模块459可以使用映射以识别参考资源管理器460的存储器中的每个编译目标(例如,原始对象限定144A和/或更新的对象限定144B)。协调器模块459更新对新实例化的资源管理器460的参考,其包括对更新的资源136B的参考。协调器459可以使用映射以更新这些参考,从而避免完全终止应用130。按照这种方式,应用130可以在不完全重新启动应用130的情况下展示或者以其它方式显示更新的资源136B。
如在图3中描述的,构建器模块108可以将补丁压缩程序逻辑插入到应用130中。在应用130中执行补丁压缩程序逻辑时,补丁压缩程序逻辑可以确定至少第一编译目标和至少部分地基于第一编译目标的第二编译目标存储在测试环境系统中,诸如存储在对应用130已知的目录或者位置中。对于每个编译目标,应用130可以生成指示编译目标的相应版本的相应索引。按照这种方式,编译的USER类的第一版本可以具有表示第一版本的第一索引,并且编译的USER类的第二版本可以具有表示第二版本的第二索引。当执行补丁程序压缩程序逻辑时,应用130可以确定编译的USER类的第一版本比编译的USER类的第二版本较新,其中,第一版本由第一索引指示,并且第二版本由第二索引指示。应用130可以至少部分地基于第一版本比第二版本较新来删除编译的USER类的第二不那么新的版本。在一些示例中,如果存在编译的USER类的附加的不那么新的版本,则应用130还可以删除这种不那么新的版本。
如在图3中描述的,在一些实例中,热交换或者暖交换可能由于并入到更新的编译目标中的源代码中的结构变化而是不可能的。在这种示例中,在测试环境系统124处执行热交换或者暖交换可能失败。应用协调器459可以从热交换或者暖交换恢复到冷交换,而不是允许使应用130按照意外或者未处理的方式崩溃。例如,如果测试环境124接收到用于执行热交换或者暖交换操作的命令并且应用130抛出或者以其它方式引出未处理的错误或者异常,则协调器459可以捕获或者接收异常或者错误,并且可以使用冷交换来使更新的编译目标应用于应用130。如在图3中描述的,在一些示例中,构建器计算系统可以向测试环境系统124发送编译目标的热交换目标子集和/或冷交换目标子集。按照这种方式,如果协调器459确定应用热交换目标子集已经失败,则协调器459能够应用冷交换目标子集。
图5是图示了根据本公开的技术的配置为执行热交换技术的构建器计算系统的示例操作的流程图。仅出于说明之目的,以下在图1和图3的构建器计算系统102的上下文内描述示例操作。
构建器计算系统102可以接收使构建器计算系统102将用于应用130的资源代码的集合编译成编译目标的集合的初始用户输入(500)。例如,软件开发人员可以选择图标或者输入命令,该图标或者命令使构建器计算系统102最初将用于应用130的源代码编译成编译目标的集合。在对源代码进行编译之后,如在图1至图4中描述的,构建器计算系统102可以将字节码注入到编译目标中(502)。字节码可以包括指示编译目标的更新版本是否被加载在测试环境的存储器中的条件语句。
构建器计算系统102可以将编译目标的集合封装到应用程序包中,该编辑目标集合中的一个或多个编译目标包括注入的字节码。构建器计算系统102可以对应用程序包执行一项或多项附加操作,诸如,签名、压缩、对齐或者任何其它操作。构建器计算系统102可以部署编译目标的集合作为由构建器计算系统102发送至测试环境系统的应用程序包(504)。在一些示例中,部署编译目标的集合可以包括:发送使测试环境安装应用程序包的命令。
构建器计算系统102可以接收修改源代码的子集的后续用户输入。在由用户进行修改之后,用户可以提供使构建器计算系统102将源代码的至少所述子集编译成编译目标的更新子集的用户输入(506)。构建器计算系统102可以将指示符(诸如,字符串或者其它字节码)注入到更新的编译目标中(508)。指示符可以指示更新的编译目标相对于与更新的编译目标相对应的原始编译目标发生了变化(例如,基于更新的编译目标的类型与原始编译目标相同)。构建器计算系统102可以部署编译目标的更新子集以在不终止应用130的执行的情况下基于更新的子集来更新应用130(510)。例如,构建器计算系统102可以将更新的子集发送至测试环境。在一些示例中,构建器计算系统102可以发送使测试环境在不重新启动应用130的情况下更新应用130的命令。
图6是图示了根据本公开的技术的配置为执行热交换技术的测试环境系统的示例操作的流程图。仅出于说明之目的,以下在图4的测试环境系统124的上下文内描述示例操作。
测试环境系统124可以最初从构建器计算系统102接收编译目标的集合。例如,构建器计算系统102可以将源代码的集合编译成编译目标,汇编其它未编译目标,以及将编译目标和未编译目标封装到应用程序包中。构建器计算系统120可以将该应用程序包发送至测试环境系统124。构建器计算系统120可以将编译目标的集合的原始编译目标加载到测试环境系统的存储器中(602)。在图6的示例中,原始编译目标可以包括指示编译目标的更新版本是否被加载在测试环境的存储器中的条件语句。
测试环境系统124可以在原始编译目标被存储在存储器中时来接收编译目标的更新子集(604)。例如,软件开发人员可能已经修改了用于原始编译目标的源代码,并且构建器计算系统102可能已经重新将修改过的源编译成更新的编译目标。更新的编译目标可以包括指示更新的编译目标相对于原始编译目标变化的指示符。测试环境系统124可以将原始编译目标中的变量设置为更新的编译目标在测试环境系统的存储器中的位置(605)。
测试环境系统124可以确定编译目标包括指示更新的编译目标相对于原始编译目标变化的指示符(606)。例如,应用130可以调用原始编译目标的功能或者方法。指示编译目标的更新版本是否被加载在测试环境的存储器中的条件语句可以被解析为真,因为该条件语句包括当前被设置为更新的编译目标的位置的变量。响应于确定更新的编译目标相对于编译目标的原始版本变化,测试环境可以在不终止应用130的执行的情况下响应于对原始编译目标中的程序逻辑(诸如,方法或者功能)的调用而执行更新的编译目标(608)。
图7是图示了根据本公开的技术的配置为执行冷交换技术的构建器计算系统的示例操作的流程图。仅出于说明之目的,以下在图1和图3的构建器计算系统102的上下文内描述示例操作。
构建器计算系统102可以接收使构建器计算系统102将源代码的集合编译成实施应用130的应用程序包的编译目标的集合的初始用户输入(700)。例如,构建器计算系统102可以将源代码编译成编译目标,汇编其它未编译目标,以及将编译目标和未编译目标封装到应用程序包中。构建器计算系统102可以通过将应用程序包发送至执行应用程序包的内容的测试环境来部署应用程序包(702)。
软件开发人员可以稍后编辑源代码的子集。软件开发人员可以提供使构建器计算系统102对源代码的集合的至少所述子集编译成编译目标的更新子集的用户输入(704)。构建器计算系统可以在不发送包括编译目标的更新子集的另一应用程序包情况下将编译目标的更新子集部署到测试环境,而不是重新将所有源代码都编译成编译目标,汇编所有其它未编译目标,以及将编译目标和未编译目标封装到应用程序包中(706)。按照这种方式,可以通过仅将编译目标的更新子集发送至测试环境来避免用于生成、发送、以及安装另一应用程序包的附加处理步骤。
图8是图示了根据本公开的技术的配置为执行冷交换技术的测试环境系统的示例操作的流程图。仅出于说明之目的,以下在图4的测试环境系统124的上下文内描述示例操作。
在图8中,测试环境系统124可以接收应用130的编译目标的集合(800)。例如,构建器计算系统102可能已经响应于接收到用户输入而生成了编译目标的集合。在一些示例中,构建器计算系统102将编译目标的集合封装到表示应用130的应用程序包中。应用程序包可以包括编译目标和未编译目标。测试环境系统124可以将编译目标的集合中的一个或多个编译目标加载到测试环境系统的存储器中,使得应用130正在执行(802)。
测试环境系统124可以稍后在原始编译目标存储到存储器中时接收编译目标的集合的更新子集(804)。例如,软件开发人员可以修改应用130的源代码并且提供使构建器计算系统102将修改过的源代码编译成编译目标的更新集合的用户输入。构建器计算系统102可以将编译目标的更新集合发送至测试环境系统124。
在接收到编译目标的更新集合之后,测试环境系统124可以将编译目标的更新子集存储在由应用130已知的目标环境的预定义文件系统位置中(806)。例如,应用130可以包括识别表示预定义文件系统位置的绝对目录或者相对目录的数据。应用130可以确定其无法利用编译目标的更新子集来进行更新,除非重新启动应用130。因此,测试环境系统124可以使应用130重新启动。即,至少部分地基于更新的编译目标被包括在目标环境的预定义文件系统位置中,测试环境系统124可以重新启动应用以利用编译目标的更新子集来执行(810)。例如,因为测试环境系统124访问由应用130已知的目标环境的预定义文件系统位置,所以测试环境系统124可以执行在预定义文件系统位置中包括的编译目标的更新子集。
图9是图示了根据本公开的技术的配置为执行暖交换技术的构建器计算系统的示例操作的流程图。仅出于说明之目的,以下在图1和图3的构建器计算系统102的上下文内描述示例操作。
如在图9中示出的,构建器计算系统102可以接收使构建器计算系统102将资源的集合汇编到实施应用130的应用程序包的未编译目标的集合中的初始用户输入(900)。例如,初始用户输入可以使构建器计算系统102最初生成用于应用130的应用程序包。该应用程序包可以包括目标集合(该目标集合包括资源的集合),并且还可以包括基于源代码编译的一个或多个编译目标。
构建器计算系统102可以部署应用程序包以发起应用130的执行(902)。例如,目标环境系统124可以从构建器计算系统102接收应用程序包。目标环境系统124可以将应用程序包的资源存储在由应用130已知的目标环境的预定义文件系统位置中。稍后,在对资源的至少所述子集进行修改之后,构建器计算系统102可以接收使构建器计算系统102汇编基于资源的子集的资源的集合的更新子集的后续用户输入(904)。在不发送包括资源的集合的更新子集的另一应用程序包的情况下,构建器计算系统102可以部署资源的集合的更新子集以基于更新的子集来更新应用(940)。按照这种方式,在不重新生成具有用于应用130的完整目标集合的新应用程序包的情况下,构建器计算系统102可以发送更新的资源。
在一些示例中,将资源的更新子集存储在目标环境的暂时文件系统位置中。部署更新的子集使目标环境系统124的协调器组件将暂时文件系统位置的名称更新为由应用130已知的目标环境的预定义文件系统位置的名称。至少部分地基于在目标环境的预定义文件系统位置中包括的资源的更新子集,应用130可以重新启动以利用资源的更新子集来执行。
图10是图示了根据本公开的技术的配置为执行暖交换技术的测试环境系统的示例操作的流程图。仅出于说明之目的,以下在图4的测试环境系统124的上下文内描述示例操作。
测试环境系统124可以最初接收应用130的资源的集合(1000)。例如,构建器计算系统102可以最初生成用于应用130的应用程序包,该应用程序包由目标集合组成,其中目标集合包括资源的集合和基于源代码的一个或多个编译目标。测试环境系统124可以将资源中一个或多个的资源加载到测试环境系统的存储器中(1002)。例如,测试环境系统124可以将图像加载到存储器中,使得应用130可以在图形用户界面中显示图像。
稍后,软件开发人员可以修改图像或者将一个图像的内容替换为另一图像的内容,同时保持相同的文件名。软件开发人员可以提供使构建器计算系统102汇编包括更新的图像的资源的更新子集的用户输入。在汇编了资源的更新子集之后,构建器计算系统102可以将资源的更新子集发送至测试环境系统124。测试环境系统124可以接收资源的子集(1004)。响应于接收到资源的子集,测试环境系统124可以将资源的子集存储在目标环境系统124的暂时文件系统位置中(1006)。
测试环境系统124可以确定,在不重新启动向应用130提供对资源的访问的资源管理器的情况下,无法利用资源的更新子集来更新应用130(1008)。因此,测试环境系统124可以将暂时文件系统位置更新为由应用130已知的目标环境的预定义文件系统位置(1010)。例如,可以在应用或者系统运行时间的一个或多个组件内对由应用已知的预定义文件系统位置进行硬编码,或者可以将由应用已知的预定义文件系统位置从配置文件加载到应用或者系统运行时间的一个或多个组件中。在将暂时文件系统位置更新为由应用已知的目标环境的预定义文件系统位置之后,测试环境系统124可以在不终止应用130的情况下重新启动资源管理器,以至少部分地基于在目标环境系统124的预定义文件系统位置中包括资源的更新子集来加载资源的更新子集(1012)。
示例1:一种方法,包括:响应于接收到使构建器计算系统将用于应用的源代码的集合编译成编译目标的集合的初始用户输入,由该构建器计算系统,部署编译目标的集合以发起应用的执行,其中,将源代码的集合的子集编译成编译目标的集合的初始子集;在对源代码的集合的至少所述子集进行修改之后,在构建器计算系统处接收使构建器计算系统将该源代码的集合的至少所述子集编译成编译目标的集合的更新子集的后续用户输入;以及响应于确定更新子集与初始子集不同,在不终止应用的执行的情况下部署编译目标的集合的更新子集以更新应用。
示例2:根据示例1的方法,进一步包括:避免部署编译目标的集合中的其它编译目标以更新应用,其中,该其它编译目标未包括在编译目标的集合的更新子集中。
示例3:根据示例1至2中任一项的方法,其中,应用正在测试环境中执行,其中,测试环境是在构建器计算系统处执行的仿真器、构建器计算系统的目录、或者能够操作地耦合至构建器计算系统的远程计算装置中的至少一个。
示例4:根据示例1至3中任一项的方法,其中,该应用的更新参照编译目标的集合的更新子集的编译目标更新了编译目标的集合的初始子集的编译目标,其中,在该应用的执行期间并且在部署编译目标的集合的更新子集之前,将编译目标的集合的初始子集的编译目标存储在测试环境的存储器中。
示例5:根据示例1至4中任一项的方法,进一步包括:由构建器计算系统,将表示条件语句的字节码注入到编译目标的集合中的至少一个编译目标中,其中,在表示应用中的功能的程序逻辑的字节码之前将字节码注入到编译目标的集合中的所述至少一个编译目标内,其中,该条件语句指示功能的更新版本是否被加载在测试环境的存储器中;以及响应于条件语句被满足,由构建器计算系统,将调用功能的更新版本的字节码注入到编译目标的集合中的所述至少一个编译目标中。
示例6:根据示例1至5中任一项的方法,进一步包括:响应于将源代码的集合的至少所述子集编译成编译目标的集合的更新子集,由构建器计算装置,更新该编译目标的集合的更新子集的编译目标的名称、在编译目标的集合的更新子集的编译目标内的变量的名称、或者在编译目标的集合的更新子集的编译目标内的功能的名称,其中,该更新的名称指示编译目标的集合的更新子集的编译目标相对于编译目标的先前版本发生了变化。
示例7:根据示例1至6中任一项的方法,其中,由构建器计算系统,部署编译目标的集合以发起应用的执行进一步包括:将编译目标的集合封装到表示应用的第一应用程序包中并且将应用程序包发送至测试环境,以及其中,部署编译目标的集合的更新子集以基于编译目标的集合的更新子集来更新应用进一步包括:在不将编译目标的集合的更新子集封装到表示应用的第二应用程序包中的情况下,将编译目标的集合的更新子集发送至测试环境。
示例8:根据示例1至7中任一项的方法,进一步包括:响应于确定在源代码的集合的子集中的类包括至少两个超级构造函数:由该构建器计算装置,注入表示调用新构造函数的程序逻辑的字节码的第一集合;并且由该计算装置,注入表示新构造函数的字节码的第二集合,其中,新构造函数至少部分地基于从字节码的第一集合接收到的参数来调用两个超级构造函数中的至少一个超级构造函数。
示例9:一种计算装置,包括:一个或多个计算机处理器;以及存储器,该存储器包括指令,该指令在由一个或多个计算机处理器执行时使所述一个或多个处理器执行示例1至8的方法中的任何方法。
示例10:一种编码有指令的非暂时性计算机可读存储介质,该指令在被执行时使计算装置的至少一个处理器执行示例1至8的方法中的任何方法。
示例11:一种设备,该设备包括用于执行示例1至8的方法中的任何方法的装置。
示例12:一种方法,包括:响应于接收到编译目标的集合,由测试环境系统,将该编译目标的集合的原始编译目标加载到测试环境系统的存储器中,其中,原始编译目标包括指示原始编译目标的更改版本是否被存储在测试环境系统的存储器中的条件语句;响应于在原始编译目标被存储在存储器中的同时接收到编译目标的集合的更新子集,由测试环境系统,确定更新的编译目标是否包括指示更新的编译目标相对于原始编译目标变化的指示符;以及响应于确定更新的编译目标相对于编译目标的原始版本变化并且响应于对在原始编译目标中的程序逻辑的调用,由测试环境并且在不终止应用的执行的情况下,执行更新的编译目标。
示例13:根据示例12的方法,其中,原始编译目标的类型与更新的编译目标的类型相同。
示例14:根据示例12至13中任一项的方法,进一步包括:
响应于确定更新的编译目标相对于编译目标的原始版本变化,由测试环境系统,确定更新的编译目标在测试环境系统的存储器中的位置;以及由该测试环境系统,将原始编译目标中的变量设置为更新的编译目标在测试环境系统的存储器中的位置,其中,响应于对在原始编译目标中的程序逻辑的调用来执行更新的编译目标包括:至少部分地基于原始编译目标中的变量来执行更新的编译目标。
示例15:根据示例12至14中任一项的方法,其中,响应于对在原始编译目标中的程序逻辑的调用来执行更新的编译目标进一步包括:响应于对在原始编译目标中的程序逻辑的调用,由该测试环境,确定原始编译目标中的变量包括更新的编译目标在测试环境系统的存储器中的位置;以及响应于确定原始编译目标中的变量包括更新的编译目标在测试环境系统的存储器中的位置,调用更新的编译目标中的程序逻辑,该程序逻辑至少部分地基于更新的编译目标的程序逻辑的名称而与原始编译目标中的程序逻辑相对应。
示例16:根据示例12至15中任一项的方法,其中,指示更新的编译目标相对于原始编译目标变化的指示符包括字符串,该字符串被预先添加、插入、或者附加到更新子集的编译目标的名称、在更新子集的编译目标内的变量的名称、或者在更新子集的编译目标内的功能的名称中的至少一个。
示例17:根据示例12至16中任一项的方法,其中,执行编译目标进一步包括:由该测试环境系统,执行表示调用新构造函数的程序逻辑的字节码的第一集合;以及由该测试环境系统,执行表示新构造函数的字节码的第二集合,其中,该新构造函数至少部分地基于从字节码的第一集合接收到的参数来调用两个超级构造函数中的至少一个超级构造函数。
示例18:一种计算装置,包括:一个或多个计算机处理器;以及存储器,该存储器包括指令,该指令在由一个或多个处理器执行时使所述一个或多个计算机处理器执行示例12至17的方法中的任何方法。
示例19:一种编码有指令的非暂时性计算机可读存储介质,该指令在被执行时使计算装置的至少一个处理器执行示例12至17的方法中的任何方法。
示例20:一种设备,该设备包括用于执行示例12至17的方法中的任何方法的装置。
示例21:一种方法,包括:响应于接收到使构建器计算系统将源代码的集合编译成实施应用的应用程序包的编译目标的集合的初始用户输入,由构建器计算系统部署应用程序包以发起应用的执行,其中,将源代码的集合的子集编译成编译目标的集合的初始子集;在对源代码的集合的至少所述子集进行修改之后,在构建器计算系统处接收使构建器计算系统将源代码的集合的至少所述子集编译成编译目标的集合的更新子集的后续用户输入;以及在不发送包括编译目标的集合的更新子集的另一应用程序包的情况下,部署编译目标的集合的更新子集以基于编译目标的集合的更新子集来更新应用。
示例22:根据示例21的方法,其中,该应用正在测试环境处执行,并且将编译目标的集合的更新子集存储在由应用已知的目标环境的预定义文件系统位置中,以及其中,至少部分地基于更新的编译目标被包括在目标环境的预定义文件系统位置中,部署更新子集使目标环境的协调器组件重新启动应用,以利用编译目标的更新子集进行执行。
示例23:根据示例21至22中任一项的方法,其中,测试环境是在构建器计算系统处执行的仿真器、构建器计算系统的目录、或者能够操作地耦合至构建器计算系统的远程计算装置中的至少一个。
示例24:根据示例21至23中任一项的方法,其中,该应用包括程序逻辑以按照反向时间顺序次序加载在预定义文件系统位置中包括的编译目标。
示例25:根据示例21至24中任一项的方法,进一步包括:由构建器计算系统,发送使应用重新启动的命令。
示例26:根据示例21至25中任一项的方法,其中,部署编译目标的集合的更新子集以在不发送另一应用程序包的情况下基于更新子集来更新应用程序包括:至少部分地基于确定在不重新启动应用的情况下无法利用编译目标的集合的更新子集来更新应用,部署编译目标的集合的更新子集以在不发送另一应用程序包的情况下基于更新子集来更新应用。
示例27:根据示例21至26中任一项的方法,其进一步包括:由构建器计算系统,在应用程序包中注入补丁压缩程序逻辑,当在测试环境系统中执行该补丁压缩程序逻辑时,存储用于至少两个相应编译目标的相应索引并且删除至少两个相应目标中比至少两个相应编译目标中的较新的、第二编译目标不那么新的第一编译目标。
示例28:一种计算装置,其包括:一个或多个计算机处理器;以及存储器,该存储器包括指令,该指令在由一个或多个计算机处理器执行时使一个或多个计算机处理器执行示例21至27的方法中的任何方法。
示例29:一种编码有指令的非暂时性计算机可读存储介质,该指令在被执行时使计算装置的至少一个处理器执行示例21至27的方法中的任何方法。
示例30:一种设备,该设备包括用于执行示例20至27的方法中的任何方法的装置。
示例31:一种方法,其包括:响应于接收到应用的编译目标的集合,由测试环境系统,将编译目标的集合中的一个或多个编译目标加载到测试环境系统的存储器中;响应于在原始编译目标被存储在存储器中的同时接收到编译目标的集合的更新子集,由测试环境系统将编译目标的更新子集存储在由应用已知的目标环境的预定义文件系统位置中;以及响应于确定在不重新启动应用的情况下无法利用编译目标的集合的更新子集来更新应用,由该测试环境系统,至少部分地基于更新的编译目标被包括在目标环境的预定义文件系统位置中,重新启动应用以利用编译目标的集合的更新子集来进行执行。
示例32:根据示例31的方法,其中,至少部分地基于目标环境的预定义文件系统位置被作为字符串包括在用于该应用的配置文件内或者所述编译目标的集合中的编译目标内,该应用知晓该目标环境的该预定义文件系统位置。
示例33:根据示例31至32中任一项的方法,进一步包括:由应用,在重新启动应用之后按照反向时间顺序次序来加载在目标环境的预定义文件系统位置中包括的更新的编译目标,其中,在不将第二编译目标加载到测试环境系统的存储器中的情况下,将更新的编译目标的比更新的编译目标的第二编译目标较新编译的第一编译目标加载到测试环境系统的存储器中,其中,第一编译目标的类型与第二编译目标的类型相同。
示例34:根据示例31至33中任一项的方法,进一步包括:由测试环境系统,接收使应用重新启动的命令。
示例35:根据示例31至34中任一项的方法,其中,接收应用的编译目标的集合包括:接收表示应用并且包括应用的编译目标的集合的第一应用程序包,以及其中,接收编译目标的集合的更新子集包括:接收在表示应用的第二应用程序包中不包括的编译目标的集合的更新子集。
示例36:根据示例31至35中任一项的方法,进一步包括:由测试环境系统,确定至少第一编译目标和至少部分地基于第一编译目标的第二编译目标被存储在测试环境系统处;以及生成用于第一编译目标和第二编译目标的相应索引,其中,第一编译目标和第二编译目标的每个相应索引指示第一编译目标和第二编译目标的相应版本。
示例37:根据示例21至36中任一项的方法,进一步包括:由测试环境系统,确定第一编译目标的第一版本比第二编译目标的第二版本较新,其中,第一版本由第一编译目标的第一索引指示并且第二版本由第二编译目标的第二索引指示;以及由测试环境系统并且至少部分地基于第一版本比第二版本较新,删除第二编译目标。
示例38:一种计算装置,其包括:一个或多个计算机处理器;以及存储器,该存储器包括指令,该指令在由一个或多个计算机处理器执行时使一个或多个计算机处理器执行示例31至37的方法中的任何方法。
示例39:一种编码有指令的非暂时性计算机可读存储介质,该指令在被执行时使计算装置的至少一个处理器执行示例31至37的方法中的任何方法。
示例40:一种设备,该设备包括用于执行示例31至37的方法中的任何方法的装置。
示例41:一种方法,包括:响应于接收到使构建器计算系统将资源的集合汇编到实施应用的应用程序包的未编译目标的集合中的初始用户输入,由该构建器计算系统,部署应用程序包以发起应用的执行,其中,未编译目标的集合包括资源的集合的子集;在对资源的集合的至少所述子集进行修改之后,在构建器计算系统处接收使构建器计算系统汇编基于资源的集合的子集的资源的集合的更新子集的后续用户输入;以及部署资源的集合的更新子集以在不发送包括资源的集合的更新子集的另一应用程序包的情况下基于更新子集来更新应用。
示例42:根据示例41的方法,其中,应用正在测试环境系统处执行,并且将资源的更新子集存储在目标环境的暂时文件系统位置中,其中,部署更新子集使目标环境的协调器组件将暂时文件系统位置的名称更新为由应用已知的目标环境的预定义文件系统位置的名称,以及其中,至少部分地基于资源的更新子集被包括在目标环境的预定义文件系统位置中,部署更新子集使目标环境的协调器组件重新启动应用以利用资源的更新子集来执行。
示例43:根据示例41至42中任一示例的方法,其中,至少部分地基于目标环境的预定义文件系统位置被作为字符串包括在至少用于该应用的配置文件内或者在该应用程序包中包括的编译目标内,该应用知晓该目标环境的该预定义文件系统位置。
示例44:根据权利要求41至43中任一项的方法,其中,测试环境是在构建器计算系统处执行的仿真器、构建器计算系统的目录、或者能够操作地耦合至构建器计算系统的远程计算装置中的至少一个。
示例45:根据示例41至44中任一项的方法,其进一步包括:由构建器计算系统,发送使应用重新启动并且目标环境的协调器组件将暂时文件系统位置的名称更新为由应用已知的目标环境的预定义文件系统位置的名称的命令。
示例46:根据示例41至45中任一项的方法,其进一步包括:由构建器计算系统并且利用未编译目标的集合,发送更新的编译目标,其中,基于对源代码的修改来生成更新的编译目标,其中,在更新的编译目标之前基于不具有修改的资源生成原始编译目标。
示例47:根据示例41至46中任一项的方法,进一步包括:响应于确定应用程序包先前被部署到测试环境系统,由构建器计算系统,避免利用资源的集合的更新子集来生成其它应用程序包。
示例48:一种计算装置,包括:一个或多个计算机处理器;以及存储器,该存储器包括指令,该指令在由一个或多个计算机处理器执行时使一个或多个计算机处理器执行示例41至47的方法中的任何方法。
示例49:一种编码有指令的非暂时性计算机可读存储介质,该指令在被执行时使计算装置的至少一个处理器执行示例41至47的方法中的任何方法。
示例50:一种设备,该设备包括用于执行示例41至47的方法中的任何方法的装置。
示例51:一种方法,其包括:响应于接收到应用的资源的集合,由测试环境系统,将资源中一个或多个的资源加载到测试环境系统的存储器中;响应于在将资源存储到存储器中时接收到资源的更新子集,由测试环境系统,将资源的更新子集存储到目标环境的暂时文件系统位置中;响应于确定在不重新启动向应用提供对资源的访问的资源管理器的情况下无法利用资源的更新子集来更新应用,由测试环境系统,将暂时文件系统位置更新为由应用已知的目标环境的预定义文件系统位置;以及由测试环境系统并且在不终止应用的情况下,重新启动资源管理器以至少部分地基于资源的更新子集被包括在目标环境的预定义文件系统位置中来加载该资源的更新子集。
示例52:根据示例51的方法,其中,应用正在测试环境处执行,并且将编译目标的更新子集存储在目标环境的暂时文件系统位置中,其中,部署更新子集使目标环境的协调器组件将暂时文件系统的名称更新为由应用已知的目标环境的预定文件系统的位置的名称,以及其中,至少部分地基于更新的编译目标被包括在目标环境的预定义文件系统位置中,部署该更新子集使目标环境的协调器组件重新启动应用以利用编译目标的更新子集来执行。
示例53:根据示例51至52中任一项的方法,其中,在接收到资源的更新子集之前的资源管理器是资源管理器的第一实例,该方法进一步包括:在接收到资源的更新子集之后,将资源管理器的第二实例实例化为资源管理器;由测试环境系统并且使用映射,识别在包括对资源管理器的第一实例的参考的存储器中加载的至少一个编译目标;以及由测试环境并且使用映射,将所述至少一个编译目标更新为包括对资源管理器的第二实例的参考。
示例54:根据示例51至53中任一项的方法,进一步包括:由测试环境系统并且针对显示,在不重新启动应用的情况下输出资源的更新子集中的至少一种资源。
示例55:根据示例51至54中任一项的方法,其中,将暂时文件系统位置更新为由应用已知的目标环境的预定义文件系统位置包括:将暂时文件系统位置重命名为预定义文件系统位置。
示例56:根据示例51至55中任一项的方法,进一步包括:由测试环境系统,接收使应用重新启动和目标环境的协调器组件将暂时文件系统位置的名称更新为由应用已知的目标环境的预定义文件系统位置的名称的命令。
示例57:根据示例51至56中任一项的方法,进一步包括:由测试环境系统并且利用未编译目标的集合,接收更新的编译目标的集合,其中,基于对源代码的修改来生成更新的编译目标,其中,在更新的编译目标之前基于不具有修改的资源来生成原始编译目标。
示例58:一种计算装置,其包括:一个或多个计算机处理器;以及存储器,该存储器包括指令,该指令在由一个或多个计算机处理器执行时使一个或多个计算机处理器执行示例51至57的方法中的任何方法。
示例59:一种编码有指令的非暂时性计算机可读存储介质,该指令在被执行时使计算装置的至少一个处理器执行示例51至57的方法中的任何方法。
示例60:一种设备,该设备包括用于执行示例51至57的方法中的任何方法的装置。
在一个或多个示例中,可以在硬件、软件、固件、或者其任何组合中实施所描述的功能。如果在软件中实施,则可以将功能作为一个或多个指令或者代码存储在计算机可读介质上或者通过计算机可读介质来传输并且可以由基于硬件的处理单元执行。计算机可读介质可以包括与诸如数据存储介质的有形介质相对应的计算机可读存储介质、或者包括促进将计算机程序从一个地方传递至另一地方(例如,根据通信协议)的任何介质的通信介质。按照这种方式,计算机可读介质通常可以与(1)非暂时性的有形计算机可读或者(2)诸如信号或者载波等通信介质相对应。数据存储介质可以是能够可通过一个或多个计算机或者一个或多个处理器进行访问以检索用于实施在本公开中描述的技术的指令、代码和/或数据结构的任何可用介质。计算机程序产品可以包括计算机可读介质。
例如,但不限于,这种计算机可读存储介质能够包括能够用于以指令或者数据结构的形式存储期望的程序代码和能够由计算机来进行访问的的RAM、ROM、EEPROM、CD-ROM或者任何其它介质。同样,将任何连接适当地称为计算机可读介质。例如,如果使用同轴电缆、光纤电缆、双绞线、数字用户线(DSL)、或者诸如红外、无线电、和微波等无线技术来从网站、服务器、或者其它远程源发送指令,那么同轴电缆、光纤电缆、双绞线、DSL、或者诸如红外、无线电、和微波的无线技术被包括在介质的定义中。然而,应当理解的是,计算机可读存储介质和数据存储介质不包括连接、载波、信号、或者其它瞬态介质,而是涉及非瞬态的、有形存储介质。使用的磁盘和光盘包括压缩式光盘(CD)、激光光盘、光盘、数字多功能光盘(DVD)、软盘和蓝光光盘,其中,磁盘通常磁性地复制数据,而光盘利用激光光学地复制数据。以上的组合还应当被包括在计算机可读介质的范围内。
可以通过一个或多个处理器来执行指令,诸如一个或多个数字信号处理器(DSP)、通用微处理器、专用集成电路(ASIC)、现场可编程逻辑阵列(FPGA)、或者其它等效的集成或者离散逻辑电路系统。因此,如使用的术语“处理器”可以指任何前述的结构或者适用于实施描述的技术的任何其它结构。另外,在一些方面中,可以将描述的功能提供在专用的硬件模块和/或软件模块内。同样,可以在一个或多个电路或者逻辑元件中充分地实施这些技术。
可以在各种装置或者设备中实施本公开的技术,包括,无线手机、集成电路(IC)或者一组IC(例如,芯片集)。在本公开中,将各种部件、模块、或者单元描述为用于强化配置为执行所公开的技术的装置的功能方面,但并不一定需要通过不同的硬件单元实现。相反,如上所述,结合合适的软件和/或固件,可以将各种单元组合在硬件单元中或者可以通过交互操作的硬件单元的集合(包括上文描述的一个或多个处理器)来提供。
要认识到的是,根据实施例,能够按照不同的顺序来执行本文描述的任何方法的某些动作或者事件,可以对其进行添加、合并、或者完全省略(例如,并非所有描述的动作或者事件对于方法的实践都是必要的)。此外,在某些实施例中,可以例如通过多线程处理、中断处理、或者多个处理器来同时而不是顺序地执行动作或者事件。
在一些示例中,计算机可读存储介质可以包括非暂时性介质。在一些示例中,术语“非暂时性”指示存储介质不包括在载波或者传播信号中。在某些示例中,非暂时性存储介质可以存储能够随时间变化的数据(例如,在RAM或者高速缓冲存储器中)。
已经对各种示例进行了描述。这些和其它示例在以下权利要求书的范围内。
Claims (18)
1.一种方法,包括:
响应于接收到使构建器计算系统将用于应用的源代码集编译成编译目标集的初始用户输入,由所述构建器计算系统部署所述编译目标集以发起所述应用的执行,其中,所述源代码集的子集被编译成所述编译目标集的初始子集;
在对所述源代码集的至少所述子集进行修改之后,在所述构建器计算系统处接收使所述构建器计算系统将所述源代码集的至少所述子集编译成所述编译目标集的更新子集的后续用户输入;以及
响应于确定所述更新子集与所述初始子集不同,在不终止所述应用的执行的情况下部署所述编译目标集的所述更新子集以更新所述应用。
2.根据权利要求1所述的方法,进一步包括:
避免部署所述编译目标集中的其它编译目标以更新所述应用,其中,所述其它编译目标未包括在所述编译目标集的所述更新子集中。
3.根据权利要求1和2中任一项所述的方法,其中,所述应用正在测试环境中执行,其中,所述测试环境是在所述构建器计算系统处执行的仿真器、所述构建器计算系统的目录、或者能够操作地耦合至所述构建器计算系统的远程计算装置中的至少一个。
4.根据权利要求3所述的方法,其中,对所述应用的所述更新参照所述编译目标集的所述更新子集中的编译目标而更新了所述编译目标集的所述初始子集中的编译目标,其中,在所述应用的执行期间并且在部署所述编译目标集的所述更新子集之前,所述编译目标集的所述初始子集中的所述编译目标被存储在所述测试环境的存储器中。
5.根据权利要求3所述的方法,进一步包括:
由所述构建器计算系统将表示条件语句的字节码注入到所述编译目标集中的至少一个编译目标中,其中,所述字节码是在表示所述应用中的功能的程序逻辑的字节码之前被注入到所述编译目标集中的所述至少一个编译目标内的,其中,所述条件语句指示是否所述功能的更新版本是否被加载在所述测试环境的存储器中;以及
响应于所述条件语句被满足,由所述构建器计算系统将调用所述功能的所述更新版本的字节码注入到所述编译目标集中的所述至少一个编译目标中。
6.根据权利要求1至5中任一项所述的方法,进一步包括:
响应于将所述源代码集的至少所述子集编译成所述编译目标集的所述更新子集,由所述构建器计算装置更新所述编译目标集的所述更新子集中的编译目标的名称、在所述编译目标集的所述更新子集中的所述编译目标内的变量的名称、或者在所述编译目标集的所述更新子集中的所述编译目标内的功能的名称,其中,所述更新的名称指示所述编译目标集的所述更新子集中的所述编译目标相对于所述编译目标的先前版本发生了变化。
7.根据权利要求1至6中任一项所述的方法,
其中,由所述构建器计算系统部署所述编译目标集以发起所述应用的执行进一步包括:将所述编译目标集封装到表示所述应用的第一应用程序包中并且将所述应用程序包发送至测试环境,以及
其中,部署所述编译目标集的所述更新子集以基于所述编译目标集的所述更新子集更新所述应用进一步包括:在不将所述编译目标集的所述更新子集封装到表示所述应用的第二应用程序包中的情况下,将所述编译目标集的所述更新子集发送至所述测试环境。
8.根据权利要求1至7中任一项所述的方法,进一步包括:
响应于确定在所述源代码集的所述子集中的类包括至少两个超级构造函数:
由所述构建器计算装置注入表示调用新构造函数的程序逻辑的字节码的第一集合;并且
由所述计算装置注入表示所述新构造函数的字节码的第二集合,其中,所述新构造函数至少部分地基于从所述字节码的第一集合接收到的参数来调用所述两个超级构造函数中的至少一个超级构造函数。
9.一种计算装置,所述计算装置包括用于执行根据权利要求1至8所述的方法中的任一个的装置。
10.一种编码有指令的非暂时性计算机可读存储介质,所述指令在被执行时使计算装置的至少一个处理器执行根据权利要求1至8所述的方法中的任一个。
11.一种方法,包括:
响应于接收到编译目标集,由测试环境系统将所述编译目标集的原始编译目标加载到所述测试环境系统的存储器中,其中,所述原始编译目标包括指示所述原始编译目标的更改版本是否被存储在所述测试环境系统的存储器中的条件语句;
响应于在所述原始编译目标被存储在存储器中的同时接收到所述编译目标集的更新子集,由所述测试环境系统确定更新的编译目标是否包括指示所述更新的编译目标相对于所述原始编译目标变化的指示符;以及
响应于确定所述更新的编译目标相对于所述编译目标的原始版本变化并且响应于对在所述原始编译目标中的程序逻辑的调用,由所述测试环境并且在不终止所述应用的执行的情况下,执行所述更新的编译目标。
12.根据权利要求11所述的方法,其中,所述原始编译目标的类型与所述更新的编译目标的类型相同。
13.根据权利要求11和12中任一项所述的方法,进一步包括:
响应于确定所述更新的编译目标相对于所述编译目标的所述原始版本变化,由所述测试环境系统确定所述更新的编译目标在所述测试环境系统的所述存储器中的位置;以及
由所述测试环境系统将所述原始编译目标中的变量设置为所述更新的编译目标在所述测试环境系统的所述存储器中的所述位置,
其中,响应于对在所述原始编译目标中的程序逻辑的所述调用来执行所述更新的编译目标包括:至少部分地基于所述原始编译目标中的所述变量来执行所述更新的编译目标。
14.根据权利要求13所述的方法,其中,响应于对在所述原始编译目标中的程序逻辑的所述调用来执行所述更新的编译目标进一步包括:
响应于对在所述原始编译目标中的程序逻辑的所述调用,由所述测试环境确定所述原始编译目标中的所述变量包括所述更新的编译目标在所述测试环境系统的所述存储器中的所述位置;以及
响应于确定所述原始编译目标中的所述变量包括所述更新的编译目标在所述测试环境系统的所述存储器中的所述位置,调用所述更新的编译目标中的程序逻辑,该程序逻辑至少部分地基于所述更新的编译目标的程序逻辑的名称而与所述原始编译目标中的程序逻辑相对应。
15.根据权利要求11至14中任一项所述的方法,其中,指示所述更新的编译目标相对于所述原始编译目标变化的所述指示符包括字符串,所述字符串被预先添加、插入、或者附加到以下至少一个:所述更新子集中的编译目标的名称、在所述更新子集中的所述编译目标内的变量的名称、或者在所述更新子集中的所述编译目标内的功能的名称。
16.根据权利要求11至15中任一项所述的方法,其中,执行所述编译目标进一步包括:
由所述测试环境系统执行表示调用新构造函数的程序逻辑的字节码的第一集合;以及
由所述测试环境系统执行表示所述新构造函数的字节码的第二集合,其中,所述新构造函数至少部分地基于从所述字节码的第一集合接收到的参数来调用两个超级构造函数中的至少一个超级构造函数。
17.一种测试环境系统,所述测试环境系统包括用于执行根据权利要求11至16所述的方法中的任一个的装置。
18.一种编码有指令的非暂时性计算机可读存储介质,所述指令在被执行时使测试环境系统的至少一个处理器执行根据权利要求11至16所述的方法中的任一个。
Applications Claiming Priority (9)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US201562258335P | 2015-11-20 | 2015-11-20 | |
US62/258,335 | 2015-11-20 | ||
US15/275,584 | 2016-09-26 | ||
US15/275,584 US10067757B2 (en) | 2015-11-20 | 2016-09-26 | Dynamic update of an application in compilation and deployment with hot-swapping |
US15/275,598 | 2016-09-26 | ||
US15/275,616 US10083025B2 (en) | 2015-11-20 | 2016-09-26 | Dynamic update of an application in compilation and deployment with warm-swapping |
US15/275,616 | 2016-09-26 | ||
US15/275,598 US10223097B2 (en) | 2015-11-20 | 2016-09-26 | Dynamic update of an application in compilation and deployment with cold-swapping |
PCT/US2016/062771 WO2017087801A1 (en) | 2015-11-20 | 2016-11-18 | Dynamic update of an application in compilation and deployment |
Publications (2)
Publication Number | Publication Date |
---|---|
CN108027722A true CN108027722A (zh) | 2018-05-11 |
CN108027722B CN108027722B (zh) | 2021-09-17 |
Family
ID=58719733
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201680053784.1A Active CN108027722B (zh) | 2015-11-20 | 2016-11-18 | 在编译和部署中动态更新应用 |
Country Status (3)
Country | Link |
---|---|
US (3) | US10083025B2 (zh) |
EP (1) | EP3377968B1 (zh) |
CN (1) | CN108027722B (zh) |
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109032631A (zh) * | 2018-07-12 | 2018-12-18 | 腾讯科技(深圳)有限公司 | 应用程序补丁包获取方法、装置、计算机设备及存储介质 |
CN110333893A (zh) * | 2019-06-28 | 2019-10-15 | 百度在线网络技术(北京)有限公司 | 应用程序的修复方法、装置、设备和存储介质 |
CN110928761A (zh) * | 2018-07-30 | 2020-03-27 | 通用电气公司 | 需求链及其应用的系统和方法 |
CN112363954A (zh) * | 2020-12-08 | 2021-02-12 | 南京大学 | 基于对象状态一致性的软件动态更新测试方法 |
WO2022148185A1 (zh) * | 2021-01-07 | 2022-07-14 | 苏州浪潮智能科技有限公司 | 一种数据包更新方法、装置、电子设备及可读存储介质 |
Families Citing this family (43)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US10191925B1 (en) | 2011-10-27 | 2019-01-29 | Valve Corporation | Delivery of digital information to a remote device |
US11340893B2 (en) * | 2015-12-31 | 2022-05-24 | Kony, Inc. | Mobile application update preserving changes to the application made by a client |
US10892942B2 (en) * | 2016-01-22 | 2021-01-12 | Equinix, Inc. | Container-based cloud exchange disaster recovery |
US10089103B2 (en) | 2016-08-03 | 2018-10-02 | Smartshift Technologies, Inc. | Systems and methods for transformation of reporting schema |
US10754761B2 (en) * | 2016-11-11 | 2020-08-25 | Atlassian Pty Ltd | Systems and methods for testing source code |
US10474750B1 (en) * | 2017-03-08 | 2019-11-12 | Amazon Technologies, Inc. | Multiple information classes parsing and execution |
US20180275957A1 (en) * | 2017-03-27 | 2018-09-27 | Ca, Inc. | Assistive technology for code generation using voice and virtual reality |
US10922212B2 (en) * | 2017-05-06 | 2021-02-16 | Servicenow, Inc. | Systems and methods for service catalog analysis |
EP3635543B1 (en) * | 2017-06-08 | 2023-10-11 | British Telecommunications public limited company | Containerised programming |
US11086604B2 (en) * | 2017-11-21 | 2021-08-10 | Mitsubishi Electric Corporation | Source code splitting device, source code analyzing device, source code splitting method, and computer readable medium |
US10896035B1 (en) * | 2017-12-05 | 2021-01-19 | Melih Abdulhayoglu | Methods of converting APIs into objects and uses thereof |
CN108153531A (zh) * | 2017-12-28 | 2018-06-12 | 深圳市索菱实业股份有限公司 | 一种基于Android UiAutomator工具的自动编译快速运行的方法 |
US10360017B1 (en) * | 2018-01-02 | 2019-07-23 | Microsoft Technology Licensing, Llc | Updating program packages at distribution endpoint |
US11443067B2 (en) | 2018-01-31 | 2022-09-13 | Salesforce.Com, Inc. | Restricting access and edit permissions of metadata |
US10620935B2 (en) * | 2018-01-31 | 2020-04-14 | Salesforce.Com, Inc. | Version management automation and consistent application builds for different target systems |
US10698674B2 (en) | 2018-02-06 | 2020-06-30 | Smartshift Technologies, Inc. | Systems and methods for entry point-based code analysis and transformation |
US10740075B2 (en) * | 2018-02-06 | 2020-08-11 | Smartshift Technologies, Inc. | Systems and methods for code clustering analysis and transformation |
CN108446219B (zh) * | 2018-03-01 | 2021-07-13 | 网易宝有限公司 | 应用程序的操作方法、系统、介质和计算设备 |
CN108536431A (zh) * | 2018-04-04 | 2018-09-14 | 浙江小泰科技有限公司 | 一种全局命令行创建前端项目方法及系统 |
US11152663B2 (en) * | 2018-06-18 | 2021-10-19 | Datalogic Ip Tech S.R.L. | Advanced battery system |
US20200057714A1 (en) * | 2018-08-17 | 2020-02-20 | Google Llc | Testing data changes in production systems |
CN109460250B (zh) * | 2018-09-25 | 2022-03-08 | 平安科技(深圳)有限公司 | 一种应用程序的生成方法及设备 |
CN109683927A (zh) * | 2018-11-01 | 2019-04-26 | 苏州蜗牛数字科技股份有限公司 | 一种更新u3d安卓游戏的方法 |
US10768912B1 (en) * | 2019-02-15 | 2020-09-08 | Workday, Inc. | Platform class creation |
US10908892B2 (en) | 2019-03-12 | 2021-02-02 | International Business Machines Corporation | Generating and deploying object code files compiled on build machines |
US11182145B2 (en) * | 2019-03-15 | 2021-11-23 | International Business Machines Corporation | Optimizing updates to distributed data processing applications |
CN109976763A (zh) * | 2019-03-25 | 2019-07-05 | 联想(北京)有限公司 | 一种代码处理方法、装置、电子设备及计算系统 |
US11126540B2 (en) * | 2019-06-13 | 2021-09-21 | Paypal, Inc. | Big data application lifecycle management |
KR20210029621A (ko) * | 2019-09-06 | 2021-03-16 | 삼성전자주식회사 | 전자 장치에서 어플리케이션 업데이트 시 런타임 성능 개선 방법 및 장치 |
US11442704B2 (en) * | 2019-11-11 | 2022-09-13 | Aveva Software, Llc | Computerized system and method for a distributed low-code / no-code computing environment |
CN111078256B (zh) * | 2019-12-20 | 2024-02-02 | 广州品唯软件有限公司 | 自动化测试环境的升级方法、终端及可读存储介质 |
US11074166B1 (en) * | 2020-01-23 | 2021-07-27 | Vmware, Inc. | System and method for deploying software-defined data centers |
US11886391B2 (en) * | 2020-05-14 | 2024-01-30 | Valve Corporation | Efficient file-delivery techniques |
CN111736849A (zh) * | 2020-06-24 | 2020-10-02 | 浪潮电子信息产业股份有限公司 | 一种源代码编译方法及系统 |
US11200038B1 (en) * | 2020-06-25 | 2021-12-14 | Paypal, Inc. | Fast compiling source code without dependencies |
CN111835842B (zh) * | 2020-07-02 | 2023-02-28 | 远景智能国际私人投资有限公司 | 网关资源的更新方法、装置及物联网控制平台 |
US11392364B2 (en) | 2020-09-28 | 2022-07-19 | Red Hat, Inc. | Adaptive hot reload for class changes |
CN112558981B (zh) * | 2020-12-23 | 2024-02-06 | 上海万向区块链股份公司 | 基于jenkinsfile的自定义编译部署方法及系统 |
US20230060787A1 (en) * | 2020-12-28 | 2023-03-02 | Appward Llc | System and Method for Real-Time, Dynamic Creation, Delivery, and Use of Customizable Web Applications |
CN113190448B (zh) * | 2021-05-06 | 2022-11-04 | 网易(杭州)网络有限公司 | 测试代码更新方法及装置、电子设备、存储介质 |
US11782701B2 (en) * | 2021-06-01 | 2023-10-10 | Stephen Davidson | Software updater |
US11573787B1 (en) | 2021-09-10 | 2023-02-07 | Microsoft Technology Licensing, Llc | Hot reloading a running application with an unsaved source code change |
US20230169215A1 (en) * | 2021-12-01 | 2023-06-01 | International Business Machines Corporation | Secure software compilation and software verification |
Citations (11)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2000026780A1 (en) * | 1998-10-30 | 2000-05-11 | Segasoft, Inc. | System for modifying the functionality of compiled computer code at run-time |
US7124376B2 (en) * | 2000-05-02 | 2006-10-17 | Palmchip Corporation | Design tool for systems-on-a-chip |
CN101706725A (zh) * | 2009-11-20 | 2010-05-12 | 中兴通讯股份有限公司 | 一种可重定位程序的加载及调试方法及系统 |
US20100199259A1 (en) * | 2009-01-30 | 2010-08-05 | Quinn Timothy J | Methods and Apparatus for Dynamic Class Reloading and Versioning |
CN101963914A (zh) * | 2010-11-12 | 2011-02-02 | 南京大学 | 一种基于字节码文件重构的Java类在线更新方法 |
US20110040709A1 (en) * | 2009-08-12 | 2011-02-17 | Mark Proctor | Pattern behavior support in a rule engine |
EP2646907A1 (en) * | 2010-12-01 | 2013-10-09 | Apple Inc. | Pre-heated software installation |
CN103425584A (zh) * | 2013-08-27 | 2013-12-04 | 上海复深蓝信息技术有限公司 | 基于Java字节码的大型应用回归测试信息处理方法 |
CN103701930A (zh) * | 2014-01-07 | 2014-04-02 | 浙江大学 | 一种移动应用程序的实时更新方法及系统 |
CN103942078A (zh) * | 2014-04-30 | 2014-07-23 | 华为技术有限公司 | 一种加载驱动程序的方法及嵌入式设备 |
CN104765624A (zh) * | 2014-01-06 | 2015-07-08 | 腾讯科技(深圳)有限公司 | 虚拟机应用程序的更新处理方法和装置 |
Family Cites Families (17)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7080051B1 (en) * | 1993-11-04 | 2006-07-18 | Crawford Christopher M | Internet download systems and methods providing software to internet computer users for local execution |
US6658465B1 (en) * | 1997-08-25 | 2003-12-02 | Intel Corporation | Method and apparatus for monitoring and controlling programs in a network |
US6330573B1 (en) | 1998-08-31 | 2001-12-11 | Xerox Corporation | Maintaining document identity across hierarchy and non-hierarchy file systems |
US6857119B1 (en) | 2001-09-25 | 2005-02-15 | Oracle International Corporation | Techniques for modifying a compiled application |
US7784044B2 (en) | 2002-12-02 | 2010-08-24 | Microsoft Corporation | Patching of in-use functions on a running computer system |
US20050160104A1 (en) * | 2004-01-20 | 2005-07-21 | Datasource, Inc. | System and method for generating and deploying a software application |
JP2006146679A (ja) | 2004-11-22 | 2006-06-08 | Hitachi Ltd | 情報処理装置の制御方法、情報処理装置、及びプログラム |
US8495619B2 (en) | 2005-06-29 | 2013-07-23 | Flexera Software Llc | Method and system for pre-deployment conflict checking |
US7778968B2 (en) | 2005-10-31 | 2010-08-17 | Sap Ag | Systems and methods for compiling applications on a test server |
US8166448B2 (en) | 2007-05-25 | 2012-04-24 | Microsoft Corporation | Rapid development of distributed web service |
US7904484B2 (en) | 2007-11-30 | 2011-03-08 | Red Hat, Inc. | Incremental packaging |
US9134964B2 (en) * | 2011-04-06 | 2015-09-15 | Media Direct, Inc. | Systems and methods for a specialized application development and deployment platform |
US9043765B2 (en) | 2011-11-09 | 2015-05-26 | Microsoft Technology Licensing, Llc | Simultaneously targeting multiple homogeneous and heterogeneous runtime environments |
US9639329B2 (en) | 2012-06-15 | 2017-05-02 | Syddansk Universitet | System and method for automatic invocation of constructor code for superclasses |
US9164877B2 (en) | 2013-06-21 | 2015-10-20 | Sap Se | Business application inspection and modification |
US9268551B2 (en) * | 2013-06-27 | 2016-02-23 | Raytheon Company | Runtime creation, assignment, deployment and updating of arbitrary radio waveform techniques for a radio waveform generation device |
US9361068B2 (en) | 2014-05-21 | 2016-06-07 | International Business Machines Corporation | System and method for using development objectives to guide implementation of source code |
-
2016
- 2016-09-26 US US15/275,616 patent/US10083025B2/en active Active
- 2016-09-26 US US15/275,598 patent/US10223097B2/en active Active
- 2016-09-26 US US15/275,584 patent/US10067757B2/en active Active
- 2016-11-18 EP EP16805693.5A patent/EP3377968B1/en active Active
- 2016-11-18 CN CN201680053784.1A patent/CN108027722B/zh active Active
Patent Citations (11)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2000026780A1 (en) * | 1998-10-30 | 2000-05-11 | Segasoft, Inc. | System for modifying the functionality of compiled computer code at run-time |
US7124376B2 (en) * | 2000-05-02 | 2006-10-17 | Palmchip Corporation | Design tool for systems-on-a-chip |
US20100199259A1 (en) * | 2009-01-30 | 2010-08-05 | Quinn Timothy J | Methods and Apparatus for Dynamic Class Reloading and Versioning |
US20110040709A1 (en) * | 2009-08-12 | 2011-02-17 | Mark Proctor | Pattern behavior support in a rule engine |
CN101706725A (zh) * | 2009-11-20 | 2010-05-12 | 中兴通讯股份有限公司 | 一种可重定位程序的加载及调试方法及系统 |
CN101963914A (zh) * | 2010-11-12 | 2011-02-02 | 南京大学 | 一种基于字节码文件重构的Java类在线更新方法 |
EP2646907A1 (en) * | 2010-12-01 | 2013-10-09 | Apple Inc. | Pre-heated software installation |
CN103425584A (zh) * | 2013-08-27 | 2013-12-04 | 上海复深蓝信息技术有限公司 | 基于Java字节码的大型应用回归测试信息处理方法 |
CN104765624A (zh) * | 2014-01-06 | 2015-07-08 | 腾讯科技(深圳)有限公司 | 虚拟机应用程序的更新处理方法和装置 |
CN103701930A (zh) * | 2014-01-07 | 2014-04-02 | 浙江大学 | 一种移动应用程序的实时更新方法及系统 |
CN103942078A (zh) * | 2014-04-30 | 2014-07-23 | 华为技术有限公司 | 一种加载驱动程序的方法及嵌入式设备 |
Non-Patent Citations (1)
Title |
---|
ALLAN RAUNDAHL GREGERSEN: ""Towards a Dynamic-Update-Enabled JVM"", 《PROCEEDINGS OF THE WORKSHOP ON AOP AND MEAT-DATA FOR SOFTWARE EVOLUTION》 * |
Cited By (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109032631A (zh) * | 2018-07-12 | 2018-12-18 | 腾讯科技(深圳)有限公司 | 应用程序补丁包获取方法、装置、计算机设备及存储介质 |
CN109032631B (zh) * | 2018-07-12 | 2020-12-18 | 腾讯科技(深圳)有限公司 | 应用程序补丁包获取方法、装置、计算机设备及存储介质 |
CN110928761A (zh) * | 2018-07-30 | 2020-03-27 | 通用电气公司 | 需求链及其应用的系统和方法 |
CN110928761B (zh) * | 2018-07-30 | 2023-08-11 | 通用电气公司 | 需求链及其应用的系统和方法 |
CN110333893A (zh) * | 2019-06-28 | 2019-10-15 | 百度在线网络技术(北京)有限公司 | 应用程序的修复方法、装置、设备和存储介质 |
CN112363954A (zh) * | 2020-12-08 | 2021-02-12 | 南京大学 | 基于对象状态一致性的软件动态更新测试方法 |
WO2022148185A1 (zh) * | 2021-01-07 | 2022-07-14 | 苏州浪潮智能科技有限公司 | 一种数据包更新方法、装置、电子设备及可读存储介质 |
Also Published As
Publication number | Publication date |
---|---|
EP3377968A1 (en) | 2018-09-26 |
US10067757B2 (en) | 2018-09-04 |
US20170147312A1 (en) | 2017-05-25 |
US20170147306A1 (en) | 2017-05-25 |
EP3377968B1 (en) | 2022-03-16 |
US10083025B2 (en) | 2018-09-25 |
US10223097B2 (en) | 2019-03-05 |
US20170147324A1 (en) | 2017-05-25 |
CN108027722B (zh) | 2021-09-17 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN108027722A (zh) | 在编译和部署中动态更新应用 | |
US10795660B1 (en) | Live code updates | |
US9116766B2 (en) | Extensible applications using a mobile application framework | |
US20090006987A1 (en) | Visual design tools for portal content creation | |
Troelsen et al. | C# 6.0 and the. NET 4.6 Framework | |
CN112860260B (zh) | 一种在高校场景下基于web的跨平台应用构建工具及方法 | |
KR20140067018A (ko) | 메타데이터를 이용하여 운영 체제의 네이티브 애플리케이션 프로그래밍 인터페이스를 기술하는 기법 | |
WO2017087801A1 (en) | Dynamic update of an application in compilation and deployment | |
WO2019005228A1 (en) | AUTOMATED ADAPTATION OF A SOURCE CODE IN ORDER TO INJECT FUNCTIONS BETWEEN VERSIONS OF A PLATFORM | |
US20120060141A1 (en) | Integrated environment for software design and implementation | |
US11693652B2 (en) | Automated authoring of software solutions from a data model | |
US20220413843A1 (en) | Combining model-driven applications and canvas-type applications with application lifecycle management | |
Ali | Advanced IOS 4 Programming: Developing Mobile Applications for Apple IPhone, IPad, and IPod Touch | |
García-Díaz et al. | MCTest: towards an improvement of match algorithms for models | |
Wipp | Workflows on Android: A framework supporting business process execution and rule-based analysis | |
Einarsson | Refactoring UML diagrams and models with model-to-model transformations | |
Saxon et al. | Opening the black-box of model transformation | |
US20100023923A1 (en) | Method for medeling objects in a hetrogenious computing environment | |
Duldulao et al. | Spring Boot and Angular: Hands-on full stack web development with Java, Spring, and Angular | |
Mawlood-Yunis | Android SQLite, Firebase, and Room Databases | |
Hamann et al. | Towards supporting multiple execution environments for uml/ocl models at runtime | |
CN116450112A (zh) | 使用序列化的属性编辑处理方法和装置、设备及介质 | |
CN117149162A (zh) | 一种sdk自动生成方法、装置、电子设备及存储介质 | |
Pichiliani et al. | Adaptation of single-user multi-touch components to support synchronous mobile collaboration | |
Hollister | Core Blender Development |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |