软件学报  2018, Vol. 29 Issue (8): 2198-2209   PDF    
安卓应用用户界面交互模式抽取与检索
吴俊伟1,2, 沈立炜1,2, 郭武楠1,2, 王超1,2, 赵文耘1,2     
1. 复旦大学 计算机科学技术学院, 上海 200433;
2. 上海市数据科学重点实验室(复旦大学), 上海 200433
摘要: 安卓开发者需要通过不断地经验积累来提升其设计安卓界面及行为交互的能力.在数据驱动的软件开发中,代码推荐是其中一个关注热点.在此背景下,提出了一种安卓应用用户界面交互模式抽取与检索方法,提供面向安卓应用的界面相关代码查询与推荐能力,从而降低开发者在选择、试用、学习安卓应用所带来的人工成本.以安卓活动(activity)为单元的界面交互模式代表了活动的界面构成及交互行为,该方法以此为分析目标,从一组开源的安卓应用项目中抽取出每一个活动的界面交互模式.在此基础上,支持用户通过检索的方式获取与其需求相关的活动设计细节.该方法被实现为一组工具链,为抽取与检索提供自动化支持.最后,通过两个案例对该方法的准确性和有效性进行验证.
关键词: 安卓     用户界面交互模式     模式抽取    
UI Interaction Pattern Extraction and Retrieving of Android Applications
WU Jun-Wei1,2, SHEN Li-Wei1,2, GUO Wu-Nan1,2, WANG Chao1,2, ZHAO Wen-Yun1,2     
1. School of Computer Science, Fudan University, Shanghai 200433, China;
2. Shanghai Key Laboratory of Data Science(Fudan University), Shanghai 200433, China
Foundation item: National Natural Science Foundation of China (61402113); National Key Research and Development Program of China (2016YFB1000801)
Abstract: Android developers need to accumulate experience to enhance their ability to design Android interface and behavior. Code recommendation has been one of the focuses in data driven software development. In this context, this paper proposes a method of UI interaction pattern extraction and retrieval for Android applications. The method offers the ability to retrieve and recommend UI related codes, so that developers' effort of selecting, using and learning Android applications can be reduced. The UI interaction pattern of an activity represents the interface composition and the interaction behavior of the activity. Taking the pattern as the target, this method extracts the UI interaction pattern of each activity from a set of open source Android applications. Consequently, the method supports users to retrieve the related design details of activities by constructing queries. The method is implemented as a set of tool chains that provide automatic support for extracting and retrieving. Furthermore, the accuracy and effectiveness of the method are verified by two working examples.
Key words: Android     UI interaction pattern     pattern extraction    

据Gartner统计, 基于安卓操作系统的移动设备出货量逐年剧增, 且安卓操作系统更占据了86.1%的市场份额[1].安卓移动应用的普及, 使得越来越多的从业者进入安卓开发领域.为了提高用户使用移动应用的粘性, 安卓开发者除了必须保证应用的功能正确性之外, 还需要确保应用具有较高的可用性与易用性.

在安卓框架的四大组件中, 活动(activity)是包含用户界面的组件, 是与用户进行交互的直接渠道.用户从提供可视化界面的Activity中获取信息, 例如, 资讯类App(如今日头条)中的新闻页面即是一个Activity的实例, 该页面包含一个列表由上自下列举新闻的概要内容.页面中也包含一个搜索框, 允许用户输入关键字从而检索相关新闻.另一方面, Activity也负责对用户的动作进行响应, 完成数据刷新或页面跳转等功能.例如在上述示例的App中, 用户可通过下拉列表的方式加载最新新闻.另外, 用户也可通过点选列表中的某项新闻内容, 从而使得App跳转至该新闻的详细内容页面.依据安卓编码规范, Activity的开发涉及界面布局和交互逻辑这两个部分.界面布局一般通过定义layout文件来指定该Activity包含的控件以及这些控件之间的位置关系.除此之外, 也可以通过编码方式在运行时动态添加控件.交互逻辑一般通过定义监听器的方式来响应用户在Activity上执行的动作, 例如按钮点击、从下拉框中选择项目等.事件响应一般具有两种效果:一种是影响所在Activity中的其他控件(例如使列表重新刷新), 另一种是跳转至新的Activity.

