基于重构技术实现开放终端应用数据与功能的方法与流程

文档序号:13207048阅读:196来源:国知局
基于重构技术实现开放终端应用数据与功能的方法与流程

本发明是一种利用程序分析与重构技术实现将现有终端应用的数据和功能转化为可由外部调用的应用编程接口(applicationprogramminginterface,api),从而实现将终端应用数据与功能开放的方法,属于软件技术领域,适用于软件维护。



背景技术:

应用编程接口经济是新兴的推动力量,能够帮助企业领导者实现企业转型,构建新的生态系统,实现核心资产货币化,以应对当今数字转型过程中的市场挑战。终端应用中的数据和功能潜藏了巨大的价值,亟需进一步开发,以实现其潜在价值。然而,开放应用的数据和功能需要开发人员对原系统进行手工的修改与重构。对于大量的企业和政府单位,他们往往是通过第三方开发团队定制应用,如企业的办公应用、政府的智慧城市应用等。这些企业、政府所拥有的应用虽然有着非常重要的数据和功能,却因为这些应用的所有者往往缺少相应的开发团队,导致他们在开放应用的数据和功能时需要重新联系原有的第三方开发团队,会遇到开发成本高、开发周期长等问题。

综上所述,需要一种支持将现有终端应用的数据和功能转换为应用编程接口的方法。它可以帮助应用所有者在开发文档缺失、开发人员缺位的情况下,快速地将现有应用的数据和功能对外开放。应用所有者利用本发明提出的一种程序控制流捕捉与重构方法,可以高效地复用原有应用代码,从而实现快速将现有应用的数据与功能生成相应的应用编程接口。



技术实现要素:

本发明的目的是将现有应用的数据和功能对外以接口的方式提供服务。其核心思想是通过修改应用的运行时环境,获取用户在使用应用相应功能、数据时的应用运行时控制流信息,并对原有控制流进行重构。本方法通过程序化分析运行时控制流和应用静态代码,剥离与应用的功能、数据无关的子控制流,例如,实现用户接口(userinterface,ui)的子控制流;保留与应用功能、数据直接相关的一组子控制流及其上下文环境。在特定的上下文环境下,重现这组子控制流,即可实现应用相应功能、获取应用数据。本方法通过应用运行环境级别的监控,实现获取用户在使用应用特定功能、获取应用特定数据时的运行时的控制流;通过结合控制流分析与静态代码分析,剥离与应用的功能、数据无关的子控制流提升生成的对外接口的效率;通过在应用运行环境级别重现特定的上下文环境、复用原应用代码以保证应用功能、获取应用数据的正确性。

本发明采用的技术方案如下:

一种基于重构技术实现开放终端应用数据与功能的方法,其步骤包括:

1)由应用所有者指定终端应用中欲对外提供接口的数据与功能;

2)利用应用运行环境级别的控制流获取方法,获取在使用步骤1)中指定的功能、数据的运行时的一组控制流及其运行时上下文;

3)对步骤2)获取的控制流及运行时上下文进行程序化分析,生成控制流中每个函数的上下文依赖及这组控制流之间的唤醒关系;

4)通过步骤3)获取的分析结果,重构步骤2)中获取的应用的控制流,生成一组外部可调用的应用编程接口(applicationprogramminginterface,api);

5)通过调用步骤4)中生成的api可使用应用的原有功能、数据,实现开放应用的功能、数据。

进一步地,步骤2)所述的应用运行环境级别的控制流为一组有序的函数调用。

进一步地,步骤2)所述的运行时上下文包括控制流中每个函数调用的参数,和每个函数在内存所读取、写入的数据。

进一步地,步骤2)所述的应用运行环境级别的控制流获取方法包括:

a)修改应用运行环境的内存管理部分,使其支持运行时对内存中的数据(即上下文)进行序列化;

b)修改应用运行环境的实现函数调用相关模块,使其支持记录运行时函数调用次序(即控制流);

c)在上述a)、b)步骤实现的应用运行环境中运行相应的应用,即可获取使用指定的功能、数据时的运行时控制流及其序列化后的上下文信息。

进一步地,步骤3)中的程序化分析方法包括:

a)以应用字节码或代码作为输入,利用静态分析方法,分析每个函数的数据依赖,并结合运行时的上下文信息,将静态分析结果映射至控制流中的每个函数,生成控制流中每个函数调用与上下文的数据依赖关系;

