基于关键元素差异性分析的微服务更新方法及系统与流程

文档序号:16466525发布日期:2019-01-02 22:49阅读:175来源:国知局
基于关键元素差异性分析的微服务更新方法及系统与流程

本发明涉及计算机软件,尤其涉及一种基于关键元素差异性分析的微服务更新方法及系统。



背景技术:

在移动互联网时代,用户消费内容、获得线上服务的方式主要为移动应用。单个应用中积累了大量服务及用户的使用数据等内容。然而应用之间相互独立的现状,形成了移动应用生态的“信息孤岛”。app间的“信息孤岛”成为场景割裂、应用智能化程度难以提升的重要原因。

通过网构软件行为反射技术,能够在不需要第三方开发者支持的情况下,将安卓应用封装为微服务,为打破移动应用生态的“信息孤岛”现象提供了可能。在不需要第三方配合的情况下,利用网构软件行为反射技术能够将任意安卓应用的任意功能封装为微服务。

网构软件行为反射技术,通过对安卓应用的执行进行完整监测,对运行时模型监测结果进行分析并生成应用微服务。应用行为运行时模型将在运行时环境中作用于内存空间的堆栈区和代码段,从而实现指令级别反射。由于对安卓应用的执行进行监测的结果取决于安卓应用字节码,因此此技术极大地依赖安卓应用字节码及应用微服务相匹配。如果移动应用的字节码发生了变化,那么其运行时环境也会发生变化,将导致之前分析得出的微服务无法与此时的运行时环境相匹配,即应用微服务失效,网构软件行为反射技术无法正常运行。

以下情况会导致应用微服务失效:

1、安卓应用多渠道发布。对于同样的安卓应用,如果在不同的下载渠道发布,可能会采取不同的打包方式。造成应用的源代码发生变化。

2、安卓应用版本升级。安卓应用版本升级分为两种情况,一是网构软件行为反射技术生成的应用微服务对应的源代码逻辑发生了变化;二是逻辑未发生变化。然而,在应用版本升级时,会对应用进行重新混淆、打包,即使生成的应用微服务对应的源代码逻辑未发生变化,也将由于代码混淆而造成运行时模型失效。

3、安卓应用热更新。近年来,很多开发者开始使用应用的热更新框架,采用热补丁的方式,即使不升级安卓应用的版本,也可以实现对应用源码的更新。

这些客观情况都可能导致网构软件行为反射技术稳定性下降,无法持续提供服务。目前,应对这种局面的传统做法是,对安卓应用市场上的应用进行升级监控,一旦发现有应用的升级,立即采取人机协同、半自动化的方式,对该安卓应用微服务进行相应升级。通过长期的实验和测算,每实施一次对微服务的升级、测试、部署等工作,平均需花费1.5人天的开发成本。这些因素使得网构软件行为反射技术的应用成本增大,经济效益降低,产生了技术和应用之间极大的鸿沟。

以上三种造成应用微服务失效的原因,都是在应用发布或版本变化的过程中,安卓应用的字节码发生了一定的变化。本文统一将这种应用的字节码发生改变的情况视为应用版本发生变化,并统一称版本发生变化之前的版本为“旧版本”,版本发生变化后的版本为“新版本”。

安卓应用字节码存储在安卓系统的可执行文件dex文件中。把安卓应用字节码表示为抽象语法树,则抽象语法树变化可以分为两大类:一是抽象语法树的节点本身发生了变化,例如一些token名称的修改;二是抽象语法树的结构发生变化,例如增加一个方法、删除一个域等。在网构软件行为反射技术实际的使用场景中,多数的多渠道发布、版本升级及热更新并未影响所生成的应用微服务的实际逻辑。即抽象语法树的节点本身发生变化,结构未发生变化。本文将这些dex字节码抽象语法树中的节点定义为关键元素,即在同一安卓应用两个不同版本之间,可能导致某一版本的应用所对应的微服务与另一版本的安卓应用产生“二进制不兼容”现象的符号集合。具体到实际的场景中,对应dex字节码的类名、方法名和变量名。

为了解决上文中提到的在版本变化过程中关键元素发生变化的问题,主要面临以下两点挑战:

1、判断版本变化过程中是否发生破坏性变化。在版本变化的过程中,字节码发生的变化可以分为破坏性变化和非破坏性变化两类。如果由于版本变化,使得原有的微服务会给新的安卓应用字节码带来编译错误、运行时异常或者无法得到预期的结果,则为破坏性变化。反之,则为非破坏性变化。对于非破坏性版本变化,安卓应用微服务无需更新仍然能够兼容新版的安卓应用,只有对于破坏性变化,才必须更新安卓应用微服务才能兼容新版的安卓应用。如果缺少系统的判断方法,无法提前预知此安卓应用版本发生的是破坏性变化还是非破坏性变化,即使安卓应用版本发生的是非破坏性变化,开发人员仍然需要采用同样的方式,消耗1.5人天的开发成本,才能得出原安卓应用微服务无需更新即可运行的结论,产生了极大的资源浪费。然而,由于安卓字节码的复杂程度高、运行时环境多变,通过单一的方法很难提前预知安卓应用版本发生的是破坏性变化还是非破坏性变化。

2、待修改的关键元素定位与修改推荐。对于安卓应用版本发生了破坏性变化的情况,需要对旧版本应用微服务中的修改位置进行自动定位,即确定出是由于哪些关键元素发生了变化,而导致旧的应用微服务无法正常工作。由于在对安卓应用进行监测后生成的应用微服务只是一个代码逻辑片段,而要在相比之下非常庞大的安卓应用源代码中找到对应的逻辑片段,并分析其中各关键元素是否发生变化,若发生变化,还要给出相应的修改推荐,这项工作的难度非常高,尤其是如何权衡工作的效率和准确性,成为另一个重要挑战。



技术实现要素:

