999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于Android軟件開發(fā)組件化研究

2019-09-13 03:36:12崔佳冬
計算機(jī)應(yīng)用與軟件 2019年9期
關(guān)鍵詞:用戶功能工程

殷 濤 崔佳冬

(杭州電子科技大學(xué)新型電子器件與應(yīng)用研究所 浙江 杭州 310018)

0 引 言

Android歷經(jīng)十年,深受廣大用戶和研發(fā)人員青睞[1]。Android版本在6.0之前,主流軟件開發(fā)有Eclipse和Android Studio(AS),其中Eclipse由ADT(Android Development Tools)插件結(jié)合SDK(software development kit)完成對Android開發(fā)環(huán)境的提供[2]。Eclipse中所有工程都并列在工程欄中,工程與工程之間的隔離并非太嚴(yán)格,各工程間除了映射資源無法直接引用外,其余的模塊則可以通過添加庫(lib)的形式依賴到主體工程使用。但Android版本6.0以后,由于官方不再提供ADT的更新,高版本Android的軟件開發(fā)不得不向Eclipse過渡到AS。Studio集成開發(fā)環(huán)境(Integrated Development Environment,IDE)提供比Eclipse插件式開發(fā)更多的功能、更快的速度和高效的體驗,但是AS中工程間隔離十分嚴(yán)格,工程間的依賴只有向主體工程中添加或新建模塊的方式[3]。附加模塊無法直接提供視圖等自我調(diào)試的方式,只有通過主體工程一起工作,若改動一處,所有工程都需要重新編譯一遍,這嚴(yán)重降低開發(fā)效率。同時,單一的功能模塊跟隨用戶需求的增長逐漸變?yōu)橐粋€龐大的功能族群。應(yīng)用業(yè)務(wù)量的增多必然導(dǎo)致軟件開發(fā)代碼量的增大,Android應(yīng)用(APP)開始出現(xiàn)代碼臃腫,耦合度高等軟件開發(fā)障礙,這嚴(yán)重違反移動應(yīng)用的開發(fā)規(guī)范。因此,接入組件化開發(fā),是未來Android大型工程開發(fā)的趨勢[4]。

本文提出通過組件化思想,充分利用AS提供的Modules功能和Gradle插件,降低Android軟件開發(fā)的耦合性、提高軟件編譯速度和應(yīng)用協(xié)同開發(fā)效率。討論組件化設(shè)計,并基于組件化思想開發(fā)了組件化測試模板APP。

1 組件化原理

Android軟件開發(fā)組件化設(shè)計主要使用的IDE是AS。隨著Android版本的升高,Eclipse結(jié)合ADT與SDK開發(fā)Android的應(yīng)用變得越來越少,而AS集成開發(fā)環(huán)境提供最新Android版本的軟件開發(fā)環(huán)境,同時,IDE提供Gradle插件負(fù)責(zé)項目的編譯過程,組件化的實現(xiàn)就是由AS集成的Modules功能與編譯插件Gradle完成。

AS工程中,除了默認(rèn)創(chuàng)建的啟動項目,即可以安裝到手機(jī)系統(tǒng)的獨立工程外,還可新建或添加依賴模塊作為獨立工程的依賴文件,默認(rèn)情況下,依賴文件是一個lib庫,只是為主工程提供功能服務(wù)和數(shù)據(jù)服務(wù)[5]。而IDE提供的Gradle插件是AS默認(rèn)的構(gòu)建工具,負(fù)責(zé)Android工程的依賴、編譯、打包等過程,組件化設(shè)計使用Gradle插件在通用構(gòu)建規(guī)則下,通過Groovy語言為Gradle指定新的構(gòu)建規(guī)則,動態(tài)改變項目的編譯過程[6]。在開發(fā)階段,通過修改組件Gradle的Task、配置、編譯類型和依賴等將模塊改變?yōu)楠毩㈨椖抗こ涕_發(fā)調(diào)試,可以在組件中添加啟動視圖、資源,打包APK下載安裝。在調(diào)試階段,改變Gradle文件配置,將模塊作為項目依賴添加到主體工程中。組件化結(jié)構(gòu)如圖1所示,將一個整體的項目進(jìn)行合理拆分,變?yōu)橐粋€個小的組件,各組件間低耦合、高內(nèi)聚,組件單獨編譯、同步開發(fā),調(diào)試完畢后,組合各組件項目為一個大的工程,得到完整應(yīng)用。

