APP下载

基于应用描述的Android代码自动生成

2016-12-26江逸舟沈立炜赵文耘

计算机应用与软件 2016年11期
关键词:安卓代码框架

江逸舟 沈立炜 彭 鑫 赵文耘

(复旦大学软件学院 上海 201203)(上海市数据科学重点实验室(复旦大学) 上海 201203)



基于应用描述的Android代码自动生成

江逸舟 沈立炜 彭 鑫 赵文耘

(复旦大学软件学院 上海 201203)(上海市数据科学重点实验室(复旦大学) 上海 201203)

在移动开发领域,安卓应用的开发吸引着广大移动终端厂商和开发者的加入。目前,开发者大多采用传统的方式,基于集成开发环境为安卓应用的每一项组成部分进行设置或编码,这些工作可能花费开发者较多的时间。然而,与应用框架相关的部分代码与配置文件具有类似的模式,通过复用及定制的方式可以有效提高应用的整体开发效率。为了实现这一目标,提出一套借鉴MDA(Model-Driven Architecture)思想的方法,基于安卓应用的描述来完成安卓代码框架部分的自动生成。该方法包括一种描述安卓应用基本元素及其关联关系的元模型,以及一套可复用且支持定制的应用代码模版。基于元模型标准的特定安卓应用的描述可以驱动基于模版的安卓框架代码的自动生成。在该方法基础上,开发Android应用框架自动生成工具,并以一个实例展示了方法与工具的可用性。

Android 模型驱动架构 代码自动生成 元模型

0 引 言

当前,智能终端的普及使得移动应用的需求量不断增长。安卓作为免费、开源的手机平台受到广大开发人员及用户的青睐。安卓应用开发者大多采用传统的方式(由设计至编码),基于集成开发环境(例如Eclipse、Android Studio、Visual Studio等)完成应用的开发工作。在这些工具中,开发者需要为安卓应用的每一项组成部分进行设置或编码,包括应用界面的设计(编写layout文件,或直接通过可视化开发方式进行设计)、核心配置文件的定义(填充Androidmanifest.xml文件)、组成应用的构件的开发(Activity、Service等代码的编写)、构件间跳转关系的实现(Intent代码的编写)等。这些工作可能花费开发者较多的时间。然而,与应用框架相关的部分代码与配置文件具有类似的模式,我们认为这部分的开发工作可以通过复用及定制的方式从而提高应用的开发效率。

针对以上目标,本文提出一套借鉴MDA思想的方法,基于安卓应用的描述来完成安卓代码框架部分的自动生成。MDA指首先建立抽象的、与具体技术无关的模型,随后从抽象模型自动生成应用程序的过程[1]。遵循该过程,本文首先提出一种描述安卓应用的元模型,元模型定义了组成安卓应用的各类元素及其依赖关系。特定安卓应用的模型基于元模型标准,定义了应用的架构,包括名称、属性以及约束关系等。同时,本文方法还提出了一套应用代码模版,其中内嵌了与特定应用相关的可变、可定制的代码部分。在描述应用的模型以及代码模板的基础上本方法涵盖了从元模型所描述元素到代码模版中可变部分的映射过程,支持通过代码生成器自动生成安卓应用的框架,随后开发者可将精力投入在应用业务逻辑的代码编写上。基于本方法,我们实现了安卓应用框架自动生成工具,工具采用GMF[2]图形框架支持用户以可视化的方式设计应用框架,Apache Freemarker[3]代码生成器负责定制模版,生成应用代码框架。

1 相关工作

近年来,针对基于MDA的代码自动生成技术的研究主要包括UML模型的代码自动生成、模型驱动的安卓界面(Graphical user interface)自动生成、基于DSL(Domain Specific Language)元模型以及采用BPMN模型的代码自动生成。