本发明主要目的在于,提供一种基于关键元素差异性分析的微服务更新方法及系统,以解决现有技术无法准确判断安卓应用在版本变化的过程中是否发生了破坏性变化,以及当安卓应用在版本变化的过程中发生了破坏性变化时无法准确定位需要修改的关键元素和对需要修改的关键元素推荐修改方案的问题。

一种基于关键元素差异性分析的微服务更新方法,包括:

关键元素筛选流程:对与旧版本安卓应用相匹配的微服务中的字节码进行分析,并据此筛选出影响所述微服务与新版本安卓应用之间的匹配的所有关键元素的集合;

关键元素相似度分析流程:分析所述集合中的各关键元素在所述新版本安卓应用与所述旧版本安卓应用之间的相似度;

破坏性变化判断流程:判断所述安卓应用由旧版本变为新版本后,相对于所述微服务是否发生了破坏性变化;

需修改的关键元素定位流程:当所述安卓应用由旧版本变为新版本后,相对于所述微服务发生了破坏性变化时,根据所述各关键元素在所述新版本安卓应用与所述旧版本安卓应用之间的相似度,判断所述集合中的各关键元素在所述安卓应用由旧版本变为新版本后相对于所述微服务是否发生了破坏性变化,并将发生了破坏性变化的关键元素作为所述微服务中需要修改的关键元素;

关键元素修改方案推荐流程:根据所述各关键元素在所述新版本安卓应用与所述旧版本安卓应用之间的相似度,对所述微服务中的每一个需要修改的关键元素,给出修改推荐列表,所述修改推荐列表中包含所述新版本安卓应用中的各关键元素中与所述微服务中的该需要修改的关键元素相似度最高的预设数量的关键元素;

微服务更新流程:对所述微服务中的每一个需要修改的关键元素,根据对该需要修改的关键元素给出的修改推荐列表,将该需要修改的关键元素修改为该修改推荐列表中的一个关键元素,以完成对所述微服务的更新。

进一步地,所述关键元素筛选流程包括:

步骤s1:使用访问者模式对所述微服务的dex字节码进行解析,同时,构造所述微服务的dex字节码的抽象语法树;

步骤s2:遍历所述微服务的dex字节码的抽象语法树,将所述微服务的dex字节码的抽象语法树中所有dex类节点、dex域节点、dex方法节点及dex代码节点中域访问语句和函数调用语句中的类名、方法名和变量名均作为影响所述微服务与所述新版本安卓应用之间的匹配的关键元素加入所述集合。

进一步地,所述关键元素相似度分析流程包括:

关键元素相似度静态分析流程:根据所述旧版本安卓应用的dex字节码和所述新版本安卓应用的dex字节码,分析所述集合中的每一关键元素在所述新版本安卓应用与所述旧版本安卓应用之间的相似度;

关键元素相似度动态分析流程:利用网构软件行为反射框架分别对所述新版本安卓应用和所述旧版本安卓应用的运行时栈模型中的应用活动的情况进行监测,得到所述新版本安卓应用和所述旧版本安卓应用运行时栈模型监测结果;根据所述新版本安卓应用和所述旧版本安卓应用运行时栈模型监测结果,分析所述集合中的每一关键元素在所述新版本安卓应用与所述旧版本安卓应用之间的相似度。

进一步地,所述关键元素相似度静态分析流程中,对于所述集合中的任一关键元素x,分析其在所述新版本安卓应用与所述旧版本安卓应用之间的相似度的步骤包括:

步骤s1:计算关键元素x在所述新版本安卓应用与所述旧版本安卓应用之间的一度相似度,计算方法为:

提取关键元素x在所述新版本安卓应用和所述旧版本安卓应用中的元素内特征,根据关键元素x在所述新版本安卓应用和所述旧版本安卓应用中的元素内特征计算关键元素x在所述新版本安卓应用与所述旧版本安卓应用之间的一度相似度;

步骤s2:判断关键元素x是复杂元素还是简单元素,如果关键元素x是复杂元素,则将所述一度相似度作为关键元素x在所述新版本安卓应用与所述旧版本安卓应用之间的相似度,如果关键元素x是简单元素,则进入步骤s3:

步骤s3:计算关键元素x在所述新版本安卓应用与所述旧版本安卓应用之间的二度相似度,并将所述二度相似度作为关键元素x在所述新版本安卓应用与所述旧版本安卓应用之间的相似度,计算关键元素x在所述新版本安卓应用与所述旧版本安卓应用之间的二度相似度的方法为:

提取关键元素x在所述新版本安卓应用和所述旧版本安卓应用中的元素间特征,根据关键元素x在所述新版本安卓应用和所述旧版本安卓应用中的元素间特征,查找所述新版本安卓应用和所述旧版本安卓应用中与关键元素x相关联的元素,并计算与关键元素x在所述新版本安卓应用中相关联的元素与与关键元素x在所述旧版本安卓应用中相关联的元素之间的相似度,并据此得出关键元素x在所述新版本安卓应用与所述旧版本安卓应用之间的二度相似度。

进一步地,所述关键元素相似度动态分析流程中,对于所述集合中的任一关键元素y,分析其在所述新版本安卓应用与所述旧版本安卓应用之间的相似度的步骤包括:

根据关键元素y在应用活动中的活动发生时间的先后关系,来对计算关键元素y在所述新版本安卓应用与所述旧版本安卓应用之间的相似度。

进一步地,所述破坏性变化判断流程包括:

将所述微服务运行在所述新版本安卓应用上,如果得到的返回值与所述微服务运行在所述旧版本安卓应用上时得到的返回值相同,则判定所述安卓应用由旧版本变为新版本后,相对于所述微服务没有发生破坏性变化,如果出现所述微服务抛出异常、无法运行或者返回的结果不正确的现象,则判定所述安卓应用由旧版本变为新版本后,相对于所述微服务发生了破坏性变化。

进一步地,所述需修改的关键元素定位流程中,对于所述集合中的任一关键元素z,判断其在所述安卓应用由旧版本变为新版本后相对于所述微服务是否发生了破坏性变化的流程包括:

