基于代码片段复用的安卓应用组装技术研究
2016-12-26朱亚迪吴毅坚赵文耘
朱亚迪 吴毅坚 赵文耘
(复旦大学软件学院 上海 201203)(上海市数据科学重点实验室(复旦大学) 上海 200437)
基于代码片段复用的安卓应用组装技术研究
朱亚迪 吴毅坚 赵文耘
(复旦大学软件学院 上海 201203)(上海市数据科学重点实验室(复旦大学) 上海 200437)
安卓系统的开放性和安卓应用开发的较低的技术门槛,吸引了大量开发者加入到安卓应用开发阵营中来。在编码过程中,开发者需要兼顾界面设计和业务逻辑,并手工维护他们的一致性;相似的界面、类似的逻辑也需要开发者手工进行“复制-粘贴”式的开发。提出安卓应用界面和业务逻辑的结构模型,以统一的方式描述安卓应用的界面元素、业务逻辑以及两者的关联,支持将安卓应用的界面代码和业务逻辑代码对应起来。提出可配置的安卓应用结构化描述和组装方法,使得开发人员可以以书写配置文件的方式从业务层面描述应用,并支持界面和业务逻辑代码片段的组装,从而快速构建符合需求的安卓应用。设计了安卓应用开发实验来验证所提方法及技术的有效性。
安卓应用 结构模型 代码片段 复用
0 引 言
安卓系统的开放性和安卓应用开发的较低的技术门槛,吸引了大量开发者加入到安卓应用开发阵营中来。随着安卓应用开发者数量的不断增加,各类安卓应用市场中不断涌现出大量的移动应用,覆盖了人们日常生活中的各个领域。然而,在安卓应用不断丰富、开发者阵营不断扩张的环境下,安卓应用开发的过程和方法却仍然以“从头开发”或者代码的“复制-粘贴”为主。在编码过程中,开发者需要兼顾界面设计和业务逻辑,并手工维护他们的一致性;一些相似的界面、类似的逻辑也需要开发者手工进行“复制-粘贴”式的开发。这种看上去自由、简单的开发方式,导致开发者需要花大量的精力处理开发技术细节,而不能专注于业务本身。如何提升安卓开发人员编码工作的标准化程度,促进领域业务代码的复用,对提升安卓应用开发效率和产品质量有着重要的意义。
安卓应用多运行于移动设备上,移动设备(特别是手机)的显示区域有限,因此大量的应用实际上是遵循一定的设计模式,并且移动应用软件规模小[19],其复杂性比传统的Web应用和桌面应用大大降低。这就给安卓应用的标准化开发和基于复用的开发提供了可能。
本文提出安卓应用界面和业务逻辑的结构模型,以统一的方式描述安卓应用的界面元素、业务逻辑以及两者的关联关系,从而支持将安卓应用开发过程中的界面代码和业务逻辑代码对应起来,降低开发人员人工维护的难度。提出可配置的安卓应用结构化描述和组装方法,使得开发人员可以以书写配置文件的方式从业务层面描述应用,并支持界面和业务逻辑代码片段的自动组装,从而快速构建符合需求的安卓应用。基于该方法,实现了一个代码组装工具,辅助开发者快速创建安卓应用项目。
为了验证所提方法及技术的有效性,设计了一套安卓应用开发实验。实验结果表明,和传统开发方式相比,本文的方法和相应的工具对提高安卓应用开发效率是有帮助的。
1 基于代码片段复用的安卓应用组装技术
1.1 方法概述
安卓应用由于受到显示区域大小的限制,特定模块的界面和业务功能相对简单。因此,我们提出安卓应用界面和业务逻辑的结构模型,以统一的方式描述安卓应用的界面元素、业务逻辑以及两者的关联关系。将界面元素和业务逻辑的实现代码以代码片段的形式提取出来,并保存在代码库中。开发人员依据结构模型编写配置文件对应用模块的界面和业务逻辑进行描述,然后使用代码组装工具对代码片段进行组装,生成安卓应用框架代码。开发人员在此基础上完善核心代码,最终得到可运行的安卓应用。
需要注意的是本文方法关注于安卓应用中的特定模块,即单个Activity所包含的界面和业务逻辑。并且生成的是应用模块的框架代码,具体的业务逻辑还需要开发人员手工实现。
1.2 安卓应用结构模型
安卓应用结构模型如图1所示。
图1 安卓应用结构模型
图1中的安卓应用结构模型描述了应用模块中可能包含的界面元素和业务逻辑,以及两者之间的关系。下面对结构模型中的关键元素进行介绍:
UI:界面元素的总称。用name来唯一表示该元素,并且有一组属性attrs集合用于对界面元素进行描述,map中第一个string表示属性名,第二个string表示属性值。界面元素又可以分为可见的界面元素和不可见的界面元素。
Invisible Component:不可见的界面元素,是界面元素的容器,构成模块界面的框架。不可见的界面元素主要有Container。
Visible Component: 可见的界面元素。是界面中与用户进行交互的基本单位。可见的界面元素要嵌入不可见的界面元素中才能展示出来,这符合安卓应用开发的习惯。可见的界面元素包括Button(按钮)、Input(输入框)、List(列表)、GesturePassword(手势密码)、EncryptInput(加密输入框)、PhoneCode(手机验证码输入框)、PicCode(图片验证码输入框)等。
BusinessLogic:业务逻辑。负责处理用户与界面元素的交互以及相关的业务。有StoreToLocal(存储到本地)、ValidateInput(对输入的内容进行验证)和ClickEvent(处理点击事件)等。
Dependency:业务逻辑的依赖。包括一些安卓应用权限的配置和库的依赖,在开发过程中需要在AndroidManifest.xml和build.gradle文件(本文使用的安卓开发环境为Android Studio)声明,比如对文件进行存储时需要添加WRITE_EXTERNAL_STORAGE和READ_EXTERNAL_STORAGE权限。
CodeSnippet:代码片段。是界面元素和业务逻辑的具体实现代码,分别为视图代码片段和业务代码片段。代码片段是应用开发者在开发过程中编写的一些设计良好的代码,对视图代码片段进行组合能够形成布局文件,即应用的界面;而业务代码片段可能只是业务逻辑的框架代码,需要开发者再此基础上实现具体的业务逻辑。
CodeRepository:代码库。用于对代码片段进行存储、管理。
Module:安卓应用中的模块。一个模块包含若干界面元素和业务逻辑,并用name来唯一表示,description对模块实现的功能进行描述。
Constraint:约束条件。对模块中界面元素的组合嵌套规则进行描述,比如最基本的规则是可见的界面元素要嵌入容器中才能展示出来,具体的规则还要根据模块所要实现功能的业务约束来制定。
Configuration:配置文件。表示某一个模块的具体实现,反映出模块的实现包含了哪些界面元素和业务逻辑,以及界面元素和业务逻辑之间的关联。配置文件中activity和layout分别是需要生成的Activity和布局文件名称,description是相关描述信息。
1.3 代码组装流程
基于代码片段复用的安卓应用组装流程示意如图2所示。其中视图代码片段、业务代码片段、代码库、配置文件分别对应于安卓应用结构模型中的相应元素。
图2 代码组装流程示意图
视图代码片段和业务代码片段分别是结构模型中视图元素和业务逻辑的实现代码。配置文件由结构模型中的界面元素和业务逻辑组成,并建立起结构模型与代码片段之间的对应关系。代码组装工具根据配置文件对代码片段进行组装,生成安卓应用代码。需要注意的是组装工具生成的是应用的框架代码,需要开发人员在此基础上完善代码,最终得到可运行的应用。
1) 代码片段和代码库
代码片段是应用开发过程中由开发人员编写的满足某一功能需求的代码。代码片段分为两种:来自布局文件的视图代码片段和来自Activity的业务代码片段。视图代码片段可能是设计良好的输入框、按钮等,可能对应于单个界面元素也可能对应于多个界面元素;业务代码片段可能是对输入的内容进行校验的代码、处理用户点击事件的代码等。
代码库负责对代码片段进行存储、管理。初始时代码库为空,在应用开发过程中,会产生一些设计良好的代码,开发人员将这些代码提取为代码片段,加入代码库中,便于以后复用。
2) 配置文件
配置文件是由开发者根据需求和安卓应用结构模型来编写的,对应用的界面和功能进行描述。需求最终要实现为应用代码,而配置文件则介于需求和应用代码之间,比需求更形式化而又比代码更简单,具有简洁、直观、便于修改的特点。配置文件以XML的格式存在,其内容构成一棵文档树,树中的节点对应于结构模型中的界面元素或业务逻辑元素。通过编写配置文件来满足可变性需求,由代码组装工具根据配置文件对代码片段进行组装生成应用代码,达到代码复用的目标。
3) 模板
模板是一个包含了占位符的Activity。Activity有多个生命周期[14],应用的业务逻辑需要在特定的生命周期实现,即业务代码片段要插入到相应的生命周期的相应位置处,因此需要在Acitivity模板中不同生命周期的不同位置预留占位符。下面代码预留了$ActivityName、$Activity、$View和$onCreate 四个占位符:
public class $ActivityName extends Activity {
$Activity
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.$View);
ButterKnife.bind(this);
$onCreate
}
}
4) 代码组装工具
代码组装工具根据配置文件对代码块进行组装生成应用代码,组装过程就是完成对配置文件中文档树的遍历,根据配置文件中的节点类型进行如下操作:
(1) 对于配置文件文档树中的Configuration节点,根据节点的layout和activity属性值生成空白的布局文件和Activity模板文件。
(2) 对于配置文件文档树中的界面元素,根据元素的name属性值在代码库中进行检索,得到匹配的视图代码片段,依照配置文件文档树的结构,对代码片段进行组装,形成模块对应的布局文件。
(3) 对于配置文件文档树中的业务逻辑元素,根据元素的name属性值在代码库中进行检索,得到匹配的业务代码片段,按照该业务代码片段中position的值将其插入到Activity模板中相应位置处。
上述操作中一个主要过程是根据配置文件文档树T1构建布局文件文档树T2。最终T2与T1有相同的结构,对于T1中某一界面元素E1,在T2中对应位置节点为E2,E2是代码库中与E1对应的视图代码片段。根据T1构建T2的过程中用到两个队列:Queue1和Queue2。Queue1中队首E1为T1中当前待处理的布局文件中的节点,Queue2中队首元素E1'为与E1对应的E2的父节点。代码生成工具根据E1从代码库中检索,得到与E1相匹配的代码片段E2,将E2作为E1'的子节点插入到T2中。整个过程的伪代码如下:
read configure file and generate layout and activity file
root = configure.getSubElement()
//获取配置文件中Configuration节点的子节点
Queue1.enqueue(root)
//使用队列来对配置文件分层遍历
Queue2.enqueue(templateRoot)
//模板根节点入队
while Queue1 is not empty{
node1 = Queue1.dequeue()
node2 = Queue2.dequeue()
if node1 is a view {
code = findView(node1)
//在代码库中检索匹配对应的视图代码片段
if code is null{
//如果找不到代码则生成注释
generate comment
}else{
node2.append(code)
//将实现代码片段插入生成的布局文件
//如果该节点是容器界面元素,需要将其包含的子节点加入队列
if node1 is a container{
for each subelement of node1{
Queue1.enqueue(subelement)
Queue2.eneuque(code)
}
}
}
}else if node1 is a logic {
code = findLogic(node1)
//查找对应的业务代码片段
if code is null{
generate comment
}else{
insert code into activity by position
//将业务代码片段插入生成的activity文件
}
}
}
上述代码中findView()和findLogic()通过配置文件中界面元素和业务逻辑元素的name属性值与代码库中代码片段的name属性值进行匹配,如图3所示。
图3 配置文件与结构模型和代码片段之间对应关系
2 实 验
2.1 工具实现
我们使用Swing技术实现了一个基于代码片段复用的代码组装工具。开发人员依据业务需求编写配置文件,代码组装工具依据配置文件对代码库中的代码片段进行组装,得到应用的框架代码。开发人员在此基础上完善代码,最终得到可运行的应用代码。
2.2 实验和评价
为了验证所提方法和所开发工具的有效性,我们设计了一套安卓应用开发实验。实验中我们选取了两名计算机软件专业的研究生,他们安卓应用开发水平相当,分别作为实验组和对照组。他们被要求依次完成7个安卓应用登录功能的实现。在开发的过程中,实验组使用本文给出的代码组装工具,可以将开发过程中的代码片段保存入代码库中,并在后续开发任务中编写配置文件。然后使用工具对代码片段进行组装,生成框架代码,在此基础上完善代码。对照组不使用工具,可以使用手工进行“复制-粘贴”的方式开发。
实验组和对照组使用的开发环境都为安卓官方集成开发环境Android Studio,版本为1.5.0.0。实验中一共有7个开发任务,开发者每次新建一个空白安卓项目,Android Studio将自动生成项目的相关文件,然后将该项目加入Git并提交代码。开发者完成每个开发任务后再次提交代码,Git将统计出开发者为了完成开发任务而编写的代码行数(包括实验组配置文件代码行数)。实验结果如图4所示。
图4 代码行数统计图
从图4中可以看出,采用本文提出的方法和工具能够有效地减少开发者的代码量。本文方法和工具对于应用开发者的帮助体现在以下几点:
(1) 可行性。在实验中,实验组使用配置文件对开发需求进行描述,然后使用代码组装工具对代码片段进行组装生成代码框架,最后开发者对代码框架进行代码填充,最终实现为一个可运行的应用。
(2) 提高代码质量。可复用的代码片段具有结构化程度高,易于理解的特点。将可复用的代码片段提取出来并复用到应用开发中有助于提高代码质量。
然而,上述实验有一定的局限性。首先,参与实验的开发人员数量太少;其次,收集的实验数据太少。
3 相关工作
为了提高安卓应用开发的效率,很多组织和研究人员致力于通过代码生成技术生成安卓应用代码。
Android Bootstrap[1]是一个集成了大量模板(包括UI、网络请求库、账户管理等)的安卓应用在线生成工具。使用者只需要输入应用的包名,Android Bootstrap就能生成一个完整的项目,该项目中包含了安卓应用开发中一些常用的模块如登录、滚动的图片、网络请求、Json数据解析以及一些预定义的主题和UI元素(按钮和输入框等)等。然而,Android Bootstrap的整个输入只有一个包名,不支持根据应用的需求进行定制,应用的界面和业务逻辑还需要开发者手工完成。
App Inventor[2]是MIT研发的旨在为所有人,特别是年轻人,展示软件开发的魅力,让他们从软件消费者转变为软件创造者的开源项目。App Inventor提供一个在线开发工具,以图形化的控件来对应用的组件和行为进行表示。使用者通过拖拽控件,像搭积木一样拼凑出一个安卓应用。然而,使用App Inventor开发出的应用与实际应用相比仍有很大差距。
Markus Aleksy[3]从用户界面和功能两方面对应用建立原型,然后复用现有应用的组件来快速开发安卓应用。然而并没有给出如何获取现有应用组件的方法,缺乏对应用组件的管理和维护。
Khambati等[4]创造了一种可视化模型语言[13],使用可视化的模型语言编写配置文件对应用进行描述,并开发出了一个安卓应用生成工具,该工具以配置文件作为输入,生成与医疗保健计划相关的安卓应用。然而该可视化模型语言是针对医疗保健专家而设计的,不是针对安卓应用开发者。另外,使用该工具生成的是安卓应用的安装文件,开发者无法对应用进行修改。
Nguyen等[5]开发出一个能够生成主从模式安卓应用的工具。Li等[6]提出了一种搜索平台,该平台能够搜索安卓应用的界面元素,帮助开发者识别应用中的界面元素,但他们没有给出有效地复用这些界面元素的方法或技术。
Lachgar等[7]采用模型驱动架构的方法设计出一种领域特定语言,在此基础上开发出一个工具,该工具能够生成安卓应用的用户界面。Sabraoui等[8,9]也采用模型驱动架构的方法,设计出基于UML的应用界面生成工具,该工具能够针对不同移动操作系统(iOS、Android、Windows Phone、BlackBerry)生成相应的应用界面。然而上述研究工作生成的应用界面非常简单,并没有考虑到实际应用开发中应用界面的复杂性,不能真正地帮助应用开发者进行快速开发,并且缺乏对应用业务逻辑的支持。
Mojica等[10]借鉴软件产品线和特征模型[11]技术,对安卓系统中的组件进行建模,如Service是运行在后台并且没有用户界面的组件,Activity是一个拥有用户界面并能与用户进行交互的组件。通过定义领域特定语言来对安卓应用的组件和组件之间的关系进行描述,其语法类似Java语言中类的定义,然后开发出代码生成工具AndroidModeler来生成安卓应用的框架代码。然而他们并未对应用的界面进行考虑,并且其定义的领域特定语言语法过于简单,描述能力非常有限,无法对组件的具体功能进行详细的描述。
Barnett等[12]借鉴模型驱动技术能够提高软件开发效率降低成本的特点,开发出一个工具RAPPT,使用领域特定语言来描述安卓应用,进而生成安卓应用工程的框架代码。使用RAPPT生成的工程能够直接导入安卓官方集成开发环境Android Studio。然而开发人员还需要进一步调整生成应用的界面代码,并且RAPPT不支持对应用界面和功能的灵活配置,只能生成与模板应用类似的应用。
一些研究人员对安卓应用的相似性进行了研究。王浩宇等[15]基于代码克隆检测技术对安卓应用进行特征提取,分析应用之间的相似度。闫晋佩等[16]对第三方应用市场中的安卓应用二进制文件中类和方法的相似性进行计算,以此来识别应用重打包。张希远等[17]使用CCFinder工具对应用市场中应用模块代码的相似度进行了研究。焦四辈等[18]提出一种能够识别经过代码混淆后安卓应用相似性的方法。
4 结 语
本文针对安卓应用的特点,提出安卓应用结构模型来对应用模块的界面元素和业务逻辑进行建模。在此基础上,使用配置文件对安卓应用模块的界面和功能进行描述,通过代码组装工具对代码片段进行组装,生成安卓应用框架代码,辅助开发者进行快速开发。
然而,本文提出的安卓应用结构模型还不够完备,不足以描述安卓应用的全貌。采用了XML格式的配置文件来对安卓应用进行描述,而XML中有太多与语义无关的符号如尖括号和引号等。配置文件需要开发人员手工编写,不够方便。在今后的研究中应该提出其他形式的领域特定语言来对安卓应用进行描述。另外,本文的实现工具仍处于原型阶段,在实际应用中还有很多局限性,需要进一步完善,最终开发出能够满足实际安卓应用开发需求的工具。
[1] Android Bootstrap[EB/OL].[2016-1-1].http://www.androidbootstrap.com/.
[2] App Inventor[EB/OL].[2016-3-20].http://appinventor.mit.edu/explore/get-started.html.
[3] Aleksy M.An Approach to Rapid Prototyping of Mobile Applications[C]//Proceedings of the 27th IEEE International Conference on Advanced Information Networking and Applications (AINA),2013:1072-1077.
[4] Khambati A,Grundy J,Warren J,et al.Model-Driven Development of Mobile Personal Health Care Applications[C]//Proceedings of the 23rd IEEE/ACM International Conference on Automated Software Engineering,2008:467-470.
[5] Nguyen T,Vanderdonckt J.User Interface Master Detail Pattern on Android[C]//Proceedings of the 4th ACM SIGCHI Symposium on Engineering Interactive Computing Systems,2012:299-304.
[6] Li Kaiyuan,Xu Zhensheng,Chan Xiangping.A Platform for Searching UI Component of Android Application[C]//Proceedings of 5th International Conference on Digital Home (ICDH),2014:205-210.
[7] Lachgar M,Abdali A.Generating Android graphical user interfaces using an MDA approach[C]//Proceedings of the 2014 Third IEEE International Colloquium in Information Science and Technology (CIST),2014:80-85.
[8] Sabraoui A,Koutbi M E,Khriss I.GUI code generation for Android applications using a MDA approach[C]//International Conference on Complex Systems (ICCS),2012:1-6.
[9] Sabraoui A,Koutbi M E,Khriss I.A MDA-Based Model-Driven Approach to Generate GUI for Mobile Applications[J].International Review on Computers & Software,2013,8(3):844-852.
[10] Mojica I J,Adams B,Nagappan M,et al.A Large-Scale Empirical Study on Software Reuse in Mobile Apps[J].IEEE Software,2014,31(2):78-86.
[11] Ruiz I J M,Nagappan M,Adams B,et al.Understanding reuse in the Android Market[C]//Proceedings of the 20th International Conference on Program Comprehension (ICPC),2012:113-122.
[12] Barnett S,Vasa R,Grundy J.Bootstrapping Mobile App Development[C]//Proceedings of the 37th IEEE International Conference on Software Engineering (ICSE),2015:657-660.
[13] Moody D L.The “Physics” of Notations: A Scientific Approach to Designing Visual Notations in Software Engineering[C]//Proceedings of the 32Nd ACM/IEEE International Conference on Software Engineering-Volume 2,2010:485-486.
[14] Liu Jianye,Yu Jiankun.Research on Development of Android Applications[C]//Proceedings of the 2011 4th International Conference on Intelligent Networks and Intelligent Systems (ICINIS),2011:69-72.
[15] 王浩宇,王仲禹,郭耀,等.基于代码克隆检测技术的Android应用重打包检测[J].中国科学:信息科学,2014,44(1):142-157.
[16] 闫晋佩,何晖,安文欢,等.国内第三方Android应用市场安全性的检测[J].计算机科学,2015,42(12):143-147.
[17] 张希远,张刚,沈立炜,等.多维度的安卓应用相似度分析[J].计算机科学,2016,43(3):199-205.
[18] 焦四辈,应凌云,杨轶,等.一种抗混淆的大规模Android应用相似性检测方法[J].计算机研究与发展,2014,51(7):1446-1457.
[19] 朱洪军,陈灏,华保健,等.移动应用代码保护现状与技术研究[J].计算机应用与软件,2016,33(3):314-319,333.
ANDROID APPLICATION ASSEMBLY TECHNOLOGY STUDY BASED ON CODE SNIPPET REUSE
Zhu Yadi Wu Yijian Zhao Wenyun
(SchoolofSoftware,FudanUniversity,Shanghai201203,China)(ShanghaiKeyLaboratoryofDataScience,FudanUniversity,Shanghai200437,China)
The openness of the Android system and low threshold of Android application development attracted a large number of developers to join in the Android application development camp. In the process of coding, developers need to consider the interface design and business logic, and maintain their consistency by hand. Some similar interface and logic also need developers manually "copy-and-paste". This paper puts forward the interface and business logic structure model of Android application, and describes the Android application interface, business logic, and the relationship between them in a uniform way. The model also supports the correspondence between interface code and business logic code in the development of Android application. We propose a configurable structural description and assembly method of Android applications, which allows developers to write configuration file to describe application from the business level. The method supports the assembly of interface and business logic code snippets to help developers quickly build Android applications conforming to the requirements. In order to verify the effectiveness of the method and technology, we design a set of Android application development experiments.
Android applications Structure model Code snippets Reuse
2016-05-03。国家自然科学基金项目(61402113);国家高技术研究发展计划项目(2013AA01A605)。朱亚迪,硕士生,主研领域:软件复用,移动应用开发。吴毅坚,副教授。赵文耘,教授。
TP3
A
10.3969/j.issn.1000-386x.2016.11.039