为了提高GUI的开发效率,Silva等[4-10]提出了面向安卓界面自动生成的模型。他们为安卓应用的控件、窗口、事件监听器等建立抽象模型,再将模型转换为代码,自动生成安卓应用界面的代码。本文的研究重点在于创建描述安卓应用的模型,自动生成应用的代码框架,而界面自动生成并非本文考虑的重点。本文仅通过配置实现了简单的线性布局。

在基于UML模型驱动的代码自动生成方面,Parada等[11]采用了UML类图和顺序图为安卓应用建立模型,并建立类图与顺序图的对应关系,然后结合两者自动生成安卓应用代码框架。Kraemer等[12,13]采用UML活动图描述安卓应用,将活动图转换为可执行的状态机,再自动生成安卓应用的代码。由于安卓应用的领域特征,UML统一建模语言不能很好地描述安卓应用,因此本文采用了领域特定的元模型定义组成安卓应用的各类元素。

在DSL的元模型的模型驱动技术方面,Lachga等[6-10]借鉴MDA思想,提出了DSL的建模语言,并开发了安卓界面代码自动生成工具。Madari等[8]为应用的GUI和页面跳转做详细设计,建立了应用整体与不同页面的模型,再将页面之间的跳转通过CR模型(UML活动图)联系起来。本文的元模型定义了组成安卓应用的各类元素,如Activity、Service、BroadcastReceiver等,并通过描述应用的模型为安卓应用的框架建模。

其他研究人员采用BPMN建模语言为应用建模,例如Solis-Martinez等采用BPMN建模语言来描述业务流程,然后生成跨平台的应用[14,15]。模型通过XML格式定义流程模型,经过一定步骤的配置后,实现了与平台无关的应用(Android、IOS)。但他们并没有对具体的应用开发做出详细阐述,仅提出了平台无关的模型。

此外,一些知名公司开发了图形化工具为开发人员带来便利。例如,谷歌与MIT联合开发的一款安卓快速开发工具App Inventor[16],该工具可以使用户通过基于浏览器的工具开发手机应用。用户可以方便地拖放代码块,通过mushup的方式将它们放在一起,产生一个应用程序。由于是由特定的模块组成的,所以具有一定限制性。IBM公司的Rational Rhapsody[17]提供了用于安卓代码框架生成的Eclipse插件,该工具采用UML类图、顺序图为应用建模。但是,该工具的模型配置比较复杂,与代码开发几乎是一一对应的。相比而言,本文提出了领域特定的元模型,并通过描述应用的模型为安卓应用建模,建模过程更加简单直观。

2 描述安卓应用框架的元模型

2.1 元模型适用范围

由于安卓四大组件包括Activity、Service、BroadcastReceiver和Contentprovider[18],每种组件都具有自己的生命周期,承担不同的职责。对于多数应用开发层的应用而言,都由以上四大组件构成,例如业务信息类应用、社交软件、新闻应用等。本文提出的元模型将安卓组件设计为元模型的元素,可适用于多数安卓应用开发程序。而本文提出的元模型对于诸如框架开发类应用(基于安卓操作平台做定制化开发)、底层开发类(驱动开发、JNI)等尚不适用。具体来说,本文提出的元模型可适用于具有以下特征的应用:

(1) 安卓应用包含许多Activity。Activity主要用于显示界面、与用户交互;应用需要实现导航功能,导航指Activity之间的跳转。

(2) 安卓应用需启动后台服务。Activity是安卓应用的主线程,为了保证用户交互流畅,Service可以用于完成长时间执行的后台服务,例如下载文件、播放背景音乐等。

(3) 安卓应用需要监听全局广播。例如,应用需要监听系统广播,如检测WiFi、开机启动、sms消息等。

(4) 安卓应用需要实现组件间通信,我们可以通过绑定服务、动态广播实现组件间的通信功能。

2.2 元模型定义

描述安卓应用的元模型定义了描述安卓应用框架的各个元素及其依赖关系,如图1所示。

图1 描述安卓应用的元模型(类图)