Activity的开发技术虽然简单, 但其布局与交互逻辑的设计则需要大量的经验积累.在安卓应用可随处获取的情况下, 下载并使用各种类型的App、学习当前流行的Activity设计方案能够为开发者带来启示.然而, 这一方式无法在短期内实现大量应用界面的学习.另外, 对开发者, 尤其是新手而言, 总结出Activity界面的交互逻辑也是较为困难的.

在数据驱动的软件开发中, 代码推荐已经成为其中的关注热点.在此背景下, 本文提出了一种安卓应用用户界面交互模式抽取与检索方法, 在数据驱动的环境中提供面向安卓应用的界面相关代码查询与推荐能力.该方法聚焦于单个Activity的界面构成以及交互行为, 从一组开源的安卓应用项目中抽取出每一个Activity的界面交互模式, 支持用户通过检索的方式获取与其需求相关的Activity设计方案, 从而为用户的开发工作提供帮助.具体而言, 抽取处于预处理阶段, 旨在通过自动化手段分析每一个安卓应用的每一个Activity的界面交互模式, 厘清界面元素的层次结构及其事件行为.检索是预处理完成后面向用户的阶段, 依据用户的设计需求, 从已抽取的界面交互模式中查找出最为接近的Activity界面模式, 并反馈其实现代码和资源.在实现方面, 本文结合并扩展了GATOR与FlowDroid工具组成一条工具链, 为安卓项目Activity界面交互模式的抽取提供自动化手段.另外, 提供一套基于JSON的查询模板(PQT)支持用户对Activity设计需求的表述, 并基于该需求实现相关界面交互模式的检索与结果排序.最后, 本文通过两个实例对本方法的准确性与有效性进行验证.

本文第1节介绍与本文方法相关的研究工作以及依赖的开源工具.第2节介绍方法框架以及每一阶段的方法策略.第3节介绍工具链的设计方案.第4节列举应用案例.最后是本文工作的总结与未来工作的展望.

1 相关工作

开发者在开发过程中, 通过检索获得实例结果的场景属于安卓代码推荐的范畴.在之前的工作中[2], 针对安卓开发中的代码推荐机制进行了经验性研究, 将其分为代码搜索、基本推荐以及高级推荐这3种类型.代码推荐基于用户构造的查询语句, 从各类资源库中查找相关实现, 其搜索层次可覆盖API的使用模式[3]、示例代码[4]等.与这些已有工作相比, 本文提出方法的搜索目标聚焦在Activity的界面交互模式上.

UI分析是与本文方法较为相关的研究领域.Kumar等人提出了名为Webzeitgeist的平台, 支持大规模网页设计的挖掘[5].该平台使用知识发现的技术理解网页的DOM设计决策, 并支持用户查找与其需求相关的网页实例.在此工作的基础上, Deka等人开发了ERICA系统对安卓应用进行交互挖掘[6], 捕获应用设计中的静态(UI布局、可视化细节)和动态(用户流程)决策, 并在此挖掘基础上, 将已有的应用交互分类为23种模式.本文方法受到以上两个工作的启发, 在安卓界面交互模式搜索方面进行了初始的研究.本文同样采用知识发现技术来挖掘安卓应用的界面结构与交互行为, 但将检索的目标局限于单个Activity之上.

安卓应用的界面交互模式是安卓设计中的重要环节, 在该领域中, Nguyen等人提出的REMAUI方法能够分析位图中的界面元素并自动生成针对界面的原生代码[7].Alharbi等人从安卓项目的历史版本中, 通过数据挖掘的方法分析界面设计模式的演化[8].Shirazi等人则分析了大量安卓应用的界面结构, 得到了不同类型应用的界面差异性较大的结论[9], 另外也统计得到了最常出现的界面元素组合模式.与这些工作相比, 本文方法所定义的界面交互模式不仅考虑Activity的元素结构, 同时也将界面元素的事件行为作为检索的重要依据.