圖1 組件化結(jié)構(gòu)圖

2 組件劃分

軟件開發(fā)中,組件的劃分對于Android組件化設(shè)計尤為重要。移動應(yīng)用開發(fā)通常需要經(jīng)歷一個漫長的過程,如項目立項、需求征集、應(yīng)用開發(fā)、線下測試、線上發(fā)布等[7]。開發(fā)初期,項目的規(guī)模并不會很大,但隨著需求的增多與版本的升級,項目變得越來越大,便可以將項目從不同的角度劃分為多個組件,分別開發(fā),根據(jù)每個開發(fā)團(tuán)隊的開發(fā)風(fēng)格,Android工程可從以下三個方向劃分組件。

(1) 從功能上劃分。對于同一個業(yè)務(wù)類型的移動應(yīng)用,如常見的電商型APP,工具型APP,在功能上都可以將應(yīng)用劃分為多個組件,常見的劃分方式是將用戶模塊、業(yè)務(wù)模塊與通信模塊單獨分離出來,如圖2所示。

圖2 APP功能組件劃分

用戶模塊獨立負(fù)責(zé)用戶的登錄、注冊,用戶信息管理等操作。業(yè)務(wù)模塊負(fù)責(zé)具體的類型業(yè)務(wù),如電商APP通過網(wǎng)絡(luò)通信向后臺服務(wù)端請求商品數(shù)據(jù)并在界面展示,工具型APP負(fù)責(zé)具體的業(yè)務(wù)場景等。通信模塊主要包括模塊內(nèi)各個界面視圖的通信,模塊與模塊之間的通信、APP與其他平臺的通信等。若各組件之間不存在數(shù)據(jù)交互,如用戶模塊與業(yè)務(wù)模塊,用戶注冊、登錄后跳轉(zhuǎn)業(yè)務(wù)界面,用戶模塊便已經(jīng)銷毀,如果業(yè)務(wù)模塊需要用戶信息,完全可以通過通信模塊從后臺或者其他通道直接獲取,則組件與組件之間只需經(jīng)過路由尋址即可。若存在數(shù)據(jù)交互則可以通過模塊依賴或策略模式建立組件之間的相互通信。

(2) 從業(yè)務(wù)上劃分。如社交類APP中的聊天業(yè)務(wù)、朋友圈業(yè)務(wù)、生活小工具等,在同一個APP下,兩者業(yè)務(wù)上并不存在任何交集,分屬不同的業(yè)務(wù)。通常大型APP開發(fā)除了集成必要的功能外,一些額外的附加功能也會根據(jù)用戶需求隱藏在界面的某個觸發(fā)按鈕下,根據(jù)單點登錄系統(tǒng)(CAS),每個組件都能獲取到用戶的信息[8]。一旦開發(fā)完成,除了主體業(yè)務(wù)常更新升級外,附加業(yè)務(wù)會存在長時間不變化的狀態(tài)。從業(yè)務(wù)上劃分組件,可以有效地進(jìn)行Android軟件工程的協(xié)同開發(fā)。

(3) 從架構(gòu)上劃分。Android軟件開發(fā)常用的架構(gòu)有MVC、MVP、MVVM等[9],根據(jù)軟件的功能表現(xiàn),將軟件功能分為視圖層、業(yè)務(wù)層以及連接層,如圖3所示。

圖3 移動應(yīng)用架構(gòu)層

