亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

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

        2019-09-13 03:36:12崔佳冬
        計算機應(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插件負責(zé)項目的編譯過程,組件化的實現(xiàn)就是由AS集成的Modules功能與編譯插件Gradle完成。

        AS工程中,除了默認創(chuàng)建的啟動項目,即可以安裝到手機系統(tǒng)的獨立工程外,還可新建或添加依賴模塊作為獨立工程的依賴文件,默認情況下,依賴文件是一個lib庫,只是為主工程提供功能服務(wù)和數(shù)據(jù)服務(wù)[5]。而IDE提供的Gradle插件是AS默認的構(gòu)建工具,負責(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所示,將一個整體的項目進行合理拆分,變?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ā)團隊的開發(fā)風(fēng)格,Android工程可從以下三個方向劃分組件。

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

        圖2 APP功能組件劃分

        用戶模塊獨立負責(zé)用戶的登錄、注冊,用戶信息管理等操作。業(yè)務(wù)模塊負責(zé)具體的類型業(yè)務(wù),如電商APP通過網(wǎng)絡(luò)通信向后臺服務(wù)端請求商品數(shù)據(jù)并在界面展示,工具型APP負責(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ù)上劃分組件,可以有效地進行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)層

        視圖層負責(zé)界面的展示和用戶交互,業(yè)務(wù)層有本地業(yè)務(wù)和遠程業(yè)務(wù)等,連接層負責(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作為整體工程的三個組件。為進行組件式開發(fā),具體步驟如下:

        (1) 將主體工程修改為一個空殼工程,刪除默認的MainActivity活動窗口和與之關(guān)聯(lián)的所有路徑,工程包下新建一個類繼承Application負責(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ā)時使用默認的配置文件。兩個文件的主要區(qū)別在于:獨立開發(fā)時,manifest配置文件中有模塊獨立的Application的配置,而作為組件的模塊中默認使用主體工程的Application作為應(yīng)用的生命周期監(jiān)控。

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

        (5) 使用阿里的ARouter框架采用編譯時生成代碼(APT)技術(shù)建立組件之間的路由,簡化組件間的通信。在模塊的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,使用時直接獲取該類的實例并調(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)圖

        程序默認加載moduleone作為工程的啟動界面,分別對app、modulexxx進行開發(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為定義的路徑全局常量字符串。工程默認加載組件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)用性。

        猜你喜歡
        主體工程插件路由
        呼和浩特和林至羊群溝公路主體工程全部貫通
        石油瀝青(2021年4期)2021-10-14 08:50:50
        自編插件完善App Inventor與樂高機器人通信
        電子制作(2019年22期)2020-01-14 03:16:34
        探究路由與環(huán)路的問題
        引黃入冀補淀主體工程完工
        中國水利(2017年21期)2017-12-27 11:07:40
        MapWindowGIS插件機制及應(yīng)用
        基于Revit MEP的插件制作探討
        PRIME和G3-PLC路由機制對比
        南水北調(diào)東線一期主體工程完工并通水
        江蘇年鑒(2014年0期)2014-03-11 17:09:08
        WSN中基于等高度路由的源位置隱私保護
        計算機工程(2014年6期)2014-02-28 01:25:54
        eNSP在路由交換課程教學(xué)改革中的應(yīng)用
        河南科技(2014年5期)2014-02-27 14:08:56
        精品亚洲一区二区三洲| 免费黄色电影在线观看| 国产精品兄妹在线观看麻豆| 久久人人爽人人爽人人片av高请| 亚洲一区二区三区中文字幕网| 亚洲成人av一区二区| 国产精品无码专区视频| 欧美俄罗斯乱妇| 日韩我不卡| 日本一本久道| 欧洲在线一区| 亚洲AV无码国产精品久久l| 精品国产亚洲一区二区三区演员表| 国产成人av综合亚洲色欲| 欧美精品在线一区| 成年男人裸j照无遮挡无码| 美女黄网站永久免费观看网站| 亚洲成熟丰满熟妇高潮XXXXX| 国产日韩久久久久69影院| 91青青草久久| 国产杨幂AV在线播放| 老肥熟女老女人野外免费区| 蜜臀av一区二区三区人妻在线| 亚洲女同精品久久女同| 按摩女内射少妇一二三区| 精品麻豆一区二区三区乱码| 激情五月天色婷婷久久| 精品亚洲一区二区三洲| 亚洲精品国产一二三区| 精品无码一区二区三区的天堂| 香港三级日本三级a视频| 国产尤物av尤物在线观看| 99亚洲男女激情在线观看 | 久久精品无码av| 国产精品狼人久久久久影院 | 亚洲欧洲av综合色无码| 一本色道无码道在线观看| 亚洲熟女少妇一区二区| 蜜臀av免费一区二区三区| 成 人 网 站 在线 看 免费| avtt一区|