本文方法涉及对安卓Activity的界面及其事件行为的分析.当前, 已有诸多技术聚焦在安卓应用分析领域并发布了多种工具实现自动化分析.作为本文工具链中的重要组成部分, GATOR[10]和FlowDroid[11]分别在界面分析和方法调用两方面展示其效果.

GATOR是面向安卓的程序分析工具集, 主要包含两个组件, 分别支持对GUI对象的静态分析以及对事件和回调的控制流分析.前者模拟GUI的对象流、界面相关操作以及这些对象相关联的结构关系, 得到Activities和Listeners相关联的视图[10], 后者则采用上下文敏感分析方法[12]和窗口堆栈的显示建模[13]来实现GUI模型的生成并保证高精度的控制流分析.GATOR工具的输入是编译完成的安卓项目, 通过GUIAnalysisClient接口, 将分析得到的GUI信息输出.另外, 它允许用户定制GUIAnalysisClient接口的实现, 从而支持自定义的数据持久化等能力.

FlowDroid是一个上下文相关、执行顺序相关且用于安卓应用的静态污点分析工具[11], 它可根据安卓中每个组件均具有的回调函数绘制出生命周期相关的控制流图.FlowDroid基于soot和Heros, 使用一个精确的调用图以确保顺序相关和上下文相关; 另一方面, IFDS框架保证了字段相关和对象相关[14].对于一个给定的安卓apk文件, FlowDroid能对其进行分析并产生对应的函数调用关系图.

2 方法介绍 2.1 安卓应用界面交互模式

在本文中, 将界面交互模式(activity_UI_interaction_pattern, 简称AUP)定义为以单个Activity为单元的、表示该Activity内布局结构及其交互行为的信息封装体.图 1展示了安卓应用界面交互模式的元模型以及AUP的规范化定义.

Fig. 1 Meta-Model and normalized definition of UI interaction pattern 图 1 安卓应用界面交互模式的元模型及规范化定义

AUP由一组隶属于特定Activity的View构成, 每一个View是组成安卓界面的视图控件.一组View构成树形结构, 形成了Activity的界面布局.View可分为两种类型, 分别是ViewGroup和Widget.

●  ViewGroup是容纳其他View的容器, 即ViewGroup可以是其他View的父节点.它们用于指定所容纳的其他ViewGroup或Widget之间的相对位置关系.一般而言, ViewGroup是界面上的不可见元素.例如, LinearLayout仅负责将其内部控件按照横向或纵向方向进行排列, ScrollView在界面上展现为一个允许用户上下拖拉的容器.

●  相比之下, Widget是可见的、并且可与用户交互的控件元素.例如, EditText允许用户输入数据, ImageView能够加载并展示一张图片.在由View所构成的界面树形结构中, ViewGroup一般是内部节点, 而Widget一般处在叶子节点的位置.在实现维度, View的层次结构可在项目的layout资源文件中定义.layout内容基于严格的Schema结构, 描述了ViewGroup以及Widget之间的层次关系.安卓开发者也可以通过编码, 灵活地控制界面上的View元素及布局.在AUP的规范化定义中, 一个View是由6项内容构成的元组, 分别是表示View唯一编号的ID、表示其类型的Type(ViewGroup或Widget)、View的全路径类名、展示界面字符的Title、该View在层次树上的父节点(若该View为根节点, 该View的parentView为Activity_Root)以及一组事件句柄(eventHandlerList).

EventHandler(事件句柄)是View响应用户操作的逻辑入口, 一个View可能具有多种事件句柄.由于安卓框架具有事件驱动(event-driven)的特色, 因此赋予了开发者定义事件监听器并在回调函数中实现交互操作的能力.例如, Button控件上可附加Click监听器, 并定义响应事件, 从而使应用程序能够获知用户点击按钮的场景并实现相应的功能.一般可通过4种方式定义事件句柄:匿名内部类、自定义事件监听类、Activity实现事件监听器接口并将Activity作为控件监听器以及在layout文件中定义事件并通过反射方式调用方法.每一个事件句柄具有相应的事件行为.