根据所述关键元素相似度静态分析流程的分析结果,计算关键元素z发生非破坏性变化的期望e1;

根据所述关键元素相似度动态分析流程的分析结果,计算关键元素z发生非破坏性变化的期望e2;

当满足e1<t1,且e2<t2时,判定关键元素z在所述安卓应用由旧版本变为新版本后相对于所述微服务发生了破坏性变化,否则判定关键元素z在所述安卓应用由旧版本变为新版本后相对于所述微服务未发生破坏性变化。

进一步地,所述关键元素修改方案推荐流程中,对所述微服务中的任一需要修改的关键元素c,给出所述修改推荐列表的流程包括:

计算所述新版本安卓应用中的所有关键元素与所述旧版本安卓应用中的关键元素c的相似度;

根据相似度由高到低的顺序,对所述新版本安卓应用中的所有关键元素进行排列,得到集合c={c1,c2,c3,…,cn},并将计算得出的各相似度由高到低排列,得到集合s={s1,s2,s3,…,sk,…,sn};

将集合c中的前k个关键元素组成第一列表,其中,(s1-sk)/s1<ε,其中ε为预设临界值;

在最小费用最大网络流中,设定从源点出发到每个旧版本安卓应用的元素节点的容量为n,并将所述新版本安卓应用中与所述关键元素c相似度最高的小于或等于n个的关键元素组成第二列表;

将所述第一列表与所述第二列表结合,组成所述修改推荐列表。

一种基于关键元素差异性分析的微服务更新系统,用于实施上述基于关键元素差异性分析的微服务更新方法中的各流程,包括:

关键元素筛选模块,用于对与旧版本安卓应用相匹配的微服务中的字节码进行分析,并据此筛选出影响所述微服务与新版本安卓应用之间的匹配的所有关键元素的集合;

关键元素相似度分析模块,用于分析所述集合中的各关键元素在所述新版本安卓应用与所述旧版本安卓应用之间的相似度;

破坏性变化判断模块,用于判断所述安卓应用由旧版本变为新版本后,相对于所述微服务是否发生了破坏性变化;

需修改的关键元素定位模块,用于当所述安卓应用由旧版本变为新版本后,相对于所述微服务发生了破坏性变化时,根据所述各关键元素在所述新版本安卓应用与所述旧版本安卓应用之间的相似度,判断所述集合中的各关键元素在所述安卓应用由旧版本变为新版本后相对于所述微服务是否发生了破坏性变化,并将发生了破坏性变化的关键元素作为所述微服务中需要修改的关键元素;

关键元素修改方案推荐模块,用于根据所述各关键元素在所述新版本安卓应用与所述旧版本安卓应用之间的相似度,对所述微服务中的每一个需要修改的关键元素,给出修改推荐列表,所述修改推荐列表中包含所述新版本安卓应用中的各关键元素中与所述微服务中的该需要修改的关键元素相似度最高的预设数量的关键元素;

微服务更新模块,用于对所述微服务中的每一个需要修改的关键元素,根据对该需要修改的关键元素给出的修改推荐列表,将该需要修改的关键元素修改为该修改推荐列表中的一个关键元素,以完成对所述微服务的更新。

与现有技术相比,本发明提供的基于关键元素差异性分析的微服务更新方法及系统,通过对微服务中字节码的分析筛选出需要分析的关键元素集合,并通过对各关键元素在新旧版本安卓应用之间相似度的分析判断安卓应用在版本变化过程中相对于微服务是否发生了破坏性变化,在发生破坏性变化时,通过分析各关键元素在新旧版本安卓应用之间的相似度,判断各关键元素是否发生了破坏性变化,以对微服务中需要修改的关键元素进行定位,并为每个需要修改的关键元素给出修改推荐列表,进而根据修改推荐列表对微服务进行更新,避免了在安卓应用版本发生非破坏性变化时对微服务进行无必要的修改,和对微服务中没必要修改的关键元素进行修改,减少了资源浪费,也提高了微服务升级效率。

附图说明

图1是安卓应用关键元素分析框架结构示意图;

图2是本发明实施例提供的基于关键元素差异性分析的微服务更新方法的总体流程示意图;

图3是使用访问者模式对dex文件进行分析的类图示意图;

图4是抽象语法树的结构;

图5是一度相似度与二度相似度的定义示意图;

图6是一度相似度与二度相似度选择示意图;

图7是安卓应用监测结果类图;

图8是最小费用最大流结构示意图;

图9是应用层总体的流程示意图;

图10是本发明实施例提供的基于关键元素差异性分析的微服务更新系统的总体流程示意图。

具体实施方式

为使本发明的目的、技术方案和优点更加清楚明白,下面结合实施例和附图,对本发明作进一步详细说明。

本发明实施例设计了安卓应用关键元素分析框架。图1所示,该分析框架由3个层次组成,下面介绍分析框架的输入和各个层次的定位。

分析框架的输入是旧版本安卓应用字节码、旧版本安卓应用运行时栈模型监测结果、旧版本微服务、新版本安卓应用字节码和新版本安卓应用运行时栈模型监测结果。

处理层由关键元素筛选流程组成,此流程的输入是旧版本微服务,输出是本发明所需要分析的关键元素。通过对微服务字节码的分析,此流程能够得出本发明需要分析的关键元素,即一些字节码中对本发明目的有关键影响的符号。关键元素对应java代码中的类名、方法名和变量名。

分析层由关键元素相似度静态分析流程和关键元素相似度动态分析流程构成。

关键元素相似度静态分析流程:此流程的输入是关键元素筛选流程得到的本文定义的关键元素、旧版本安卓应用字节码、新版本安卓应用字节码,输出是针对关键元素,旧版本安卓应用字节码和新版本安卓应用字节码经过静态分析后,得出的关键元素在新旧版本安卓应用之间的相似度关系。某一关键元素在新旧版本安卓应用之间的相似度是指,在新版本安卓应用和旧版本安卓应用中都存在这一关键元素,新版本安卓应用中的这一关键元素与旧版本安卓应用中的这一关键元素之间的相似度,就是该关键元素在新旧版本安卓应用之间的相似度。此流程是分析框架的核心流程之一,旨在通过静态分析得到关键元素在新旧版本安卓应用之间的相似度关系。