表1给出了具体的元模型的定义,我们将元模型元素按照类别分为组件类、Widget类、事件监听器类、关联类和权限类。

表1 元模型定义表

2.3 元模型依赖关系定义

元模型的依赖关系主要分为以下五个方面:

(1) Transition与EventListener、Intent依赖关系定义

安卓应用组件之间的转移是由事件驱动并由Intent负责传递消息,因此Transition与Intent、EventListener具有关联关系。

(2) Component转移依赖关系定义

我们把Component元素之间的依赖关系定义为Transition元素。Activity元素可以跳转到多个其他的Activity;Activity可以启动多个Service;Component元素可以向多个广播发送通知。Transition必须设置好相应广播的action属性,否则广播将接收不到通知。

(3) Activity、Widget、EventListener依赖关系定义

Activity可以包含多个Widget组件,所以Activity与Widget具有一对多的聚合关系。同样,Widget组件可以触发不同的事件,因此Widget与EventListener也具有一对多聚合关系。

(4) Activity与BroadcastReceiver依赖关系定义

动态广播是安卓应用开发中实现跨进程通信的常用技术。在Activity中可以动态注册BroadcastReceiver。Activity元素与动态的BroadcastReceiver元素具有一对多聚合关系。

(5) Widget与相应的常用事件监听器依赖关系定义

每种安卓控件都具有与常用事件监听器。

3 基于模版的框架代码生成

3.1 基于Freemarker的代码模板

本文采用Freemarker模板引擎自动生成安卓应用的代码模板。Freemarker遵循MVC(model view controller)模式,是一款轻量级的代码生成引擎。Freemarker模板引擎的语法规则类似于脚本语言,本身也具有一些编程能力,例如条件判断、循环嵌套、集合等概念类似于其他编程语言。例如,${}指令表示可以替换为某个变量的值,if/elseif/else表示条件判断,list指令表示循环遍历对象集合,include指令表示嵌套子模板等。本文按照Freemarker的语法规则定义了源代码、布局、配置模板。其中,源代码模板包含了Activity模板、Service模板、BroadcastReceiver模板。在这些模板中,还可以设置内嵌子模板,例如控件模板、Intent模板、bindService模板等。图2展示了上述模板和各个模板之间的依赖关系。

图2 模板类图

本文定义的模板类型非常多,由于篇幅的限制,我们仅展示了其中的一个模板。图3展示了Activity模板,Activity模板主要用于生成Activity类的代码框架,包括引入包、继承Android.app.Activity类、重写Activity的生命周期方法。同时,在onCreate方法中设置该Activity的布局文件、注册动态广播。在onDestory方法中,释放绑定的Service,并且取消注册动态广播。图中的高亮区域显示了代码模板的可变部分。Activity模板中可以包含多个widget、动态广播,还可以绑定多个Service。我们将这部分可嵌套的模板定义为子模板,实现了模板之间的包含关系。例如,在onCreate方法中调用<#include "/Button.ftl">可以在Activity模板中嵌套Button模板。此外,在事件中还可以嵌套Intent模板从而实现Component元素之间的关联关系。

图3 Activity模板

3.2 基于描述模型的代码模板定制

在前文所提出的元模型与代码模板的基础上,我们按照以下转换过程实现框架代码的自动生成,如图4所示。首先,创建基于元模型标准的描述应用的模型,得到模型的XML描述文件。基于Freemarker的模板规则定义一组代码模板,包括安卓应用的源代码、布局、配置文件、子模板等。接着,将XML描述文件和代码模板作为代码生成器的输入。随后,将描述应用的模型映射到代码模板的可变部分,最后生成应用的代码框架。

图4 描述应用的模型到应用代码框架转换图