EventAction(事件行为)是表示EventHandler行为的抽象元素, 表示用户在View上执行动作之后所触发的功能类型.事件行为分为控件影响(WidgetInfluence)与页面跳转(IntentSwitch)两种类型.前者是在事件句柄的回调函数中对其他控件进行了操控, 即调用了本Activity内其他控件的方法.这类行为的信息包括影响的控件对象(一般为可见的Widget对象)以及所施加的影响行为(即调用的方法).例如, 重刷新ListView即是在回调函数中针对ListView的Widget对象调用其onRefresh方法.后者则表示在事件回调函数中离开本Activity并跳转至新的Activity的逻辑过程.将事件行为规范化定义为一个涵盖事件行为类型、影响对象以及影响方法的元组.当该事件行为是页面跳转类型时, 元组中的后两项内容无须填充.

2.2 方法过程

图 2是本文提出的安卓应用界面交互模式抽取与检索方法的框架示意图.

Fig. 2 Framework of UI interaction pattern extraction and retrieving 图 2 安卓应用界面交互模式抽取与检索方法框架

方法主要分为两个阶段.

●  首先, 界面交互模式抽取是从安卓项目代码中构建界面交互模式的阶段.该阶段包含view层次识别、event行为识别以及综合前两项识别结果构建面向Activity界面交互模式这3个子活动.构建出的界面交互模式被持久化存储于界面交互模式库中, 用于后续检索与复用.

●  其次, 界面交互模式搜索是安卓开发者在应用设计过程中向界面交互模式库检索并获得反馈的阶段.开发者将设想中的待开发Activity界面构造为查询请求, 随后, 基于该请求表述从安卓界面交互模式库中检索出具有相关性的Activity实例.同时, 针对返回的结果根据其与实际需求的相似性进行排序.

2.3 界面交互模式抽取

界面交互模式抽取步骤旨在从安卓项目中分析出每一个Activity的界面交互模式, 包括其View层次结构以及交互行为.

得益于GATOR[10]以及FlowDroid[11], 该步骤能够快速地在预处理阶段获得构成Activity界面交互模式的主体内容.

(1) 通过GATOR进行view层次识别

针对一组安卓项目, 使用GATOR工具能够获得每一个安卓App中每一个Activity的View层次结构以及View具有的事件句柄, 即覆盖图 1所示元模型中的虚点图案的元素.GATOR工具针对单个Activity运行后得到层次结构ViewHierarchy, 定义为:

●  ViewHierarchy=ViewList={View}, 即, 一个Activity的UI层次结构是一组View的集合;

●  View=(viewID, viewType, viewName, viewTitle, parentView, eventHandlerList), 与元模型中view的定义一致;

●  EventHandlerList={eventHandler};

●  eventHandler=(eventID, eventType, eventHandlerMethod), 一项事件句柄包括其唯一编号ID、表示其事件类型的Type以及在代码中实现该事件的方法名.

(2) 通过FlowDroid进行event行为分析

FlowDroid可用于分析安卓App内的方法调用关系, 即包括View事件句柄的响应函数中的方法调用.其分析结果表示为如下结构.

●  MethodInvocations={MethodInvocationPair};

●  MethodInvocationPair=(sourceMethod, targetMethod), 即, 由源头方法(调用方)与目标方法(被调用方)所构成的元素对;

●  sourceMethod=(sourceMethodClass, sourceMethodName);

●  targetMethod=(targetMethodClass, targetMethodName), 即, 源头方法与目标方法均由方法所在的类及方法名构成.

(3) 结合GATOR与FlowDroid结果的界面交互模式构建

为了构成图 1所示元模型中的斜线图案元素, 完成单个Activity的界面交互模式的构造, 需要分析并识别事件句柄中涉及的行为动作.

图 3的算法描述了结合GATOR分析结果与FlowDroid分析结果得到完整的界面交互模式(AUP)的过程.

Fig. 3 Algorithm for constructing Activity UI interaction pattern (AUP) 图 3 安卓应用界面交互模式抽取与检索方法框架