关键元素相似度动态分析流程:此流程的输入是关键元素筛选流程得到的本文定义的关键元素、旧版本安卓应用运行时栈模型监测结果、新版本安卓应用运行时栈模型监测结果,输出是经动态分析后,关键元素在新旧版本安卓应用之间的相似度关系。此流程也是分析框架的核心流程之一,目的是通过动态分析得出关键元素在新旧版本安卓应用之间的相似度关系,是关键元素相似度静态分析流程的重要补充。

应用层由破坏性变化判断流程、需修改的关键元素定位流程、关键元素修改方案推荐流程构成。

破坏性变化判断流程:此流程的输入是关键元素相似度静态分析流程和关键元素相似度动态分析流程得出的各关键元素在新旧版本安卓应用之间的相似度关系,输出是新版本安卓应用字节码相对于旧版本微服务发生了破坏性变化的可能性,即旧版本微服务与新版本安卓应用在多大程度上会发生“二进制不兼容”现象。破坏性变化判断流程的目的是,判断版本变化的过程中安卓应用是否发生破坏性变化。

需修改的关键元素定位流程:该流程的输入是关键元素相似度静态分析流程和关键元素相似度动态分析流程得出的各关键元素在新旧版本安卓应用之间的相似度关系,输出是安卓应用中每个关键元素发生破坏性变化的可能性。需修改的关键元素定位流程的目的是,定位版本变化的过程中哪些关键元素发生了破坏性变化。

关键元素修改方案推荐流程:此流程的输入是关键元素相似度静态分析流程和关键元素相似度动态分析流程得出的各关键元素在新旧版本安卓应用之间的相似度关系、需修改的关键元素定位流程中定位出的发生破坏性变化的关键元素,输出是对于每个发生变化的关键元素,给出在新版本微服务中应该变化为什么元素的推荐。

如图2所示,本发明实施例提供的基于关键元素差异性分析的微服务更新方法,包括:

关键元素筛选流程:对与旧版本安卓应用相匹配的微服务中的字节码进行分析,并据此筛选出影响微服务与新版本安卓应用之间的匹配的所有关键元素的集合;

关键元素相似度分析流程:分析集合中的各关键元素在新版本安卓应用与旧版本安卓应用之间的相似度;

破坏性变化判断流程:判断安卓应用由旧版本变为新版本后,相对于微服务是否发生了破坏性变化;

需修改的关键元素定位流程:当安卓应用由旧版本变为新版本后,相对于微服务发生了破坏性变化时,根据各关键元素在新版本安卓应用与旧版本安卓应用之间的相似度,判断集合中的各关键元素在安卓应用由旧版本变为新版本后相对于微服务是否发生了破坏性变化,并将发生了破坏性变化的关键元素作为微服务中需要修改的关键元素;

关键元素修改方案推荐流程:根据各关键元素在新版本安卓应用与旧版本安卓应用之间的相似度,对微服务中的每一个需要修改的关键元素,给出修改推荐列表,修改推荐列表中包含新版本安卓应用中的各关键元素中与微服务中的该需要修改的关键元素相似度最高的预设数量的关键元素;

微服务更新流程:对微服务中的每一个需要修改的关键元素,根据对该需要修改的关键元素给出的修改推荐列表,将该需要修改的关键元素修改为该修改推荐列表中的一个关键元素,以完成对微服务的更新。

根据本文定义,关键元素是指在同一安卓应用的两个不同版本之间,可能导致某一版本的应用所对应的微服务与另一版本的安卓应用产生“二进制不兼容”现象的符号集合。本文中的新版本安卓应用与旧版本安卓应用,是同一安卓应用的新版本与旧版本。关键元素筛选流程主要目的在于从微服务中筛选出需要分析的关键元素,关键元素筛选流程包括:

步骤s1:使用访问者模式对微服务的dex字节码进行解析,同时,构造微服务的dex字节码的抽象语法树。访问者模式是一种设计模式,属于行为模式。访问者模式的特点是能够将数据结构与数据操作分离,从而解决稳定的数据结构和易变的数据操作耦合的问题。因为dex字节码的结构相对固定,需要在不同的情况下对dex字节码的结构进行数次遍历,并且需要根据需求增加新的操作,来满足对dex字节码不同情况下的分析需求。

结合dex字节码的结构和组成,本发明实施例设计使用访问者模式对dex文件进行分析的类图如图3所示。首先,对访问者进行设计。定义抽象类dex访问者,作为具体访问者的基类。共涉及4种具体访问者,都继承抽象类dex访问者r,分别为dex类访问者,dex域访问者,dex方法访问者,dex代码访问者。这四类访问者分别在抽象类中定义了未实现的相关visit函数,而继承了这些抽象类的具体访问者类会覆盖这些未定义的抽象方法,以实现当不同的访问者对稳定的数据结构进行访问的时候,会进行不同的操作。接着,为了实现对关键元素的分析和提取,在使用访问者模式对dex字节码进行解析的时候,首先需要定义一个稳定的数据结构。在本文中,定义的数据结构即为dex字节码的抽象语法树结构。定义抽象类节点类dex节点,dex字节码抽象语法树的组成节点包括5种,都继承抽象类dex节点,分别为dex类节点,dex域节点,dex方法节点,dex代码节点,dex语句节点。本文使用访问者模式对dex文件的字节码进行解析的同时,构造了dex字节码的抽象语法树,即完成了对数据结构的定义。

抽象语法树的结构如图4所示,抽象语法树的根节点是dex文件节点,其子节点为dex类节点列表,对应dex字节码中的类。dex类节点中dex域节点列表、dex方法节点列表,分别对应dex字节码中类的成员变量和成员函数。dex方法节点的子节点为dex代码节点,dex代码节点的字节点为dex语句节点列表,对应dex字节码中定义的语句,dex字节码共定义了20种语句。