其中,应用的源代码是应用程序的主体,根据模型和代码映射规则生成的源代码包括用户定制的Activity类、Service类、 BroadcastReceiver类。AndroidManifest.xml配置文件可以定义用户所配置的版本,注册Activity、Service、BroadcastReceiver、Permission等。Layout布局文件是安卓应用程序的界面。我们的工具会根据模型和属性配置,自动为Activity生成相应的布局文件。 图5展示了一个简单的示例,形象地展示了从特定模型到模板中可变部分的映射过程。

图5 Activity绑定Service元模型与模板映射过程图

由于模型的XML定义文件是XML DOM树形式的,我们引入了Dom4j API解析该模型的定义文件,遍历读取该定义文件中的各个节点、属性。同时,为其中的节点建立了Java模型与之一一对应。通过遍历该XML文件,可以得到模型所创建的所有节点。根据Node节点的类型分类,将每个Node节点独立作为一个源文件的输出。例如,XML文件中包含BroadcastReceiver元素,将它注入BroadcastReceiver对象,然后生成对应的java源文件。对于类型是Activity的元素,生成它所包含的组件、事件监听器、布局文件以及生命周期等。如果元素的类型是Service,那么根据他的启动类型,判断是否要绑定Service。对于BroadcastReceiver,判断它是否是静态等还是动态的。如果是静态的广播,那么需生成独立的BroadcastReceiver文件,并在配置文件中注册,否则在代码中动态注册。

4 工具实现与实验

基于上述元模型,实现了Android应用框架自动生成工具。本节首先介绍了工具的架构设计。接着,我们使用该工具实现了一个具体的安卓应用“EBook”,并且展示了运行效果。

4.1 Android应用框架自动生成工具

Android应用框架自动生成工具的主要任务是开发一套能为安卓应用创建描述应用的模型的图形编辑器和自动生成应用代码框架的功能。工具架构主要分为五层,分别为Eclipse Platform、Platform Runtime、Tool Framework、工具层和应用层,如图6所示。

图6 Android应用框架自动生成工具架构图

最底层的Eclipse Platform层代表Eclipse运行时环境。Eclipse是一个开源的平台,可以使各种功能以插件的形式自由组装的IDE,例如GMF、Draw2D、AndroidADT等。Android ADT[19]为开发安卓项目提供了运行时环境。工具框架层提供了图形工具框架、Dom4j XML API、Android SDK所提供的API、代码生成器。本文采用了Apache Freemarker代码生成技术定制代码模板,并且在运行时动态输入数据模型自动生成不同的代码。工具层包括了图形编辑器,该图形编辑器是在GMF的基础上生成的,可以利用该编辑器创建描述安卓应用的模型。工具层还包括我们定义的代码模板、元模型所描述元素到代码模板中可变部分的映射过程、Android工程。我们首先通过EMF[20]创建描述应用的EMF元模型,为了使工具建模更加方便、形象,在元模型的基础上加入了描述流程的节点如Process、Node、Start、End、Edge、Permissions。我们会在模型映射到代码模板的定制过程中,从中提取出符合元模型定义的元素,再将模型转换为最终的代码。然后利用GMF图形框架自动生成描述安卓应用的编辑器。随后,按照Freemarker的模板语法规则定义好安卓应用的代码框架、布局、配置文件。接着,将特定的模型与代码模板的可变部分做映射,完成模型到代码的转换。工具架构图的最上层是应用层,通过该工具,可以快速为安卓应用建模。

4.2 实验案例

EBook是一个简易的电子书应用,提供书籍列表、下载书籍、我的书籍、查看书籍内容的功能。EBook的架构包括手机客户端和服务器端。用户可以在手机客户端下载、翻阅电子书。服务器端则为客户端提供书籍的下载。

我们将使用Android应用框架自动生成工具生成应用的基本框架,再手动编写具体的业务逻辑代码以及服务器代码等。应用包括三个界面BookListActivity、MyBookActivity、BookContentActivity。BookListActivity页面提供许多未下载的书籍,通过列表的形式列出,用户可以点击列表中的书进行下载。进入MyBookActivity可以查看已下载的书籍列表。点击已下载的书籍列表可以查看书籍的内容和信息。