该算法的核心点是:将GATOR分析得到的事件句柄方法与FlowDroid分析得到的源头方法进行匹配, 从匹配得到的目标方法中识别行为动作, 按规则将其确定为控件影响动作或者页面跳转动作.

2.4 界面交互模式检索过程

为了使用户能够检索已被抽取的界面交互模式, 本文采用基于JSON的查询模板(PQT)来结构化表述待开发Activity界面的设计需求.后台应用程序能够读取并分析该需求, 实现界面交互模式的检索与结果反馈.

(1) PQT与查询构造

基于PQT的查询实例(query)是一个JSON对象, 用于检索的键包括viewType, viewName, eventssubViews.

●  前两项表示view的类型与类名.

●  events是代表事件句柄与动作的数组, 其中每一项event是由eventTypeeventAction构成的对象, eventAction则是由actionType, targetWidgetinfluenceMethod构成的对象.这几项模板内容与图 1所示元模型对应.

●  subViews表示本view所容纳的子视图数组, 每一个数组元素是嵌套定义的表示view的JSON对象.

PQT可用于描述具一组View, 基于PQT的查询实例通过JSON的方式定义了这组View的属性与层次关系, 查询实例的JSON对象一般是容纳子视图的ViewGroup.另外, PQT模板在使用时也可根据实际需求进行裁剪, 即当需求未涉及某项内容时可移除表示该内容的键.图 4展示了一个查询实例, 该实例表示用户所期望的Activity界面是由一个文本框(TextView)以及一个按钮(Button)所构成, 并且按钮的点击事件会引起文本框内值的改变.

Fig. 4 A query instance based on PQT 图 4 基于PQT的查询实例

(2) 检索与排序

一般而言, 用户在其期望的界面交互模式中更着重于可见控件(widget)的设计, 而对Layout布局则并不是特别关注.为了向用户提供更广泛的界面交互模式反馈, 方法的检索过程将更聚焦于对界面可见Widget元素的匹配, 而忽略Layout等用于控制Widget布局的容器元素.在此基础上, 将针对界面交互模式的检索进一步分为3个层次.

●  第1个层次是最严格的层次, 即搜索符合Widget类型、数量以及事件动作全部条件的Activity界面交互模式,

●  第2个层次相对于第1个层次稍显弱化, 即需要符合Widget类型与数量, 但只需要满足事件句柄条件而不一定满足事件内动作的界面交互模式.第2个层次的查询结果显然涵盖前一个层次, 在给出具体结果时, 为了消除重复, 移除所包含的第1个层次的查询结果.

●  第3个层次是最弱化的层次, 即只需要符合Widget类型与数量, 而不需要匹配事件动作的界面交互模式.同样, 在给出具体结果时, 移除前两个层次的重复部分.

界面交互模式的检索与排序过程如图 5所示, 该过程分为查询条件组织、分条件查询、多层次查询结果合并以及查询结果排序这几项活动.

Fig. 5 Retrieving and sorting process for UI interaction patterns 图 5 界面交互模式的检索与排序过程

1) 从3个检索层次中可知, 满足查询需求的界面交互模式是从已抽取的界面交互模式中通过匹配各项条件过滤得到的.这些条件包括C1, C2和C3:C1指明了特定Widget的类型与数量(例如, 期望在Activity中包含2个Button控件); C2指明了Widget的事件句柄(例如, 期望Activity中的Button控件响应Click事件); C3则指明Widget的事件动作(例如, Button的Click事件能够更改TextView的值).基于此定义, 从基于PQT的查询文本中分类组织这些条件.

2) 使用3类查询条件, 分别从界面交互模式库中匹配得到符合特定条件的中间查询结果(AUP的集合), 分别命名为T1, T2和T3.根据查询条件的语义, T2包含T3, 但T2, T3与T1不一定具有包含关系.