步骤s2:遍历微服务的dex字节码的抽象语法树,将微服务的dex字节码的抽象语法树中所有dex类节点、dex域节点、dex方法节点及dex代码节点中域访问语句和函数调用语句中的类名、方法名和变量名均作为影响微服务与新版本安卓应用之间的匹配的关键元素加入集合。完成了访问者的设计和数据结构的定义后,根据访问者模式的设计原则,对于每个抽象语法树的节点,本文定义了accept方法,其方法接受访问者基类的参数类型。而当向这个方法中传入具体访问者类的对象时,面向对象的语言会自动调用子类的函数,覆盖基类的函数,这样就完成了对抽象语法树遍历,并在遍历过程中实现不同功能的效果。在后文的关键元素相似度静态分析中,会采用同样的方式对抽象语法树进行遍历和特征提取。

关键元素相似度分析流程包括关键元素相似度静态分析流程和关键元素相似度动态分析流程。

关键元素相似度静态分析流程:根据旧版本安卓应用的dex字节码和新版本安卓应用的dex字节码,分析集合中的每一关键元素在新版本安卓应用与旧版本安卓应用之间的相似度。

具体来说,在关键元素相似度静态分析流程中,对于集合中的任一关键元素x,分析其在新版本安卓应用与旧版本安卓应用之间的相似度的步骤包括:

步骤s1:计算关键元素x在新版本安卓应用与旧版本安卓应用之间的一度相似度,计算方法为:

提取关键元素x在新版本安卓应用和旧版本安卓应用中的元素内特征,根据关键元素x在新版本安卓应用和旧版本安卓应用中的元素内特征计算关键元素x在新版本安卓应用与旧版本安卓应用之间的一度相似度。

步骤s2:判断关键元素x是复杂元素还是简单元素,如果关键元素x是复杂元素,则将一度相似度作为关键元素x在新版本安卓应用与旧版本安卓应用之间的相似度,如果关键元素x是简单元素,则进入步骤s3。

步骤s3:计算关键元素x在新版本安卓应用与旧版本安卓应用之间的二度相似度,并将二度相似度作为关键元素x在新版本安卓应用与旧版本安卓应用之间的相似度,计算关键元素x在新版本安卓应用与旧版本安卓应用之间的二度相似度的方法为:

提取关键元素x在新版本安卓应用和旧版本安卓应用中的元素间特征,根据关键元素x在新版本安卓应用和旧版本安卓应用中的元素间特征,查找新版本安卓应用和旧版本安卓应用中与关键元素x相关联的元素,并计算与关键元素x在新版本安卓应用中相关联的元素与与关键元素x在旧版本安卓应用中相关联的元素之间的相似度,并据此得出关键元素x在新版本安卓应用与旧版本安卓应用之间的二度相似度。

关键元素相似度静态分析包括关键元素特征提取和根据提取的特征进行相似度分析。在关键元素特征提取方面,主要提取关键元素的两类特征:元素内特征和元素间特征。

元素内特征,即关键元素本身的一些描述性属性;元素间特征,即关键元素与其他关键元素之间的关系。通过关键元素的这两种特征,来对关键元素的性质进行刻画,从而为判断不同版本间关键元素的相似性打好基础。下面,以类为例介绍针对类这种关键元素,提取了哪些特征。

类内特征,包括:

1)方法数量:即类的内部定义了多少种方法。

2)指令数量:即类的内部方法中共有多少条指令。指令数量特征与方法数量特征一起可以对类的复杂程度进行描述和判断。

3)指令类型分布:dex字节码共描述了20种语句类型,指令类型分布特征逐一统计了各种语句类型的分布情况,并用一个整型向量对特征进行记录。

4)方法被内部调用次数:此特征反应了类中方法的内聚程度。针对每个方法,分别记录了这个方法在类本身定义的方法中是否被调用1次或调用2次。然后对类的所有方法进行统计,所有方法中有多少方法被内部调用1次或2次。

5)方法被其他类调用次数:此特征反应了类中方法的耦合程度。针对每个方法,记录这个方法在其他类中被调用的次数。

类间特征,包括:

6)继承与实现关系:针对每个类或接口,记录继承它或实现它的类的列表。此特征描述了类之间的关系。

7)引用关系:针对每个类,记录引用其内部方法的其他类的列表。

相似度分析分为两个部分:一度相似度的分析和二度相似度的分析。如图5所示,本文中定义一度相似度为类本身之间的相似度;定义二度相似度为通过与本类有关联的类的相似度来判断的类之间相似度。如果两个类在不同版本的dex字节码中对应相同的类,那么他们各自关联的两个类的列表,其中的类相似度也将是非常高的。正是基于这样的思想,提出了二度相似度的方法,作为对一度相似度只比较类本身的相似度的补充,以帮助提高关键元素相似度分析的准确性。

前面定义了为对类的相似度进行分析而提取的7个特征,从数据类型的角度,这7个特征可以分为数值类特征和非数值类特征两类。其中数值类特征可以直接用于相似度计算,包括方法数量、指令数量、指令类型分布、方法被内部调用次数和方法被其他类调用次数,非数值类则用于记录与其他类之间的关联,不能直接用于计算,包括继承与实现关系、引用关系。对于每个类,定义它的数值类特征的集合为类的特征向量。

对于数值类特征,本文采用cosine相似度的方法来计算两个类的特征向量之间的相似度,即类之间的一度相似度。例如,定义类a的特征向量为<a1,a2,a3,a4,a5>,类b的特征向量为<b1,b2,b3,b4,b5>。则类a与类b的cosine相似度为:

对于非数值类特征,记录了与关注的类相关联的类的列表,则使用cosine相似度分别两两列表中的类的相似度。然后针对老版本的类,对其列表中类的相似度的数值进行降序排序,选择相似度最高的值进行加和,再进行归一化,即得到类之间的二度相似度。