4.3 实 验

实例应用需将BookListActivity设置为起始界面,在BookListActivity中实现Button、List、Menu、TextView以及动态广播。然后,为Button、List加入点击事件监听器。在点击List时启动一个后台的DownLoadService来完成下载书籍的工作。下载完成之后发送Intent到动态广播,告知用户下载已完成。在点击该Button之后跳转到MyBookActivity界面。MyBookActivity包括一个TextView和一个List。List列出了所有已下载的书籍,点击List可以进入第三个界面BookContentActivity。此外,我们还为实例应用添加了安卓应用的常用权限存储卡访问权限、震动权限、Internet访问权限。存储卡访问权限用于保存、读取已下载的书籍。Internet访问权限主要用于下载书籍时访问互联网。震动权限用于发送消息给用户时震动提示用户下载完成。

使用Android应用框架自动生成工具生成实例需要创建一个新的Android工程,并在工程目录下创建应用的模型文件。然后拖拽右侧工具栏的模型元素,定义应用的模型节点和关联关系,例如设置组件之间的跳转,以何种方式启动Service,实现发送广播等。随后,在属性视图完成每个节点的属性定义。最后,使用代码自动生成功能将模型转换为代码,从而得到应用的代码框架,如图7所示。

图7 Android应用框架自动生成工具模型编辑界面

在完成了上述配置后,通过代码自动生成功能可以得到工具自动生成的应用代码框架。我们在该框架的基础上手动添加了业务逻辑代码并且美化了界面。图8显示了EBook的运行效果,图中展示了应用的界面,包括书籍列表、我的书籍、查看书籍内容和版本信息界面。查看书籍内容界面则显示了某一本图书的内容。

图8 示例应用运行图

5 结 语

本文借鉴MDA思想提出了描述应用的元模型。同时,我们定义了代码框架模板并且提出了从元模型所描述元素到代码模板中可变部分的映射方法。基于本文提出的元模型,实现了Android应用框架自动生成工具。该工具可以为安卓应用创建描述应用的模型,生成应用程序的框架,包括源代码、配置文件、布局文件。实验部分通过一个实例演示了Android应用框架自动生成工具的功能。通过实验,体现了Android应用框架自动生成工具可以为开发人员快速构建应用模型,自动生成应用的代码框架。在此框架的基础上继续开发能够有效提高应用开发效率。

在未来的工作中准备为元模型加入ContentProvider元素,使元模型更加完善。其次,本文将Widget与EventListener定义为抽象类型以便后续扩展。因此,可以为Android应用框架自动生成工具添加更多的控件使工具提供更强大的功能。

[1] Kleppe A,Warmer J,Bast W.解析MDA[M].人民邮电出版社,2004.

[2] The Eclipse Foundation.Graphical Modeling Project(GMP)[EB/OL].http://www.eclipse.org/modeling/gmp/.

[3] The Apache Software Foundation.Apache Freemarker[EB/OL].http://fre-emarker.incubator.apache.org/.

[4] Silva L P D,Fernando B E A.Model-Driven GUI Generation and Navigation for Android BIS Apps[C]//Model-Driven Engineering and Software Development (MODELSWARD),2014:400-407.

[5] Sabraoui A,Koutbi M E,Khriss I.GUI code generation for Android applications using a MDA approach[C]//Morocco Complex Systems (ICCS),2012:1-6.

[6] Lachgar M,Abdali A.Generating Android graphical user interfaces using an MDA approach[C]//Information Science and Technology (CIST),2014:80-85.

[7] 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.

[8] Mannadiar R,Vangheluwe H.Modular Synthesis of Mobile Device Applications from Domain-Specific Models[C]//Automated Software Engineering(ASE),2010:21-28.

