朱亞迪 吳毅堅(jiān) 趙文耘
(復(fù)旦大學(xué)軟件學(xué)院 上海 201203)(上海市數(shù)據(jù)科學(xué)重點(diǎn)實(shí)驗(yàn)室(復(fù)旦大學(xué)) 上海 200437)
?
基于代碼片段復(fù)用的安卓應(yīng)用組裝技術(shù)研究
朱亞迪 吳毅堅(jiān) 趙文耘
(復(fù)旦大學(xué)軟件學(xué)院 上海 201203)(上海市數(shù)據(jù)科學(xué)重點(diǎn)實(shí)驗(yàn)室(復(fù)旦大學(xué)) 上海 200437)
安卓系統(tǒng)的開放性和安卓應(yīng)用開發(fā)的較低的技術(shù)門檻,吸引了大量開發(fā)者加入到安卓應(yīng)用開發(fā)陣營(yíng)中來(lái)。在編碼過(guò)程中,開發(fā)者需要兼顧界面設(shè)計(jì)和業(yè)務(wù)邏輯,并手工維護(hù)他們的一致性;相似的界面、類似的邏輯也需要開發(fā)者手工進(jìn)行“復(fù)制-粘貼”式的開發(fā)。提出安卓應(yīng)用界面和業(yè)務(wù)邏輯的結(jié)構(gòu)模型,以統(tǒng)一的方式描述安卓應(yīng)用的界面元素、業(yè)務(wù)邏輯以及兩者的關(guān)聯(lián),支持將安卓應(yīng)用的界面代碼和業(yè)務(wù)邏輯代碼對(duì)應(yīng)起來(lái)。提出可配置的安卓應(yīng)用結(jié)構(gòu)化描述和組裝方法,使得開發(fā)人員可以以書寫配置文件的方式從業(yè)務(wù)層面描述應(yīng)用,并支持界面和業(yè)務(wù)邏輯代碼片段的組裝,從而快速構(gòu)建符合需求的安卓應(yīng)用。設(shè)計(jì)了安卓應(yīng)用開發(fā)實(shí)驗(yàn)來(lái)驗(yàn)證所提方法及技術(shù)的有效性。
安卓應(yīng)用 結(jié)構(gòu)模型 代碼片段 復(fù)用
安卓系統(tǒng)的開放性和安卓應(yīng)用開發(fā)的較低的技術(shù)門檻,吸引了大量開發(fā)者加入到安卓應(yīng)用開發(fā)陣營(yíng)中來(lái)。隨著安卓應(yīng)用開發(fā)者數(shù)量的不斷增加,各類安卓應(yīng)用市場(chǎng)中不斷涌現(xiàn)出大量的移動(dòng)應(yīng)用,覆蓋了人們?nèi)粘I钪械母鱾€(gè)領(lǐng)域。然而,在安卓應(yīng)用不斷豐富、開發(fā)者陣營(yíng)不斷擴(kuò)張的環(huán)境下,安卓應(yīng)用開發(fā)的過(guò)程和方法卻仍然以“從頭開發(fā)”或者代碼的“復(fù)制-粘貼”為主。在編碼過(guò)程中,開發(fā)者需要兼顧界面設(shè)計(jì)和業(yè)務(wù)邏輯,并手工維護(hù)他們的一致性;一些相似的界面、類似的邏輯也需要開發(fā)者手工進(jìn)行“復(fù)制-粘貼”式的開發(fā)。這種看上去自由、簡(jiǎn)單的開發(fā)方式,導(dǎo)致開發(fā)者需要花大量的精力處理開發(fā)技術(shù)細(xì)節(jié),而不能專注于業(yè)務(wù)本身。如何提升安卓開發(fā)人員編碼工作的標(biāo)準(zhǔn)化程度,促進(jìn)領(lǐng)域業(yè)務(wù)代碼的復(fù)用,對(duì)提升安卓應(yīng)用開發(fā)效率和產(chǎn)品質(zhì)量有著重要的意義。
安卓應(yīng)用多運(yùn)行于移動(dòng)設(shè)備上,移動(dòng)設(shè)備(特別是手機(jī))的顯示區(qū)域有限,因此大量的應(yīng)用實(shí)際上是遵循一定的設(shè)計(jì)模式,并且移動(dòng)應(yīng)用軟件規(guī)模小[19],其復(fù)雜性比傳統(tǒng)的Web應(yīng)用和桌面應(yīng)用大大降低。這就給安卓應(yīng)用的標(biāo)準(zhǔn)化開發(fā)和基于復(fù)用的開發(fā)提供了可能。
本文提出安卓應(yīng)用界面和業(yè)務(wù)邏輯的結(jié)構(gòu)模型,以統(tǒng)一的方式描述安卓應(yīng)用的界面元素、業(yè)務(wù)邏輯以及兩者的關(guān)聯(lián)關(guān)系,從而支持將安卓應(yīng)用開發(fā)過(guò)程中的界面代碼和業(yè)務(wù)邏輯代碼對(duì)應(yīng)起來(lái),降低開發(fā)人員人工維護(hù)的難度。提出可配置的安卓應(yīng)用結(jié)構(gòu)化描述和組裝方法,使得開發(fā)人員可以以書寫配置文件的方式從業(yè)務(wù)層面描述應(yīng)用,并支持界面和業(yè)務(wù)邏輯代碼片段的自動(dòng)組裝,從而快速構(gòu)建符合需求的安卓應(yīng)用?;谠摲椒?,實(shí)現(xiàn)了一個(gè)代碼組裝工具,輔助開發(fā)者快速創(chuàng)建安卓應(yīng)用項(xiàng)目。
為了驗(yàn)證所提方法及技術(shù)的有效性,設(shè)計(jì)了一套安卓應(yīng)用開發(fā)實(shí)驗(yàn)。實(shí)驗(yàn)結(jié)果表明,和傳統(tǒng)開發(fā)方式相比,本文的方法和相應(yīng)的工具對(duì)提高安卓應(yīng)用開發(fā)效率是有幫助的。
1.1 方法概述
安卓應(yīng)用由于受到顯示區(qū)域大小的限制,特定模塊的界面和業(yè)務(wù)功能相對(duì)簡(jiǎn)單。因此,我們提出安卓應(yīng)用界面和業(yè)務(wù)邏輯的結(jié)構(gòu)模型,以統(tǒng)一的方式描述安卓應(yīng)用的界面元素、業(yè)務(wù)邏輯以及兩者的關(guān)聯(lián)關(guān)系。將界面元素和業(yè)務(wù)邏輯的實(shí)現(xiàn)代碼以代碼片段的形式提取出來(lái),并保存在代碼庫(kù)中。開發(fā)人員依據(jù)結(jié)構(gòu)模型編寫配置文件對(duì)應(yīng)用模塊的界面和業(yè)務(wù)邏輯進(jìn)行描述,然后使用代碼組裝工具對(duì)代碼片段進(jìn)行組裝,生成安卓應(yīng)用框架代碼。開發(fā)人員在此基礎(chǔ)上完善核心代碼,最終得到可運(yùn)行的安卓應(yīng)用。
需要注意的是本文方法關(guān)注于安卓應(yīng)用中的特定模塊,即單個(gè)Activity所包含的界面和業(yè)務(wù)邏輯。并且生成的是應(yīng)用模塊的框架代碼,具體的業(yè)務(wù)邏輯還需要開發(fā)人員手工實(shí)現(xiàn)。
1.2 安卓應(yīng)用結(jié)構(gòu)模型
安卓應(yīng)用結(jié)構(gòu)模型如圖1所示。
圖1 安卓應(yīng)用結(jié)構(gòu)模型
圖1中的安卓應(yīng)用結(jié)構(gòu)模型描述了應(yīng)用模塊中可能包含的界面元素和業(yè)務(wù)邏輯,以及兩者之間的關(guān)系。下面對(duì)結(jié)構(gòu)模型中的關(guān)鍵元素進(jìn)行介紹:
UI:界面元素的總稱。用name來(lái)唯一表示該元素,并且有一組屬性attrs集合用于對(duì)界面元素進(jìn)行描述,map中第一個(gè)string表示屬性名,第二個(gè)string表示屬性值。界面元素又可以分為可見的界面元素和不可見的界面元素。
Invisible Component:不可見的界面元素,是界面元素的容器,構(gòu)成模塊界面的框架。不可見的界面元素主要有Container。
Visible Component: 可見的界面元素。是界面中與用戶進(jìn)行交互的基本單位??梢姷慕缑嬖匾度氩豢梢姷慕缑嬖刂胁拍苷故境鰜?lái),這符合安卓應(yīng)用開發(fā)的習(xí)慣??梢姷慕缑嬖匕˙utton(按鈕)、Input(輸入框)、List(列表)、GesturePassword(手勢(shì)密碼)、EncryptInput(加密輸入框)、PhoneCode(手機(jī)驗(yàn)證碼輸入框)、PicCode(圖片驗(yàn)證碼輸入框)等。
BusinessLogic:業(yè)務(wù)邏輯。負(fù)責(zé)處理用戶與界面元素的交互以及相關(guān)的業(yè)務(wù)。有StoreToLocal(存儲(chǔ)到本地)、ValidateInput(對(duì)輸入的內(nèi)容進(jìn)行驗(yàn)證)和ClickEvent(處理點(diǎn)擊事件)等。
Dependency:業(yè)務(wù)邏輯的依賴。包括一些安卓應(yīng)用權(quán)限的配置和庫(kù)的依賴,在開發(fā)過(guò)程中需要在AndroidManifest.xml和build.gradle文件(本文使用的安卓開發(fā)環(huán)境為Android Studio)聲明,比如對(duì)文件進(jìn)行存儲(chǔ)時(shí)需要添加WRITE_EXTERNAL_STORAGE和READ_EXTERNAL_STORAGE權(quán)限。
CodeSnippet:代碼片段。是界面元素和業(yè)務(wù)邏輯的具體實(shí)現(xiàn)代碼,分別為視圖代碼片段和業(yè)務(wù)代碼片段。代碼片段是應(yīng)用開發(fā)者在開發(fā)過(guò)程中編寫的一些設(shè)計(jì)良好的代碼,對(duì)視圖代碼片段進(jìn)行組合能夠形成布局文件,即應(yīng)用的界面;而業(yè)務(wù)代碼片段可能只是業(yè)務(wù)邏輯的框架代碼,需要開發(fā)者再此基礎(chǔ)上實(shí)現(xiàn)具體的業(yè)務(wù)邏輯。
CodeRepository:代碼庫(kù)。用于對(duì)代碼片段進(jìn)行存儲(chǔ)、管理。
Module:安卓應(yīng)用中的模塊。一個(gè)模塊包含若干界面元素和業(yè)務(wù)邏輯,并用name來(lái)唯一表示,description對(duì)模塊實(shí)現(xiàn)的功能進(jìn)行描述。
Constraint:約束條件。對(duì)模塊中界面元素的組合嵌套規(guī)則進(jìn)行描述,比如最基本的規(guī)則是可見的界面元素要嵌入容器中才能展示出來(lái),具體的規(guī)則還要根據(jù)模塊所要實(shí)現(xiàn)功能的業(yè)務(wù)約束來(lái)制定。
Configuration:配置文件。表示某一個(gè)模塊的具體實(shí)現(xiàn),反映出模塊的實(shí)現(xiàn)包含了哪些界面元素和業(yè)務(wù)邏輯,以及界面元素和業(yè)務(wù)邏輯之間的關(guān)聯(lián)。配置文件中activity和layout分別是需要生成的Activity和布局文件名稱,description是相關(guān)描述信息。
1.3 代碼組裝流程
基于代碼片段復(fù)用的安卓應(yīng)用組裝流程示意如圖2所示。其中視圖代碼片段、業(yè)務(wù)代碼片段、代碼庫(kù)、配置文件分別對(duì)應(yīng)于安卓應(yīng)用結(jié)構(gòu)模型中的相應(yīng)元素。
圖2 代碼組裝流程示意圖
視圖代碼片段和業(yè)務(wù)代碼片段分別是結(jié)構(gòu)模型中視圖元素和業(yè)務(wù)邏輯的實(shí)現(xiàn)代碼。配置文件由結(jié)構(gòu)模型中的界面元素和業(yè)務(wù)邏輯組成,并建立起結(jié)構(gòu)模型與代碼片段之間的對(duì)應(yīng)關(guān)系。代碼組裝工具根據(jù)配置文件對(duì)代碼片段進(jìn)行組裝,生成安卓應(yīng)用代碼。需要注意的是組裝工具生成的是應(yīng)用的框架代碼,需要開發(fā)人員在此基礎(chǔ)上完善代碼,最終得到可運(yùn)行的應(yīng)用。
1) 代碼片段和代碼庫(kù)
代碼片段是應(yīng)用開發(fā)過(guò)程中由開發(fā)人員編寫的滿足某一功能需求的代碼。代碼片段分為兩種:來(lái)自布局文件的視圖代碼片段和來(lái)自Activity的業(yè)務(wù)代碼片段。視圖代碼片段可能是設(shè)計(jì)良好的輸入框、按鈕等,可能對(duì)應(yīng)于單個(gè)界面元素也可能對(duì)應(yīng)于多個(gè)界面元素;業(yè)務(wù)代碼片段可能是對(duì)輸入的內(nèi)容進(jìn)行校驗(yàn)的代碼、處理用戶點(diǎn)擊事件的代碼等。
代碼庫(kù)負(fù)責(zé)對(duì)代碼片段進(jìn)行存儲(chǔ)、管理。初始時(shí)代碼庫(kù)為空,在應(yīng)用開發(fā)過(guò)程中,會(huì)產(chǎn)生一些設(shè)計(jì)良好的代碼,開發(fā)人員將這些代碼提取為代碼片段,加入代碼庫(kù)中,便于以后復(fù)用。
2) 配置文件
配置文件是由開發(fā)者根據(jù)需求和安卓應(yīng)用結(jié)構(gòu)模型來(lái)編寫的,對(duì)應(yīng)用的界面和功能進(jìn)行描述。需求最終要實(shí)現(xiàn)為應(yīng)用代碼,而配置文件則介于需求和應(yīng)用代碼之間,比需求更形式化而又比代碼更簡(jiǎn)單,具有簡(jiǎn)潔、直觀、便于修改的特點(diǎn)。配置文件以XML的格式存在,其內(nèi)容構(gòu)成一棵文檔樹,樹中的節(jié)點(diǎn)對(duì)應(yīng)于結(jié)構(gòu)模型中的界面元素或業(yè)務(wù)邏輯元素。通過(guò)編寫配置文件來(lái)滿足可變性需求,由代碼組裝工具根據(jù)配置文件對(duì)代碼片段進(jìn)行組裝生成應(yīng)用代碼,達(dá)到代碼復(fù)用的目標(biāo)。
3) 模板
模板是一個(gè)包含了占位符的Activity。Activity有多個(gè)生命周期[14],應(yīng)用的業(yè)務(wù)邏輯需要在特定的生命周期實(shí)現(xiàn),即業(yè)務(wù)代碼片段要插入到相應(yīng)的生命周期的相應(yīng)位置處,因此需要在Acitivity模板中不同生命周期的不同位置預(yù)留占位符。下面代碼預(yù)留了$ActivityName、$Activity、$View和$onCreate 四個(gè)占位符:
public class $ActivityName extends Activity {
$Activity
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.$View);
ButterKnife.bind(this);
$onCreate
}
}
4) 代碼組裝工具
代碼組裝工具根據(jù)配置文件對(duì)代碼塊進(jìn)行組裝生成應(yīng)用代碼,組裝過(guò)程就是完成對(duì)配置文件中文檔樹的遍歷,根據(jù)配置文件中的節(jié)點(diǎn)類型進(jìn)行如下操作:
(1) 對(duì)于配置文件文檔樹中的Configuration節(jié)點(diǎn),根據(jù)節(jié)點(diǎn)的layout和activity屬性值生成空白的布局文件和Activity模板文件。
(2) 對(duì)于配置文件文檔樹中的界面元素,根據(jù)元素的name屬性值在代碼庫(kù)中進(jìn)行檢索,得到匹配的視圖代碼片段,依照配置文件文檔樹的結(jié)構(gòu),對(duì)代碼片段進(jìn)行組裝,形成模塊對(duì)應(yīng)的布局文件。
(3) 對(duì)于配置文件文檔樹中的業(yè)務(wù)邏輯元素,根據(jù)元素的name屬性值在代碼庫(kù)中進(jìn)行檢索,得到匹配的業(yè)務(wù)代碼片段,按照該業(yè)務(wù)代碼片段中position的值將其插入到Activity模板中相應(yīng)位置處。
上述操作中一個(gè)主要過(guò)程是根據(jù)配置文件文檔樹T1構(gòu)建布局文件文檔樹T2。最終T2與T1有相同的結(jié)構(gòu),對(duì)于T1中某一界面元素E1,在T2中對(duì)應(yīng)位置節(jié)點(diǎn)為E2,E2是代碼庫(kù)中與E1對(duì)應(yīng)的視圖代碼片段。根據(jù)T1構(gòu)建T2的過(guò)程中用到兩個(gè)隊(duì)列:Queue1和Queue2。Queue1中隊(duì)首E1為T1中當(dāng)前待處理的布局文件中的節(jié)點(diǎn),Queue2中隊(duì)首元素E1'為與E1對(duì)應(yīng)的E2的父節(jié)點(diǎn)。代碼生成工具根據(jù)E1從代碼庫(kù)中檢索,得到與E1相匹配的代碼片段E2,將E2作為E1'的子節(jié)點(diǎn)插入到T2中。整個(gè)過(guò)程的偽代碼如下:
read configure file and generate layout and activity file
root = configure.getSubElement()
//獲取配置文件中Configuration節(jié)點(diǎn)的子節(jié)點(diǎn)
Queue1.enqueue(root)
//使用隊(duì)列來(lái)對(duì)配置文件分層遍歷
Queue2.enqueue(templateRoot)
//模板根節(jié)點(diǎn)入隊(duì)
while Queue1 is not empty{
node1 = Queue1.dequeue()
node2 = Queue2.dequeue()
if node1 is a view {
code = findView(node1)
//在代碼庫(kù)中檢索匹配對(duì)應(yīng)的視圖代碼片段
if code is null{
//如果找不到代碼則生成注釋
generate comment
}else{
node2.append(code)
//將實(shí)現(xiàn)代碼片段插入生成的布局文件
//如果該節(jié)點(diǎn)是容器界面元素,需要將其包含的子節(jié)點(diǎn)加入隊(duì)列
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)
//查找對(duì)應(yīng)的業(yè)務(wù)代碼片段
if code is null{
generate comment
}else{
insert code into activity by position
//將業(yè)務(wù)代碼片段插入生成的activity文件
}
}
}
上述代碼中findView()和findLogic()通過(guò)配置文件中界面元素和業(yè)務(wù)邏輯元素的name屬性值與代碼庫(kù)中代碼片段的name屬性值進(jìn)行匹配,如圖3所示。
圖3 配置文件與結(jié)構(gòu)模型和代碼片段之間對(duì)應(yīng)關(guān)系
2.1 工具實(shí)現(xiàn)
我們使用Swing技術(shù)實(shí)現(xiàn)了一個(gè)基于代碼片段復(fù)用的代碼組裝工具。開發(fā)人員依據(jù)業(yè)務(wù)需求編寫配置文件,代碼組裝工具依據(jù)配置文件對(duì)代碼庫(kù)中的代碼片段進(jìn)行組裝,得到應(yīng)用的框架代碼。開發(fā)人員在此基礎(chǔ)上完善代碼,最終得到可運(yùn)行的應(yīng)用代碼。
2.2 實(shí)驗(yàn)和評(píng)價(jià)
為了驗(yàn)證所提方法和所開發(fā)工具的有效性,我們?cè)O(shè)計(jì)了一套安卓應(yīng)用開發(fā)實(shí)驗(yàn)。實(shí)驗(yàn)中我們選取了兩名計(jì)算機(jī)軟件專業(yè)的研究生,他們安卓應(yīng)用開發(fā)水平相當(dāng),分別作為實(shí)驗(yàn)組和對(duì)照組。他們被要求依次完成7個(gè)安卓應(yīng)用登錄功能的實(shí)現(xiàn)。在開發(fā)的過(guò)程中,實(shí)驗(yàn)組使用本文給出的代碼組裝工具,可以將開發(fā)過(guò)程中的代碼片段保存入代碼庫(kù)中,并在后續(xù)開發(fā)任務(wù)中編寫配置文件。然后使用工具對(duì)代碼片段進(jìn)行組裝,生成框架代碼,在此基礎(chǔ)上完善代碼。對(duì)照組不使用工具,可以使用手工進(jìn)行“復(fù)制-粘貼”的方式開發(fā)。
實(shí)驗(yàn)組和對(duì)照組使用的開發(fā)環(huán)境都為安卓官方集成開發(fā)環(huán)境Android Studio,版本為1.5.0.0。實(shí)驗(yàn)中一共有7個(gè)開發(fā)任務(wù),開發(fā)者每次新建一個(gè)空白安卓項(xiàng)目,Android Studio將自動(dòng)生成項(xiàng)目的相關(guān)文件,然后將該項(xiàng)目加入Git并提交代碼。開發(fā)者完成每個(gè)開發(fā)任務(wù)后再次提交代碼,Git將統(tǒng)計(jì)出開發(fā)者為了完成開發(fā)任務(wù)而編寫的代碼行數(shù)(包括實(shí)驗(yàn)組配置文件代碼行數(shù))。實(shí)驗(yàn)結(jié)果如圖4所示。
圖4 代碼行數(shù)統(tǒng)計(jì)圖
從圖4中可以看出,采用本文提出的方法和工具能夠有效地減少開發(fā)者的代碼量。本文方法和工具對(duì)于應(yīng)用開發(fā)者的幫助體現(xiàn)在以下幾點(diǎn):
(1) 可行性。在實(shí)驗(yàn)中,實(shí)驗(yàn)組使用配置文件對(duì)開發(fā)需求進(jìn)行描述,然后使用代碼組裝工具對(duì)代碼片段進(jìn)行組裝生成代碼框架,最后開發(fā)者對(duì)代碼框架進(jìn)行代碼填充,最終實(shí)現(xiàn)為一個(gè)可運(yùn)行的應(yīng)用。
(2) 提高代碼質(zhì)量??蓮?fù)用的代碼片段具有結(jié)構(gòu)化程度高,易于理解的特點(diǎn)。將可復(fù)用的代碼片段提取出來(lái)并復(fù)用到應(yīng)用開發(fā)中有助于提高代碼質(zhì)量。
然而,上述實(shí)驗(yàn)有一定的局限性。首先,參與實(shí)驗(yàn)的開發(fā)人員數(shù)量太少;其次,收集的實(shí)驗(yàn)數(shù)據(jù)太少。
為了提高安卓應(yīng)用開發(fā)的效率,很多組織和研究人員致力于通過(guò)代碼生成技術(shù)生成安卓應(yīng)用代碼。
Android Bootstrap[1]是一個(gè)集成了大量模板(包括UI、網(wǎng)絡(luò)請(qǐng)求庫(kù)、賬戶管理等)的安卓應(yīng)用在線生成工具。使用者只需要輸入應(yīng)用的包名,Android Bootstrap就能生成一個(gè)完整的項(xiàng)目,該項(xiàng)目中包含了安卓應(yīng)用開發(fā)中一些常用的模塊如登錄、滾動(dòng)的圖片、網(wǎng)絡(luò)請(qǐng)求、Json數(shù)據(jù)解析以及一些預(yù)定義的主題和UI元素(按鈕和輸入框等)等。然而,Android Bootstrap的整個(gè)輸入只有一個(gè)包名,不支持根據(jù)應(yīng)用的需求進(jìn)行定制,應(yīng)用的界面和業(yè)務(wù)邏輯還需要開發(fā)者手工完成。
App Inventor[2]是MIT研發(fā)的旨在為所有人,特別是年輕人,展示軟件開發(fā)的魅力,讓他們從軟件消費(fèi)者轉(zhuǎn)變?yōu)檐浖?chuàng)造者的開源項(xiàng)目。App Inventor提供一個(gè)在線開發(fā)工具,以圖形化的控件來(lái)對(duì)應(yīng)用的組件和行為進(jìn)行表示。使用者通過(guò)拖拽控件,像搭積木一樣拼湊出一個(gè)安卓應(yīng)用。然而,使用App Inventor開發(fā)出的應(yīng)用與實(shí)際應(yīng)用相比仍有很大差距。
Markus Aleksy[3]從用戶界面和功能兩方面對(duì)應(yīng)用建立原型,然后復(fù)用現(xiàn)有應(yīng)用的組件來(lái)快速開發(fā)安卓應(yīng)用。然而并沒有給出如何獲取現(xiàn)有應(yīng)用組件的方法,缺乏對(duì)應(yīng)用組件的管理和維護(hù)。
Khambati等[4]創(chuàng)造了一種可視化模型語(yǔ)言[13],使用可視化的模型語(yǔ)言編寫配置文件對(duì)應(yīng)用進(jìn)行描述,并開發(fā)出了一個(gè)安卓應(yīng)用生成工具,該工具以配置文件作為輸入,生成與醫(yī)療保健計(jì)劃相關(guān)的安卓應(yīng)用。然而該可視化模型語(yǔ)言是針對(duì)醫(yī)療保健專家而設(shè)計(jì)的,不是針對(duì)安卓應(yīng)用開發(fā)者。另外,使用該工具生成的是安卓應(yīng)用的安裝文件,開發(fā)者無(wú)法對(duì)應(yīng)用進(jìn)行修改。
Nguyen等[5]開發(fā)出一個(gè)能夠生成主從模式安卓應(yīng)用的工具。Li等[6]提出了一種搜索平臺(tái),該平臺(tái)能夠搜索安卓應(yīng)用的界面元素,幫助開發(fā)者識(shí)別應(yīng)用中的界面元素,但他們沒有給出有效地復(fù)用這些界面元素的方法或技術(shù)。
Lachgar等[7]采用模型驅(qū)動(dòng)架構(gòu)的方法設(shè)計(jì)出一種領(lǐng)域特定語(yǔ)言,在此基礎(chǔ)上開發(fā)出一個(gè)工具,該工具能夠生成安卓應(yīng)用的用戶界面。Sabraoui等[8,9]也采用模型驅(qū)動(dòng)架構(gòu)的方法,設(shè)計(jì)出基于UML的應(yīng)用界面生成工具,該工具能夠針對(duì)不同移動(dòng)操作系統(tǒng)(iOS、Android、Windows Phone、BlackBerry)生成相應(yīng)的應(yīng)用界面。然而上述研究工作生成的應(yīng)用界面非常簡(jiǎn)單,并沒有考慮到實(shí)際應(yīng)用開發(fā)中應(yīng)用界面的復(fù)雜性,不能真正地幫助應(yīng)用開發(fā)者進(jìn)行快速開發(fā),并且缺乏對(duì)應(yīng)用業(yè)務(wù)邏輯的支持。
Mojica等[10]借鑒軟件產(chǎn)品線和特征模型[11]技術(shù),對(duì)安卓系統(tǒng)中的組件進(jìn)行建模,如Service是運(yùn)行在后臺(tái)并且沒有用戶界面的組件,Activity是一個(gè)擁有用戶界面并能與用戶進(jìn)行交互的組件。通過(guò)定義領(lǐng)域特定語(yǔ)言來(lái)對(duì)安卓應(yīng)用的組件和組件之間的關(guān)系進(jìn)行描述,其語(yǔ)法類似Java語(yǔ)言中類的定義,然后開發(fā)出代碼生成工具AndroidModeler來(lái)生成安卓應(yīng)用的框架代碼。然而他們并未對(duì)應(yīng)用的界面進(jìn)行考慮,并且其定義的領(lǐng)域特定語(yǔ)言語(yǔ)法過(guò)于簡(jiǎn)單,描述能力非常有限,無(wú)法對(duì)組件的具體功能進(jìn)行詳細(xì)的描述。
Barnett等[12]借鑒模型驅(qū)動(dòng)技術(shù)能夠提高軟件開發(fā)效率降低成本的特點(diǎn),開發(fā)出一個(gè)工具RAPPT,使用領(lǐng)域特定語(yǔ)言來(lái)描述安卓應(yīng)用,進(jìn)而生成安卓應(yīng)用工程的框架代碼。使用RAPPT生成的工程能夠直接導(dǎo)入安卓官方集成開發(fā)環(huán)境Android Studio。然而開發(fā)人員還需要進(jìn)一步調(diào)整生成應(yīng)用的界面代碼,并且RAPPT不支持對(duì)應(yīng)用界面和功能的靈活配置,只能生成與模板應(yīng)用類似的應(yīng)用。
一些研究人員對(duì)安卓應(yīng)用的相似性進(jìn)行了研究。王浩宇等[15]基于代碼克隆檢測(cè)技術(shù)對(duì)安卓應(yīng)用進(jìn)行特征提取,分析應(yīng)用之間的相似度。閆晉佩等[16]對(duì)第三方應(yīng)用市場(chǎng)中的安卓應(yīng)用二進(jìn)制文件中類和方法的相似性進(jìn)行計(jì)算,以此來(lái)識(shí)別應(yīng)用重打包。張希遠(yuǎn)等[17]使用CCFinder工具對(duì)應(yīng)用市場(chǎng)中應(yīng)用模塊代碼的相似度進(jìn)行了研究。焦四輩等[18]提出一種能夠識(shí)別經(jīng)過(guò)代碼混淆后安卓應(yīng)用相似性的方法。
本文針對(duì)安卓應(yīng)用的特點(diǎn),提出安卓應(yīng)用結(jié)構(gòu)模型來(lái)對(duì)應(yīng)用模塊的界面元素和業(yè)務(wù)邏輯進(jìn)行建模。在此基礎(chǔ)上,使用配置文件對(duì)安卓應(yīng)用模塊的界面和功能進(jìn)行描述,通過(guò)代碼組裝工具對(duì)代碼片段進(jìn)行組裝,生成安卓應(yīng)用框架代碼,輔助開發(fā)者進(jìn)行快速開發(fā)。
然而,本文提出的安卓應(yīng)用結(jié)構(gòu)模型還不夠完備,不足以描述安卓應(yīng)用的全貌。采用了XML格式的配置文件來(lái)對(duì)安卓應(yīng)用進(jìn)行描述,而XML中有太多與語(yǔ)義無(wú)關(guān)的符號(hào)如尖括號(hào)和引號(hào)等。配置文件需要開發(fā)人員手工編寫,不夠方便。在今后的研究中應(yīng)該提出其他形式的領(lǐng)域特定語(yǔ)言來(lái)對(duì)安卓應(yīng)用進(jìn)行描述。另外,本文的實(shí)現(xiàn)工具仍處于原型階段,在實(shí)際應(yīng)用中還有很多局限性,需要進(jìn)一步完善,最終開發(fā)出能夠滿足實(shí)際安卓應(yīng)用開發(fā)需求的工具。
[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] 王浩宇,王仲禹,郭耀,等.基于代碼克隆檢測(cè)技術(shù)的Android應(yīng)用重打包檢測(cè)[J].中國(guó)科學(xué):信息科學(xué),2014,44(1):142-157.
[16] 閆晉佩,何暉,安文歡,等.國(guó)內(nèi)第三方Android應(yīng)用市場(chǎng)安全性的檢測(cè)[J].計(jì)算機(jī)科學(xué),2015,42(12):143-147.
[17] 張希遠(yuǎn),張剛,沈立煒,等.多維度的安卓應(yīng)用相似度分析[J].計(jì)算機(jī)科學(xué),2016,43(3):199-205.
[18] 焦四輩,應(yīng)凌云,楊軼,等.一種抗混淆的大規(guī)模Android應(yīng)用相似性檢測(cè)方法[J].計(jì)算機(jī)研究與發(fā)展,2014,51(7):1446-1457.
[19] 朱洪軍,陳灝,華保健,等.移動(dòng)應(yīng)用代碼保護(hù)現(xiàn)狀與技術(shù)研究[J].計(jì)算機(jī)應(yīng)用與軟件,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。國(guó)家自然科學(xué)基金項(xiàng)目(61402113);國(guó)家高技術(shù)研究發(fā)展計(jì)劃項(xiàng)目(2013AA01A605)。朱亞迪,碩士生,主研領(lǐng)域:軟件復(fù)用,移動(dòng)應(yīng)用開發(fā)。吳毅堅(jiān),副教授。趙文耘,教授。
TP3
A
10.3969/j.issn.1000-386x.2016.11.039