本发明对每一个类根据其复杂度进行了分类,分为复杂类和简单类两种。对于复杂类,使用一度相似度已经基本能够得出较为准确的判断,如果引入二度相似度,不仅在时间效率上给整体带来了损失,甚至有可能会因加入了干扰因素,而导致准确率下降,因此,如图6所示,对于复杂的类,使用一度相似度作为其在新旧版本安卓应用间的相似度,而对于简单类,使用二度相似度作为其在新旧版本安卓应用间的相似度,即通过判断与之产生关联的类的相似度来判断类本身的相似度。因此,当关键元素是复杂元素时,则使用一度相似度作为关键元素在新版本安卓应用与旧版本安卓应用之间的相似度,当关键元素是简单元素时,使用二度相似度作为关键元素在新版本安卓应用与旧版本安卓应用之间的相似度。

关键元素相似度动态分析流程:利用网构软件行为反射框架分别对新版本安卓应用和旧版本安卓应用的运行时栈模型中的应用活动的情况进行监测,得到新版本安卓应用和旧版本安卓应用运行时栈模型监测结果;根据新版本安卓应用和旧版本安卓应用运行时栈模型监测结果,分析集合中的每一关键元素在新版本安卓应用与旧版本安卓应用之间的相似度。

关键元素相似度动态分析流程中,对于集合中的任一关键元素y,分析其在新版本安卓应用与旧版本安卓应用之间的相似度的步骤包括:

根据关键元素y在应用活动中的活动发生时间的先后关系,来对计算关键元素y在新版本安卓应用与旧版本安卓应用之间的相似度。相比于关键元素相似度静态分析,关键元素相似度动态分析的特点是加入了应用执行的时间依赖,即在运行时环境中,通过网构软件行为反射框架完整监测并记录安卓应用的活动,通过分析关键元素在活动中的活动发生时间先后关系,来计算该关键元素在新旧版本安卓应用之间的相似度。关键元素相似度动态分析流程的输入是新旧版本安卓应用运行时栈模型监测结果、关键元素筛选流程得到的关键元素,输出是关键元素在新旧版本安卓应用之间的相似度关系。

关键元素相似度动态分析流程需要用到安卓应用运行时栈模型监测结果。应用网构软件行为反射框架对运行时栈模型中应用活动情况进行全面监测记录,通过对监测记录的分析,可以掌握某一时刻内存栈空间的状态,从而达到对应用逻辑进行分析的目的。本文运用安卓应用运行时栈模型监测结果来对不同版本间的安卓应用中的关键元素进行相似度计算。监测结果如图7所示,栈运行时模型的第一步是建立控制流图,每个控制流对应java线程的执行序列,controlflow类是控制流图的基本单元。threadid表示控制流所对应的线程id;threadstartclock与threadendclock表示线程的开始和结束时间戳;duration表示控制流的时长。method表示此控制流所执行的操作,网构软件行为反射框架将控制流分为6种,分别为方法调用、域的读操作、域的写操作、异常抛出、线程挂起、线程唤醒;method记录了控制流的类型及一些相关信息:若类型为方法调用,则会记录被调用的方法名;若类型为域的读写操作,则会记录被操作的域的名称。args表示方法的参数列表,retval表示方法的返回类型。subflows表示此控制流的子控制流集合,parentflow表示此控制流的父控制流。

从控制流的定义可以得出,控制流是一个树形结构。因此,可以采用深度优先遍历的方法递归地访问控制流。通过在递归访问的过程中记录过程信息,可以获得每个节点的层次信息。这个节点的层次信息在栈运行时模型中对应方法在栈空间上的深度。

当应用进行函数调用的时候,系统会自动在栈空间上为应用分配一块空间,并用寄存器记录函数的桢指针和栈指针。若在函数调用过程中发生了新的函数调用,则系统会通过将返回地址记录在栈上的方式,保存应用运行的上下文信息;之后,将进行新函数调用的空间分配和函数语句执行;当新的函数执行完毕后,将会通过返回地址恢复上下文信息,重新回到原函数的栈空间继续执行。

因此,在栈空间上的深度能够反映方法调用的上下文以及调用的先后关系,是非常重要的运行时信息。本文主要利用方法的栈深作为动态分析的特征,并且辅助方法的函数签名等信息进行关键元素的相似度匹配。对于每个方法,会在对其监测结果进行分析的时候,记录其栈深序列s,栈深序列反应了此函数执行时栈空间的上下文情况,并且时间序列反应了这些上下文情况出现的时间序列。

本发明采用最小费用最大流算法来进行关键元素在新旧版本安卓应用间的相似度计算。最小费用最大流结构图如图8所示,下文将围绕最小费用最大流算法,首先将简要介绍网络流每个组成部分的含义,接着说明算法的合理性,最后给出算法运行的结果以及对应的含义。

源点和汇点:网络流的起始点和终止点,需要不断在源点和汇点之间寻找能够使网络流流量增加的路径。

旧方法节点:每个旧的方法对应一个节点,每个旧方法节点都分别与源点以及每个新方法节点相连;此外,每个旧方法节点也与汇点相连。

新方法节点:每个新的方法对应一个节点,每个新方法节点都分别与汇点以及每个旧方法节点相连。

边的容量:网络流边的容量代表接受多少节点与之相似。从源点出发的边以及汇入汇点的边容量为n,n为人工设定的值,即针对某个旧方法,框架通过网络流最终得到的,推荐相似新方法列表中节点的个数。新旧节点之间边的容量为1,代表每个旧方法与新方法只能进行一次匹配。

边的费用:旧方法与新方法之间的边,费用s表示旧方法与新方法的相似度,在这里,如果相似度越低,则意味着两个点越相似。源点与旧方法节点以及新方法节点与汇点之间的费用为0。另外,每个旧方法与汇点之间也有一条连边,这条边的容量是设定的费用阈值t。