3) 根据不同的检索层次, 通过将不同条件的AUP集合进行取交集与取差集操作, 得到满足特定检索条件的结果, 命名为Res_Level1, Res_Level2和Res_Level3.在第1层次查询中, Res_Level1为T1, T2与T3的交集, 得到符合所有条件的最严格的查询结果; 在第2层次查询中, Res_Level2为T1与T2的交集并且去除属于Res_Level1的重复结果; 在第3层次查询中, Res_Level3为最弱化的T1移除Res_Level1和Res_Level2后得到的结果.

4) 对同一类检索层次中的AUP进行排序, 排序的依据是查询需求与各界面交互模式在Layout层次结构方面的相似性.该相似性数值计算方法借鉴文献[15]所提出的基于树相似度的计算方法:首先, 将各AUP与查询需求组织为层次树形结构, 并将树中节点按照从高层(离根节点近的层次)到低层(离根节点远的层次)的顺序赋予由大到小的权重; 随后, 识别出两棵树中最大公共子树并计算子树中节点的权重总和; 最后计算子树权重总和在两棵树所有节点的权重总和中的比例, 得到AUP与查询需求的相似度数值.相似度越高, 说明该AUP与查询需求的结构更为接近, 在层次中的排名也更靠前.

3 工具实现

本文针对F-Droid中的一组开源安卓项目, 综合已有的安卓分析工具形成了一条工具链, 实现应用界面交互模式的抽取与检索这两个阶段的任务.工具链的架构如图 6所示, 其中, 灰色底色框表示采用已有工具, 白色底色框为自行开发工具或对已有工具的扩展.

Fig. 6 Architecture of the tool chains 图 6 工具链架构

在预处理阶段, 使用该组工具进行抽取的过程包括:

(1) 从F-Droid中获得安卓项目的代码地址, 并使用爬虫工具下载最新版本的安卓项目至本地服务器.

(2) 自动编译安卓源代码, 生成项目的bin目录, 该目录是进行Soot分析(GATOR与FlowDroid均建立在Soot之上)的前提.

(3) 使用GATOR工具对每一个安卓应用进行UI分析, 获得Activity的View层次结构.与Activity相关的代码文件以及资源文件存储至NoSQL数据库(采用MongoDB).在GATOR分析基础上, 通过实现GUIAnalysisClient接口将View结构信息保存至SQL数据库(采用MySQL).

(4) 使用FlowDroid工具对每一个安卓应用进行方法调用分析, 获得每一个应用所对应的gexf文件(可使用Gephi工具打开并展示方法调用图).开发读取gexf文件的应用将方法的调用关系保存至SQL数据库内.

(5) 界面交互模式构造应用程序读取SQL数据库内已存储的GATOR分析结果与FlowDroid分析结果, 依据图 3所示的算法关联事件行为, 并将关联信息扩展至数据库.

在检索阶段, 工具的使用场景包括以下步骤.

(1) 针对用户提供的基于PQT的检索需求, 通过检索请求构造程序将需求转换为一组分类型的SQL查询语句.

(2) 检索请求执行程序将前一阶段构造的SQL查询语句在数据库中进行执行, 得到一组反馈结果.另外, 按照检索层次条件将分类型的SQL返回结果进行取交集与取差集处理.

(3) 检索结果排序与展示程序将对同一层次中的Activity模式根据其与检索需求的接近程度进行排序.最后, 从NoSQL数据库中读取各Activity源文件及相关资源文件, 向用户展示.

在预处理阶段, 通过工具链的执行, 共分析来源于F-Droid的252个App项目, 抽取得到994项Activity界面交互模式, 其中包含的各项模式元素的数量信息见表 1.

Table 1 Number of the elements in the UI interaction patterns obtained by preprocessing analysis 表 1 预处理分析得到的Activity界面交互模式元素数量

4 案例

本节通过两个检索案例来验证本文所提出的方法及工具链.第2个案例通过自定义的基于PQT的查询, 验证检索结果的有效性.

4.1 准确性验证案例