b)以控制流中与控制流切换相关的函数作为输入,分析各个控制流之间的切换,生成控制流之间的唤醒关系,从而构造出跨多个线程的控制流。

进一步地,步骤4)中的重构应用的控制流的方法是:

a)根据函数的对外产生的行为将控制流中的函数分为三类:1.用户界面相关;2.计算逻辑相关;3.其他输入、输出相关;

b)通过程序分析,将每个控制流切分为用户界面相关、计算逻辑相关和其他输入输出相关三个部分的子控制流,同时给出每个子控制流起始的上下文示例,即子控制流函数调用时的函数的参数,及其所依赖的内存中的数据;

c)开发人员根据上述步骤b)给出的示例,选择合适的子控制流,将应用中的功能、数据实现为一组外部可调用的应用编程接口。

本发明提出了一种将现有应用的数据和功能转化为对外以接口的方式提供服务的方法,可以在文档缺失、开发人员缺位的情况下,通过程序自动获取控制流及运行时上下文,并对原控制流进行重构。本发明结合了现有技术的优点,创新性地结合控制流分析与静态代码分析,剥离与应用的功能、数据无关的子控制流以提升生成的对外接口的效率;同时又通过在应用运行环境级别重现特定的上下文环境、复用原应用代码以保证应用功能、获取应用数据的正确性。

附图说明

图1是获取的原始控制流示例。

图2是补充了函数的数据依赖及控制流之间唤醒关系的控制流示例。

图3(a)、图3(b)和图3(c)是控制流重构方法示例,其中图3(a)为应用的原始控制流,图3(b)为生成效率驱动的重构后控制流,图3(c)为执行效率驱动的重构后控制流。

具体实施方式

为使本发明的上述目的、特征和优点能够更加明显易懂,下面通过具体实施例和附图,对本发明做进一步说明。

本发明提供了一种将现有应用的数据和功能转化为对外以接口的方式提供服务的方法。该方法包含三部分内容:1、实现应用运行时控制流及其上下文获取方法;2、控制流中数据依赖关系及控制流唤醒关系;3、应用控制流重构方法。其核心思想是通过修改应用的原有的控制流,保留应用功能核心处理逻辑,达到将现有应用的数据和功能正确并高效地转化为对外以接口的方式提供服务的目的。

本发明的具体技术方案如下:

(1)应用运行时控制流及运行时上下文获取方法。

应用运行时的控制流为一组有序的函数调用。通过修改应用运行环境的帧(frame)结构,可使其支持记录运行时函数调用次序(即控制流)。这组控制流中的每个函数调用都有与其对应的运行时上下文。运行时上下文包括两部分:1.每个函数调用时的参数;2.全局所有函数共享的堆中的数据。为获取上述上下文,可通过修改应用运行环境的栈(stack)、堆(heap)结构,使其支持在运行时对栈、堆结构中的数据(即上下文)进行序列化。通过在进行以上修改后的应用运行环境中运行相应的应用,即可获取使用指定的功能、数据时的运行时控制流及其序列化后的上下文信息。

(2)应用控制流关系及函数数据依赖关系生成方法

除了基本的控制流以外,还需要控制流中每个函数的数据依赖关系及控制流唤醒关系,以便开发人员理解完整控制流,并重现控制流上下文。我们以应用字节码或代码作为输入,利用静态分析方法,分析每个函数的数据依赖,并结合运行时的上下文信息,生成控制流中每个函数调用与内存中数据的依赖关系。

其次,我们以控制流中与线程唤醒相关的函数作为输入,分析各个控制流之间的唤醒关系,从而构造出跨多个线程的控制流。

(3)应用控制流重构方法

控制流可分为用户界面相关、计算逻辑相关和文件、网络等其他输入、输出相关的三个部分。利用(2)中构造的控制流,开发人员可以以不同的目标对原始控制流进行重构。

一方面,开发人员可以以应用编程接口生成效率为目标,对原始控制流进行重构。应用中与用户界面相关的部分往往是读取输入、呈现输出,不仅便于开发人阅读、而且便于理解。因此,以原始控制流为基础,增加对用户界面的读取、写入,即可快速实现将所需的数据与功能封装为应用编程接口。以这种方式生成的应用编程接口由于需要执行用户界面渲染等计算较复杂的,在部分场景下,会导致在执行效率低下,难以满足高并发量的api调用需求。