[9] Madari I,Lengyel L,Levendovszky T.Modeling the User Interface of Mobile Devices with DSLs[C]//8th International Symposium of Hungarian Researchers on Computational Intelligence and Informatics,2007:583-589.

[10] Lachgar M,Abdali A.Modeling and Generating the User Interface of Mobile Devices and Web Development with DSL[J].Journal of Theoretical and Applied Information Technology,2015,72(1):124-132.

[11] Parada A G,Brisolara L B D.A Model Driven Approach for Android Applications Development[C]//Computing System Engineering (SBESC),2012:192-197.

[12] Kraemer F A.Engineering Android Applications Based on UML Activities[M].Model Driven Engineering Languages and Systems,2011,6981:183-197.

[13] Le Goaer O,Barbier F,Cariou E,et al.Android Executable Modeling:Beyond Android Programming[C]//Future Internet of Things and Cloud (FiCloud),2014:411-414.

[14] Solis-Martinez J,Garcia-Menendez N,Bustelo C P G,et al.BPLOM:BPM Level-Oriented Methodology for Incremental Business Process Modeling and Code Generation on Mobile Platforms[J].International Journal of Interactive Multimedia and Artificial Intelligence,2013,2(2):13-27.

[15] SolisMartinez J,Espada J P,GarciaMenendez N,et al.VGPM:Using Business Process Modeling for Videogame Modeling and Code Generation in Multiple Platforms[J].Computer Standards & Interfaces,2015,42:42-52.

[16] AppInventor[EB/OL].http://code.google.com/p/app-invento r-releases/.

[17] RationalRhapsody[EB/OL].http://www.ibm.com/ developerworks/cn/ra-tional/model-driven-development-speed-delivery/index.html.

[18] Application Fundamentals Quickview[EB/OL].http://developer. android.com.

[19] Android Development Tools(ADT) Plugin[EB/OL].http://web.mit.edu/hychenj/MacData/afs/sipb/project/android/docs/tools/sdk/eclipse-adt.html.

[20] Eclipse Modeling Framework(EMF)[EB/OL].http://www.eclipse.rg/mo-deling/emf/o.

ANDROID CODE AUTOMATIC GENERATION BASED ON APPLICATION DESCRIPTION

Jiang Yizhou Shen Liwei Peng Xin Zhao Wenyun

(SchoolofSoftwareEngineering,FudanUniversity,Shanghai201203,China)(ShanghaiKeyLaboratoryofDataScience,FudanUniversity,Shanghai201203,China)

In the field of mobile development, Android application development has attracted many mobile manufacturers and developers. At present, most of the developers use a traditional way to code and configure for each part of the Android application based on the integrated development environments, which takes much time. However, part of the code and configuration files related to application framework may have a similar pattern, and software reuse and customizing can effectively improve the overall development efficiency of application. In order to achieve this goal, this paper puts forward a collection of method making reference to the thought of MDA (Model-Driven Architecture). Within this method, automatically generating android code framework is based on the description of the Android application. The method includes a meta-model which describes elements and associated relationships of Android applications as well as a set of reusable and customization supported code template. Based on the standard of the meta-model, description of a specific android application can drive the android framework to generate automatically based on the code template. Based on the method, this paper developed Android code framework automatic generation tool, and an example is carried out to show the availability of the method and tool.

Android MDA(Model-Driven Architecture) Automatic code generation Meta-model

2016-05-09。国家自然科学基金项目(61402113);国家高技术研究发展计划项目(2013AA01A605)。江逸舟,硕士生,主研领域:软件工程。沈立炜,副教授。彭鑫,教授。赵文耘,教授。

TP311.5

A

10.3969/j.issn.1000-386x.2016.11.040

猜你喜欢

安卓代码框架
iPhone不卡的秘密曝光:安卓也能享受
框架
广义框架的不相交性
文物表情包
创世代码
创世代码
创世代码
创世代码
一种基于安卓系统的手机侧抓包分析方法
关于原点对称的不规则Gabor框架的构造