为了验证本方法的准确性, 计划一项控制性实验, 针对已被抽取的某一个安卓App的Activity界面构造对应的基于PQT的查询, 验证检索结果是否符合预期, 即希望该Activity能够作为返回的界面交互模式中的第一排位.选择名为GeoQuiz的应用的QuizActivity活动构造其对应的查询JSON文本(由于篇幅原因, 在此不列出).该需求表示用户需要查找由5个widget组成的界面, 其中包括两个事件类型为click的按钮, 1个文本框, 1个事件类型为click、动作类型为widgetinfluence、影响方法为setText的按钮以及1个事件类型为click、动作类型为intentswitch的按钮.通过检索工具的使用, 获得表 2所列举的3个层次中的满足条件的Activity结果, 并展示了每一个层次中Layout相似性度量的计算值.

Table 2 Search results of the verification case for accuracy 表 2 准确性验证案例的检索结果

4.2 有效性验证案例

为了验证方法的有效性, 自定义界面交互模式检索的需求, 并构造如图 7所示的基于PQT的查询.

Fig. 7 Querying requirement of the verification case for effectiveness based on PQT 图 7 基于PQT的有效性验证案例查询需求

该需求表示用户需要一个由3个菜单项组成的菜单界面, 其中每个菜单项的事件类型为item_selected, 动作类型为intentswitch.

同样地, 经过检索工具的运行, 得到表 3所列检索结果.

Table 3 Search results of the verification case for effectiveness 表 3 有效性验证案例的检索结果

根据检索机制, 所有层次中的查询结果均符合view类型与数量的条件, 因此在其界面中均包含具有3个菜单项的菜单控件.就Widget的事件行为而言, 第1层次中的结果在菜单的设计与交互实现上更符合用户的期望需求, 用户可直接复用Widget的资源定义与事件行为代码.用户也可选择第2层次或第3层次中的查询结果, 在知晓其事件行为并不符合预期的前提下, 仅复用其布局而忽略相关的行为实现.这种结果反馈方式提高了界面交互模式检索的有效性与可用性, 且为用户提供了更加广泛的反馈建议.

5 结论与展望

安卓开发者需要通过不断地学习来提高其设计Activity界面及其交互的能力.为了节省选择、使用App的时间且降低学习的成本, 本文提出的安卓应用界面交互模式抽取与检索方法为开发者提供了一种有效的途径.该方法在预处理阶段分析单个Activity的界面元素构成及交互行为, 在检索阶段支持用户通过查询语言搜索出与其需求最为接近的界面交互模式.

本文所提出的方法以及实现的工具链能够完成基本的安卓界面交互模式抽取与检索能力, 是在针对界面的安卓代码推荐方面的初步尝试.然而, 方法及工具本身仍然存在有待改进的地方, 这些关注点可作为未来研究工作的重点.

●  首先, 目前GATOR分析的结果仅指明了View的层次结构, 但未涉及各个View本身的属性, 例如一个Button的宽度、高度及位置等信息.借鉴Sun等人提出的DroidEagle工具[16], 我们认为, 更丰富的界面特征能够允许户构造更为细节的搜索请求, 并得到更为精准的搜索结果.因此, 下一步将尝试改进GATOR的分析策略, 扩展界面交互模式元素的属性范围.

●  其次, 在现阶段仍然需要依赖用户自行构造基于PQT的查询请求并且预先验证JSON格式的正确性, 这为不熟悉界面结构的用户带来了困难.针对这一问题, 计划在后续的工具研制中采用可视化的方式支持用户对查询需求进行表述, 即允许用户通过拖拽控件、设置属性行为等所见即所得的方式, 将用户的布局设计自动转换为基于PQT的查询以.

●  最后, 用户当前能够查看的检索结果包括Activity的代码与资源文件, 通过这些反馈, 暂时难以让用户获得对模式最直观的感受.因此, 计划在后续工作中增强界面交互模式的展现效果, 其中一种途径是通过可视化的方式(例如针对Activity的截屏或者行为的录像), 让用户直接理解界面.为了达到这个目标, 将尝试在GATOR分析结果上生成Appium[17]脚本, 赋予其自动化跳转至该Activity界面并对其进行截屏的能力.