下面,将简要说明最小费用最大流算法的内容和合理性。采用贪心的思想,每次算法执行时,找到一条从源点到汇点的路径,以增加流量;且满足该路径使得增加流量的花费最小;直到无法再找到一条从源点到达汇点的路径,算法结束。由于最大流量有上限,而且算法每执行一次,流量都会有所增加,因此算法肯定会结束,而且同时也会达到网络的最大流量;由于每次都是使用贪心的思想,增加了最小的花费,因此算法结束时,最小花费是所有到达当前流量时花费的最小值。

由于从每个旧方法节点到汇点有一条花费为阈值t的边,因此,如果一个旧方法节点与所有新方法节点的相似度都大于阈值t,那么最小费用最大流算法将直接选择从旧方法节点流入汇点。

由此,可以得出此算法运行后得到的结果:假如设定n=3,则在最后生成的最小费用最大流网络中,对于每个旧方法节点,都会有小于等于3个新方法节点与之相连,表示这些新方法节点与旧方法节点在全局中的类似程度最高。

注意,由于旧方法节点到汇点之间的边存在,有可能存在旧方法节点不与任何新方法节点相连的情况出现,此时则表示此旧方法节点没有找到与之匹配的新方法节点。

破坏性变化判断流程包括:

将微服务运行在新版本安卓应用上,如果得到的返回值与微服务运行在旧版本安卓应用上时得到的返回值相同,则判定安卓应用由旧版本变为新版本后,相对于微服务没有发生破坏性变化,如果出现微服务抛出异常、无法运行或者返回的结果不正确的现象,则判定安卓应用由旧版本变为新版本后,相对于微服务发生了破坏性变化。

破坏性变化判断流程的主要功能是,判断安卓应用版本的变化是否使旧版本的微服务与新版本安卓应用产生“二进制不兼容”问题。应用层的三个主要流程:破坏性变化判断流程、需修改的关键元素定位流程和关键元素修改方案推荐流程之间有很强的关联性。应用层总体的流程图如图9所示。首先将新版本安卓应用和旧版本微服务输入到破坏性变化判断流程中。如果新版本安卓应用未发生破坏性的版本更新,则流程结束。否则,则进入需修改的关键元素定位流程。将静态分析流程和动态分析流程得到的分析结果输入需修改的关键元素定位流程中,对关键元素筛选流程中得到的所有关键元素逐一进行判断,是否需要对其进行修改。如果不需要修改,则循环继续;如果需要进行修改则进入关键元素修改方案推荐流程。

破坏性变化判断流程的设计思想较为直观:将旧版本的微服务运行在新版本的安卓应用上,如果得到了与旧版安卓应用相同的返回值,则说明安卓应用的版本变化是非破坏性的;否则,如果出现微服务抛出异常、无法运行或者返回的结果不正确的现象,则说明安卓应用的版本变化是破坏性的。即完成了本文的第一个目标:判断版本变化发生的变化为非破坏性变化的可能性。

需修改的关键元素定位流程中,对于集合中的任一关键元素z,判断其在安卓应用由旧版本变为新版本后相对于微服务是否发生了破坏性变化的流程包括:

根据关键元素相似度静态分析流程的分析结果,计算关键元素z发生非破坏性变化的期望e1;

根据关键元素相似度动态分析流程的分析结果,计算关键元素z发生非破坏性变化的期望e2;

当满足e1<t1,且e2<t2时,判定关键元素z在安卓应用由旧版本变为新版本后相对于微服务发生了破坏性变化,否则判定关键元素z在安卓应用由旧版本变为新版本后相对于微服务未发生破坏性变化。

需修改的关键元素定位流程的核心思想是判断关键元素是否在版本变化中发生了类名、方法名或变量名的改变。如果旧版本和新版本安安卓应用中的关键元素,在静态分析流程和动态分析流程的输出结果中,与之相似度较高的元素中都包含与其名字相同的元素,那么可以认为此元素发生破坏性变化需要修改的可能性较低,反之,则为此元素发生破坏性变化需要修改的可能性较高。此流程的关键是:对于旧版本安卓应用中的某一关键元素,计算安卓应用发生的变化为非破坏性变化的期望。

对于旧版本安卓应用中的某一关键元素,分析层给出了新版本安卓应用中同类元素与其相似度的评分。其中,动态分析流程给出了有限的相似元素集合,静态分析流程则给出了新版本安卓应用中的所有元素与旧版本安卓应用中的该关键元素的相似度评分。对于动态分析流程给出的结果,比较容易做出判断。前面介绍了动态分析中用到的最小费用最大网络流设计,从源点到旧方法节点的边容量为n,代表网络流算法运行结束后,会有小于等于n的新方法节点,与旧方法节点相连,这些节点即为网络流算法运行结束后,得出的与旧方法节点最为接近的新方法推荐列表。对于任意旧方法节点m,由于在动态分析流程中,节点之间的花费越低,节点间的相似度越高,将与之匹配的新方法列表的花费进行增序排列,并记这与个旧方法节点匹配的新方法列表为:

m={m1,m2,m3,…,mn}

另外,设一个分布:

f={p1,p2,p3,…,pn}

若存在m=mi(i∈{1,2,…,n}),则记此方法元素可能发生非破坏性变化的期望为:

e=pi*1

否则,记此方法元素可能发生非破坏性变化的期望为0。

其次,对于静态分析给出的结果,可以采取相似的手段对元素发生破坏性变化的期望进行计算。但是需要先解决一个问题:由于动态分析流程依靠网络流流量n限制了与旧版本安卓应用中的元素匹配的新元素列表长度,因此,得到的都是与旧版本安卓应用中的元素有一定相似性的新元素。但是静态分析会对新版本安卓应用的所有元素与旧版本安卓应用中的元素相匹配并求相似度,这样的效率是很低的;而且事实上,对于元素的相似列表,随着相似度的排序递增,发生变化为非破坏性变化的可能性锐减。因此,没有必要对新版本安卓应用的全部元素进行分析和匹配。首先需要选取一个进行匹配的新版本元素列表,接下来,可以采用与动态分析相同的方法来计算,从静态分析的结果出发,关键元素发生非破坏性变化的期望。最后,可以用一定的权重,将静态分析流程与动态分析流程得到的期望进行整合,得到此元素发生的变化为非破坏性变化期望的最终结果。