視圖層負(fù)責(zé)界面的展示和用戶交互,業(yè)務(wù)層有本地業(yè)務(wù)和遠(yuǎn)程業(yè)務(wù)等,連接層負(fù)責(zé)視圖層和業(yè)務(wù)層的通信[10]。各層之間通信比較緊密,因此在做組件化劃分時,通常使用策略模式即接口實現(xiàn)各組價之間的通信[11]。開發(fā)過程中,利用頂層架構(gòu),可直接將軟件從架構(gòu)分為三層或以上,從架構(gòu)劃分組件,是在原有架構(gòu)開發(fā)的基礎(chǔ)上,更好地做到項目的解耦。

3 組件化設(shè)計

按照組件劃分結(jié)果,完成軟件開發(fā)組件化設(shè)計。使用AS新建Android開發(fā)工程,在工程的基礎(chǔ)上建立名為moduleone、moduletwo、modulethree作為整體工程的三個組件。為進(jìn)行組件式開發(fā),具體步驟如下:

(1) 將主體工程修改為一個空殼工程,刪除默認(rèn)的MainActivity活動窗口和與之關(guān)聯(lián)的所有路徑,工程包下新建一個類繼承Application負(fù)責(zé)主體應(yīng)用生命周期的管理,其余內(nèi)容全由其余組件填充。

(2) 在工程下創(chuàng)建config.gradle全局配置文件,并在工程下的build.gradle中使用apply from: config.gradle關(guān)聯(lián)使用。在config.gradle中使用四個全局變量,控制主體應(yīng)用和各組件模塊的加載:

isModule=true

isModuleOne=true

isModuleTwo=true

isModuleThree=true

在Android編譯時,各組件build.gradle文件中的apply plugin: ‘com.android.library‘或apply plugin: ‘com.android.application’將決定組件是依賴文件還是獨立工程。因此,組件開發(fā)時根據(jù)config.gradle中的全局變量設(shè)置組件的工作方式:

if (rootProject.ext.isModuleOne) {

apply plugin: ’com.android.library’

} else {

apply plugin: ’com.android.application’

}

同時,通過相同的方法在Gradle依賴中建立主體工程與組件之間建立依賴:

if (rootProject.ext.isModule) {

implementation project(’:moduleone’)

implementation project(’:moduletwo’)

implementation project(’:modulethree’)

}

(3) 在各個組件中的build.gradle文件中添加動態(tài)資源配置:

sourceSets {

main {

if (rootProject.ext.isModuleOne) {

manifest.srcFile

’src/main/AndroidManifest.xml’

java {

exclude ’*module’

}

} else {

manifest.srcFile ’src/main/module/AndroidManifest.xml’

}}}

由于組件開發(fā)中各組件即可單獨開發(fā)也可混合開發(fā),因此需要使用兩套不同的manifest配置文件分別適配不同的環(huán)境,即組件獨立開發(fā)時使用新建的manifest文件,而依賴開發(fā)時使用默認(rèn)的配置文件。兩個文件的主要區(qū)別在于:獨立開發(fā)時,manifest配置文件中有模塊獨立的Application的配置,而作為組件的模塊中默認(rèn)使用主體工程的Application作為應(yīng)用的生命周期監(jiān)控。

(4) 在每個組件的build.gradle文件中添加 resourcePrefix″xxx_″,為每個組件的資源強(qiáng)制添加前綴以保證資源不會出現(xiàn)名字重復(fù)的現(xiàn)象,防止各個組件之間資源名字的混淆。

(5) 使用阿里的ARouter框架采用編譯時生成代碼(APT)技術(shù)建立組件之間的路由,簡化組件間的通信。在模塊的build.gradle文件中使用遠(yuǎn)程依賴方式,獲取ARouter的依賴,代碼如下:

api ‘com.alibaba:arouter-api:x.x.x’

api ‘com.alibaba:arouter-annotation:x.x.x’

annotationProcessor ‘com.alibaba:arouter-compiler:x.x.x’

并為活動窗口界面使用以下代碼添加路由:

@Route(path=”xxx”)

工程中,ARouter在使用前必須初始化,在全局Application中初始化ARouter,使用時直接獲取該類的實例并調(diào)用方法,傳入路由即可。ARouter初始化方法和路由跳轉(zhuǎn)代碼如下:

if (isDebug){

ARouter.openDebug();

ARouter.openLog();

}

