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

基于Android軟件開發組件化研究

2019-09-13 03:36:12崔佳冬
計算機應用與軟件 2019年9期
關鍵詞:用戶功能工程

殷 濤 崔佳冬

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

0 引 言

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

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

1 組件化原理

Android軟件開發組件化設計主要使用的IDE是AS。隨著Android版本的升高,Eclipse結合ADT與SDK開發Android的應用變得越來越少,而AS集成開發環境提供最新Android版本的軟件開發環境,同時,IDE提供Gradle插件負責項目的編譯過程,組件化的實現就是由AS集成的Modules功能與編譯插件Gradle完成。

AS工程中,除了默認創建的啟動項目,即可以安裝到手機系統的獨立工程外,還可新建或添加依賴模塊作為獨立工程的依賴文件,默認情況下,依賴文件是一個lib庫,只是為主工程提供功能服務和數據服務[5]。而IDE提供的Gradle插件是AS默認的構建工具,負責Android工程的依賴、編譯、打包等過程,組件化設計使用Gradle插件在通用構建規則下,通過Groovy語言為Gradle指定新的構建規則,動態改變項目的編譯過程[6]。在開發階段,通過修改組件Gradle的Task、配置、編譯類型和依賴等將模塊改變為獨立項目工程開發調試,可以在組件中添加啟動視圖、資源,打包APK下載安裝。在調試階段,改變Gradle文件配置,將模塊作為項目依賴添加到主體工程中。組件化結構如圖1所示,將一個整體的項目進行合理拆分,變為一個個小的組件,各組件間低耦合、高內聚,組件單獨編譯、同步開發,調試完畢后,組合各組件項目為一個大的工程,得到完整應用。

圖1 組件化結構圖

2 組件劃分

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

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

圖2 APP功能組件劃分

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

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

(3) 從架構上劃分。Android軟件開發常用的架構有MVC、MVP、MVVM等[9],根據軟件的功能表現,將軟件功能分為視圖層、業務層以及連接層,如圖3所示。

圖3 移動應用架構層

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

3 組件化設計

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

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

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

isModule=true

isModuleOne=true

isModuleTwo=true

isModuleThree=true

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

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文件中添加動態資源配置:

sourceSets {

main {

if (rootProject.ext.isModuleOne) {

manifest.srcFile

’src/main/AndroidManifest.xml’

java {

exclude ’*module’

}

} else {

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

}}}

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

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

(5) 使用阿里的ARouter框架采用編譯時生成代碼(APT)技術建立組件之間的路由,簡化組件間的通信。在模塊的build.gradle文件中使用遠程依賴方式,獲取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,使用時直接獲取該類的實例并調用方法,傳入路由即可。ARouter初始化方法和路由跳轉代碼如下:

if (isDebug){

ARouter.openDebug();

ARouter.openLog();

}

ARouter.init(application);

//路由跳轉

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

4 應用程序實例

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

圖4 項目結構圖

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

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

isModule=false

isModuleOne=false

isModuleTwo=true

isModuleThree=true

即單獨編譯moduleone,點擊編譯工程,出現:

ARouter::Compiler >>> No module name

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

javaCompileOptions {

annotationProcessorOptions {

arguments=[moduleName: project.getName()]

}}

如圖5所示,APK打包狀態已由工程打包變為了組件打包。

圖5 工程打包與模塊打包狀態圖

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

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

圖6 工程與組件APK

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

@Route(path=ARouterUrls.PATH_XX)

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

@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路由跳轉代碼的封裝,內部代碼為:

public static void navigate(String path){

if (TextUtils.isEmpty(path)){

return;

}

ARouter.getInstance()

.build(path)

.navigation();

}

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

圖7 路由跳轉結果圖

5 結 語

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

猜你喜歡
用戶功能工程
也談詩的“功能”
中華詩詞(2022年6期)2022-12-31 06:41:24
關于非首都功能疏解的幾點思考
關注用戶
商用汽車(2016年11期)2016-12-19 01:20:16
子午工程
太空探索(2016年6期)2016-07-10 12:09:06
關注用戶
商用汽車(2016年6期)2016-06-29 09:18:54
關注用戶
商用汽車(2016年4期)2016-05-09 01:23:12
工程
如何獲取一億海外用戶
創業家(2015年5期)2015-02-27 07:53:25
工程
中西醫結合治療甲狀腺功能亢進癥31例
主站蜘蛛池模板: 国产精品久久久久婷婷五月| 97在线观看视频免费| 国产亚洲一区二区三区在线| 日韩福利在线视频| 亚洲第一综合天堂另类专| 在线国产三级| 午夜性刺激在线观看免费| 國產尤物AV尤物在線觀看| 欧美福利在线| 欧美一级专区免费大片| 在线精品亚洲国产| 亚洲区一区| 国产色伊人| 激情视频综合网| 亚洲精品成人7777在线观看| 国产精品成| 国产午夜精品鲁丝片| 在线看AV天堂| 国产精品成人免费综合| 精品免费在线视频| 在线免费亚洲无码视频| 亚洲综合狠狠| 亚洲毛片一级带毛片基地| 欧美性色综合网| 麻豆精选在线| 日韩精品免费一线在线观看| 国产伦精品一区二区三区视频优播 | 色婷婷狠狠干| av在线5g无码天天| 久草性视频| 欧美中文字幕一区| 99手机在线视频| 草草影院国产第一页| 精品久久久久无码| 欧美午夜性视频| 伊人久综合| 超碰91免费人妻| 最新加勒比隔壁人妻| 亚洲精品桃花岛av在线| 在线观看国产黄色| 国产午夜不卡| 国内精品视频在线| 99在线视频免费观看| 在线观看亚洲天堂| 国产性猛交XXXX免费看| 在线中文字幕网| jizz国产在线| 一级毛片不卡片免费观看| 亚洲品质国产精品无码| 日本精品影院| 日本成人不卡视频| 国产成人av大片在线播放| 国产内射一区亚洲| 日韩欧美在线观看| 色老头综合网| 香蕉视频在线精品| 毛片大全免费观看| 欧美色视频在线| 国产特级毛片aaaaaa| 日韩无码一二三区| 亚洲AⅤ永久无码精品毛片| 精品一区二区三区四区五区| 国产亚洲精品yxsp| 欧美在线伊人| 免费人欧美成又黄又爽的视频| 亚洲男人在线天堂| 国产中文一区a级毛片视频 | 手机在线免费不卡一区二| 婷婷久久综合九色综合88| 国产区免费| 91高清在线视频| 欧美精品H在线播放| 狠狠色综合久久狠狠色综合| 久久semm亚洲国产| 波多野结衣一区二区三视频| 最新日本中文字幕| 日本亚洲欧美在线| 日韩欧美中文在线| 日韩AV手机在线观看蜜芽| 欧美日韩在线亚洲国产人| 91麻豆精品视频| 亚洲国产系列|