最后,需要结合此元素发生破坏性变化的期望,给出其是否需要被修改的判断。对于任意需要进行匹配的关键元素,记其在静态分析中发生非破坏性变化的期望为e1,在动态分析中发生非破坏性变化的期望为e2。记安卓应用关键元素差异性分析框架中,判断元素发生非破坏性变化的阈值为t1,动态分析中,元素发生非破坏性变化的阈值为t2。若满足e1<t1,且e2<t2,则判断此元素发生破坏性变化,需要在接下来的流程中对其进行修改。因此把这个元素加入待修改元素列表中,当对所有元素运行此方法完毕后,整体输出的列表即为旧版本安卓应用中的待修改元素列表。

关键元素修改方案推荐流程中,对微服务中的任一需要修改的关键元素c,给出修改推荐列表的流程包括:

计算新版本安卓应用中的所有关键元素与旧版本安卓应用中的关键元素c的相似度;

根据相似度由高到低的顺序,对新版本安卓应用中的所有关键元素进行排列,得到集合c={c1,c2,c3,…,cn},并将计算得出的各相似度由高到低排列,得到集合s={s1,s2,s3,…,sk,…,sn};

将集合c中的前k个关键元素组成第一列表,其中,(s1-sk)/s1<ε,其中ε为预设临界值;

在最小费用最大网络流中,设定从源点出发到每个旧版本安卓应用的元素节点的容量为n,并将新版本安卓应用中与关键元素c相似度最高的小于或等于n个的关键元素组成第二列表;

将第一列表与第二列表结合,组成修改推荐列表。

对任意旧版本安卓应用中的元素c,静态分析流程给出的结果是,新版本安卓应用中所有同类的元素与该元素的相似度。由于静态分析流程主要依据元素的一些静态特征对元素进行相似度匹配,很难判断新版本安卓应用中有多少元素有与该元素非常相似的特征。因此不采用固定列表长度的方法,否则可能会导致方法的召回率急速降低。需要根据相似度的分布动态调整新方法推荐列表的长度。对任意旧版本安卓应用中的元素c,计算新版本安卓应用中所有元素与旧版本安卓应用中的元素c的相似度,并且将相似度进行降序排列后,记此集合为:

c={c1,c2,c3,…,cn}

其相似度值的集合为:

s={s1,s2,s3,…,sn}

由于静态分析流程中,相似度的值越高,越有可能发生非破坏性变化,则推荐流程得出的推荐列表为集合c的前k个元素的集合,其中k是满足下面公式的最大正整数:

(s1-sk)/s1<ε

其中ε是定义的临界值,需要根据实际的使用场景来调整到最合适的值。则得到了静态分析流程中,与旧版本安卓应用中的元素c匹配的新元素集合:

c'={c1,c2,c3,…,ck}

对于动态分析的结果,则比较容易理解。在最小费用最大网络流中,设定从源点出发到每个旧版本安卓应用元素节点的容量为n,则表示对于每个旧版本安卓应用元素节点,会有小于等于n个新版本安卓应用元素与之相似度最高。那么这个长度小于等于n的列表则为推荐流程推荐结果。可以根据需要,动态地调整n的大小,以获得期望的准确率和召回率。

结合动态分析流程和静态分析流程得出的相似元素列表,将完成对关键元素的修改推荐。对于待修改的元素,本文中的关键元素修改方案推荐流程只能给出一个修改方案的推荐列表,不能直接给出精确的修改元素;但是修改推荐列表可以辅助程序员实现微服务升级的效率提高,而且由于列表是有限的,可以采用遍历列表的方式,辅以微服务的自动测试方法,有可能能够实现的微服务自动升级。

如图10所示,本发明实施例还提供了一种基于关键元素差异性分析的微服务更新系统,用于实施上述基于关键元素差异性分析的微服务更新方法中的各流程,包括:

关键元素筛选模块1,用于对与旧版本安卓应用相匹配的微服务中的字节码进行分析,并据此筛选出影响所述微服务与新版本安卓应用之间的匹配的所有关键元素的集合;

关键元素相似度分析模块2,用于分析所述集合中的各关键元素在所述新版本安卓应用与所述旧版本安卓应用之间的相似度;

破坏性变化判断模块3,用于判断所述安卓应用由旧版本变为新版本后,相对于所述微服务是否发生了破坏性变化;

需修改的关键元素定位模块4,用于当所述安卓应用由旧版本变为新版本后,相对于所述微服务发生了破坏性变化时,根据所述各关键元素在所述新版本安卓应用与所述旧版本安卓应用之间的相似度,判断所述集合中的各关键元素在所述安卓应用由旧版本变为新版本后相对于所述微服务是否发生了破坏性变化,并将发生了破坏性变化的关键元素作为所述微服务中需要修改的关键元素;

关键元素修改方案推荐模块5,用于根据所述各关键元素在所述新版本安卓应用与所述旧版本安卓应用之间的相似度,对所述微服务中的每一个需要修改的关键元素,给出修改推荐列表,所述修改推荐列表中包含所述新版本安卓应用中的各关键元素中与所述微服务中的该需要修改的关键元素相似度最高的预设数量的关键元素;

微服务更新模块6,用于对所述微服务中的每一个需要修改的关键元素,根据对该需要修改的关键元素给出的修改推荐列表,将该需要修改的关键元素修改为该修改推荐列表中的一个关键元素,以完成对所述微服务的更新。

上述各模块与上述基于关键元素差异性分析的微服务更新方法中的各流程相对应,用于实施上述基于关键元素差异性分析的微服务更新方法中的各流程,各模块的工作原理、工作过程等可参考上述基于关键元素差异性分析的微服务更新方法中的各流程的描述,在此不再赘述。

上述实施例仅为优选实施例,并不用以限制本发明的保护范围,在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。

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