ARouter.init(application);

//路由跳轉(zhuǎn)

ARouter.getInstance().build(“xxx”).navigation();

4 應(yīng)用程序?qū)嵗?/h2>

利用組件化思想完成測試工程的基本搭建,工程包括一個空殼的app模塊、三個測試模塊組件modulexxx和一個公共開發(fā)庫component_base。工程項目結(jié)構(gòu)如圖4所示。

圖4 項目結(jié)構(gòu)圖

程序默認(rèn)加載moduleone作為工程的啟動界面,分別對app、modulexxx進(jìn)行開發(fā)測試,修改config.gradle中的全局配置變量。

(1) 測試組件單獨編譯安裝,修改全局變量為:

isModule=false

isModuleOne=false

isModuleTwo=true

isModuleThree=true

即單獨編譯moduleone,點擊編譯工程,出現(xiàn):

ARouter::Compiler >>> No module name

ARouter在組件路由中,編譯時代碼生成需要組件模塊的模塊名,在各個組件模塊的build.gradle文件中添加如下代碼后再編譯:

javaCompileOptions {

annotationProcessorOptions {

arguments=[moduleName: project.getName()]

}}

如圖5所示,APK打包狀態(tài)已由工程打包變?yōu)榱私M件打包。

圖5 工程打包與模塊打包狀態(tài)圖

(2) 按照相同的方法,修改Gradle全局變量,對組件moduletwo、modulethree編譯安裝。

(3) 對組件整體測試,即打包所有組件為同一個APP,修改Gradle全局變量,編譯安裝,得到最終由組件開發(fā)的綜合而成的應(yīng)用,如圖6所示。圖中第一個APP為整體工程編譯打包而成,由三個組件構(gòu)成,其余三個APP是組件模塊單獨編譯安裝生成的APK。

圖6 工程與組件APK

(4) 使用ARouter簡單測試組件間路由功能。為每個組件的啟動窗口添加如下代碼,規(guī)定組件的路由:

@Route(path=ARouterUrls.PATH_XX)

其中ARouterUrls.PATH_XX為定義的路徑全局常量字符串。工程默認(rèn)加載組件moduleone,因此在moduleone中的啟動界面中添加三個按鈕,并對按鈕設(shè)置監(jiān)聽,觸發(fā)按鈕測試組件路由跳轉(zhuǎn)。由于Android的API14后,組件開發(fā)中的資源不再是常量[12],因此,對于多個控件的監(jiān)聽,不能使用switch-case結(jié)構(gòu)。控件觸發(fā)路由跳轉(zhuǎn)部分代碼如下:

@Override

public void onClick(View v){

int id=v.getId();

if (id==R.id.bt_module_two){

ARouterUtils.navigate(ARouterUrls.PATH_MODULE_TWO);

}else if (id==R.id.bt_module_three){

Bundle bundle=new Bundle();

bundle.putString(″data″,″moduleTwo2moduleThree″); ARouterUtils.navigate(ARouterUrls.PATH_MODULE_THREE, bundle);

}else if (id==R.id.bt_module_four){

ARouterUtils.navigate(ARouterUrls.PATH_MODULE_FOUR);

}}

其中ARouterUtils是對ARouter路由跳轉(zhuǎn)代碼的封裝,內(nèi)部代碼為:

public static void navigate(String path){

if (TextUtils.isEmpty(path)){

return;

}

ARouter.getInstance()

.build(path)

.navigation();

}

測試路由經(jīng)過moduleone跳轉(zhuǎn)到moduletwo(如圖7(b)所示),moduleone跳轉(zhuǎn)到modulethree(如圖7(c)所示)。圖7(d)為測試未知路由跳轉(zhuǎn),由于開啟了ARouter的調(diào)試模式和日志打印功能,未知路由跳轉(zhuǎn)會觸發(fā)異常捕獲。

圖7 路由跳轉(zhuǎn)結(jié)果圖

5 結(jié) 語