另一方面,开发人员还可以以应用编程接口执行效率为目标,对原始控制流进行重构。本质上,用户界面相关的函数在整个控制流中仅是提供输入和输出接口的作用,可以完全去除;与输入输出相关的函数往往必须保留(除了部分日志类型输出)。一个可行的控制流重构方案为保留了不可去除的函数及部分计算逻辑相关的函数。不同的的控制流重构方案所需的上下文信息有所区别,以所需的上下文复杂程度作为指标,开发人员可找出一组可行的、高效的控制流重构方案。

实施例:

本节给出开放安卓应用中功能、数据的实现。下面以一个查询数据功能为例,介绍重构过程示例和重构后的运行时体系结构示例。

通过修改安卓应用的运行环境,安卓运行时(androidruntime),使其支持获取上述的应用运行时控制流和上下文。特别地,安卓运行时的内存数据是以对象为单位,保存在一个堆数据结构中。在该修改后的安卓运行时上使用该应用的查询功能,即可得到该查询功能所对应的控制流,如图1所示。图1中带字母的圆角矩形表示函数调用;函数调用上下相叠表示函数之间的调用关系,如b函数中调用了c函数(即产生了c函数调用);六边形表示运行时的对象;对象与函数调用之间的虚线表示该函数调用以该对象作为参数。图1中的控制流为用户通过界面点击查询触发主线程调用a函数,a函数通过获取用户界面上的输入(对象1),唤醒后台线程,调用b函数对输入数据进行进一步整理;随即,主线进入休眠状态;随后由b函数调用c函数构造出相应的数据查询语句(对象2),并唤醒数据查询线程调用d函数发起查询;此时后台线程再次进入休眠状态;d函数调用e函数得到查询结果,重新唤醒后台线程;f函数整理e的输出结果(对象3)并唤醒主线程调用。一方面,上述获取的控制流信息缺少函数调用的数据依赖,例如读、写静态字段(staticfield)等,这将会导致开发人员难以重现完整的运行时上下文环境,导致无法生成正确的应用编程接口。另一方面,上述获取的控制流信息还缺少线程之间的唤醒关系,这会导致上述图中将会对应为五个控制流,而不是一个完整的控制流。

为此,我们以安卓应用的dalvik格式的字节码作为输入,通过静态程序分析,分析出每个函数的数据依赖,并结合运行时的上下文,更精确地描述获取的控制流中的函数调用的数据依赖。其次,我们以控制流中与线程唤醒相关的函数作为输入,构造各个控制流之间的唤醒关系。最终,得出补充了函数数据依赖关系及线程之间唤醒关系的控制流,如图2所示。开发人员可对此控制流开始行进重构。

如上述具体实现方案所述,我们将控制流分为用户界面相关、计算逻辑相关和文件、网络等其他输入、输出相关的三个部分,控制流可简化为如图3(a)所示。

一种以应用编程接口生成效率为目标的控制流重构方案如图3(b)所示。该重构方案以原始控制流为基础,增加对用户界面元素的读取、写入操作(h函数),即完成所需的应用编程接口。

一种以应用编程接口执行效率为目标的控制流重构方案如图3(c)所示。该重构方案完全去除用户界面相关的函数调用(a函数和g函数)和部分输入数据处理逻辑(b函数和c函数),保留核心的数据库查询逻辑(d函数和e函数)和输出结果处理逻辑(f函数),开发人员根据获取的原始控制流的上下文信息,构造这三个函数执行所需的上下文环境(对象2),即可实现将该查询功能封装为一个对外可调用的应用编程接口。

特别地,如果开发人员选取的函数依赖数据复杂,例如会通过运行时动态链接库调用原生c/c++代码,并在c/c++代码中依赖安卓运行时(androidruntime)中的数据,则可实现为在服务器端以虚拟化的方式运行安卓虚拟机,以实现复杂的上下文环境的重现,保证重构后控制流的正确性。

以上实施例针对是对安卓应用及安卓运行时(androidruntime)进行的实施。本方法也可针对不同的字节码、中间代码和源代码及其运行时环境,例如.netframework应用及其运行时;java应用及java虚拟机;javascript应用及其js解释器等进行相应实施。

以上实施例仅用以说明本发明的技术方案而非对其进行限制,本领域的普通技术人员可以对本发明的技术方案进行修改或者等同替换,而不脱离本发明的精神和范围,本发明的保护范围应以权利要求书所述为准。

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