参考文献
[1]
Gartner says worldwide sales of smartphones grew 9 percent in first quarter of 2017. 2017. http://www.gartner.com/newsroom/id/3725117
[2]
Wu JW, Shen LW, Guo WN, Zhao WY. Code recommendation for android development:How does it work and what can be improved?. Science China Information Sciences, 2017, 60(9): 092111:1–092111:14. http://kns.cnki.net/KCMS/detail/detail.aspx?filename=jfxg201709012&dbname=CJFD&dbcode=CJFQ
[3]
Thung F, Wang S, Lo D, Lawall J. Automatic recommendation of API methods from feature requests. In: Proc. of the IEEE/ACM Int'l Conf. on Automated Software Engineering. 2013. 290-300.
[4]
Jiang H, Nie L, Sun Z, Ren Z, Kong W, Zhang T, Luo X. Rosf: Leveraging information retrieval and supervised learning for recommending code snippets. arXiv:1703.01446,2016. [doi: 10.1109/TSC.2016.2592909]
[5]
Kumar R, Satyanarayan A, Torres C, Lim M, Ahmad S, Klemmer SR, Talton JO. Webzeitgeist: Design mining the Web. In: Proc. of the SIGCHI Conf. on Human Factors in Computing Systems. ACM Press, 2013. 3083-3092.
[6]
Deka B, Huang Z, Kumar R. ERICA: Interaction mining mobile apps. In: Proc. of the 29th Annual Symp. on User Interface Software and Technology. ACM Press, 2016. 767-776.
[7]
Nguyen TA, Csallner C. Reverse engineering mobile application user interfaces with remaui. In: Proc. of the IEEE/ACM Int'l Conf. on Automated Software Engineering. IEEE, 2015. 248-259.
[8]
Alharbi K, Yeh T. Collect, decompile, extract, stats, and diff: Mining design pattern changes in Android apps. In: Proc. of the 17th Int'l Conf. on Human-Computer Interaction with Mobile Devices and Services. ACM Press, 2015. 515-524.
[9]
Shirazi AS, Henze N, Schmidt A, Goldberg R, Schmidt B, Schmauder H. Insights into layout patterns of mobile user interfaces by an automatic analysis of Android apps. In: Proc. of the 5th ACM SIGCHI Symp. on Engineering Interactive Computing Systems. ACM Press, 2013. 275-284.
[10]
Rountev A, Yan D. Static reference analysis for GUI objects in Android software. In: Proc. of the Annual IEEE/ACM Int'l Symp. on Code Generation and Optimization. ACM Press, 2014. 143-153.
[11]
Arzt S, Rasthofer S, Fritz C, Bodden E, Bartel A, Klein J, Traon YL, Octeau D, McDaniel P. Flowdroid: Precise context, flow, field, object-sensitive and lifecycle-aware taint analysis for Android apps. In: Proc. of the Conf. on Programming Language Design and Implementation. ACM Press, 2014. 259-269.
[12]
Yang S, Yan D, Wu H, Wang Y, Rountev A. Static control-flow analysis of user-driven callbacks in Android applications. In: Proc. of the 37th IEEE Int'l Conf. on Software Engineering. IEEE, 2015. 89-99.
[13]
Yang S, Zhang H, Wu H, Wang Y, Yan D, Rountev A. Static window transition graphs for Android. In: Proc. of the 30th IEEE/ACM Int'l Conf. on Automated Software Engineering. IEEE, 2015. 658-668.
[14]
Klieber W, Flynn L, Bhosale A, Jia L, Bauer L. Android taint flow analysis for app sets. In: Proc. of the 3rd ACM SIGPLAN Int'l Workshop on the State of the Art in Java Program Analysis. ACM Press, 2014. 1-6.
[15]
Tekli J, Chbeir R, Yetongnon K. An overview on XML similarity:Background, current trends and future directions. Computer Science Review, 2009, 3(3): 151–173. [doi:10.1016/j.cosrev.2009.03.001]
[16]
Sun M, Li M, Lui JCS. DroidEagle: Seamless detection of visually similar Android apps. In: Proc. of the 8th ACM Conf. on Security & Privacy in Wireless and Mobile Networks. ACM Press, 2015. 1-12.
[17]