基于組件化思想的Android軟件開發(fā),是未來大型移動應(yīng)用開發(fā)的趨勢。將Android工程劃分為多個組件,每個組件獨立開發(fā),獨立編譯,調(diào)試成功后通過Gradle插件集成到主體工程,極大降低了程序的耦合性,提高了開發(fā)的效率。同時,由于工程劃分為組件,各組件單獨編譯,提高了IDE的編譯效率。組件之間通過ARouter的路由功能簡化通信,也方便了資源的復(fù)用。因此,通過組件化思想開發(fā)Android應(yīng)用,可以完全應(yīng)用于商業(yè)大型移動應(yīng)用的開發(fā)。通過該思想開發(fā)了Android組件化測試工程,工程測試表明了方案的有效性和實際應(yīng)用性。

猜你喜歡
用戶功能工程
也談詩的“功能”
中華詩詞(2022年6期)2022-12-31 06:41:24
關(guān)于非首都功能疏解的幾點思考
關(guān)注用戶
商用汽車(2016年11期)2016-12-19 01:20:16
子午工程
太空探索(2016年6期)2016-07-10 12:09:06
關(guān)注用戶
商用汽車(2016年6期)2016-06-29 09:18:54
關(guān)注用戶
商用汽車(2016年4期)2016-05-09 01:23:12
工程
如何獲取一億海外用戶
工程
中西醫(yī)結(jié)合治療甲狀腺功能亢進(jìn)癥31例
主站蜘蛛池模板: 午夜啪啪网| 国产真实乱子伦精品视手机观看| 国产欧美日韩综合一区在线播放| 狠狠亚洲五月天| 久久无码高潮喷水| 免费aa毛片| 婷婷五月在线视频| 内射人妻无套中出无码| 五月婷婷导航| 一级毛片免费观看不卡视频| 九九热精品视频在线| 一级毛片免费的| 欧美精品一区二区三区中文字幕| 久久精品日日躁夜夜躁欧美| 精品少妇人妻av无码久久| 色欲色欲久久综合网| 男女男免费视频网站国产| 亚洲精品制服丝袜二区| a在线观看免费| 国产欧美在线| 国产综合日韩另类一区二区| 91小视频在线观看免费版高清| 天天综合网色| 国产精品深爱在线| 久久精品无码专区免费| 无码中文字幕加勒比高清| 这里只有精品国产| 啊嗯不日本网站| 欧洲av毛片| 国内精品久久九九国产精品| 国产va欧美va在线观看| 国产精品免费p区| 永久免费av网站可以直接看的| 国产激爽爽爽大片在线观看| 五月激情综合网| 亚洲欧洲日本在线| 成AV人片一区二区三区久久| 国产91av在线| 91久久偷偷做嫩草影院| jizz在线免费播放| 日韩福利在线观看| 色网站免费在线观看| 国产三级毛片| 伊人久久福利中文字幕| 精品久久久久成人码免费动漫| 亚瑟天堂久久一区二区影院| 日韩国产黄色网站| 九九热免费在线视频| 精品無碼一區在線觀看 | 国产精品三区四区| 久久鸭综合久久国产| A级毛片高清免费视频就| 小说区 亚洲 自拍 另类| 国产精品免费电影| 欧美va亚洲va香蕉在线| 欧美激情第一欧美在线| 蜜桃视频一区二区| 鲁鲁鲁爽爽爽在线视频观看| 国产亚洲精品自在久久不卡 | 精品国产自| AV网站中文| 亚洲乱码精品久久久久..| 日本黄色a视频| 日韩经典精品无码一区二区| 国产亚洲精品自在线| 久久女人网| 国产91高跟丝袜| 日韩国产精品无码一区二区三区| 91精品免费高清在线| a亚洲天堂| 亚洲不卡影院| 久久精品人人做人人综合试看| 欧美中文字幕在线视频| AV不卡在线永久免费观看| 日韩欧美国产综合| 91综合色区亚洲熟妇p| 亚洲中文字幕手机在线第一页| 久久久久青草大香线综合精品 | 91久久精品国产| 在线观看91香蕉国产免费| 欧美视频二区| 国产麻豆福利av在线播放|