Android組件化開發實踐

來源:互聯網
上載者:User

標籤:man   使用   roi   工具   映射   issue   相對   lte   插入   

Android項目中代碼量達到一定程度,編譯將是一件非常痛苦的事情,短則一兩分鐘,長則達到五六分鐘。Android studio推出instant run由於各種缺陷一般情況下是被關閉的……
組件化開發可以有效降低代碼模組的耦合度,使代碼架構更加清晰,同時模組化的編譯可以有效減少編譯時間,當然總的編譯時間是不會減少的,只是App模組化之後開發某個模組時,只需要編譯特定模組,可以快速編譯調試。

百牛資訊技術bainiu.ltd整理髮佈於部落格園

原理

組件化和外掛程式化有些同學有些迷惑,簡單來說組件化是在編譯期分模組,外掛程式化是在運行期。一般外掛程式化用於動態修複bug或者動態更新模組,相對來說黑科技更多一些。

正常一個App中可以有多個module,但是一般只會有一個module是設定為application的,其他均設定為library,組件化開發就是要每個module都可以運行起來,因此在開發期間每個module均設定為application,發布時再進行合并。

實踐

本文主要介紹一下項目組件化開發過程碰到的問題和解決辦法,這裡以
ModularizationApp項目為例。ModularizationApp是一個組件化的app:


Paste_Image.png
Paste_Image.png
Paste_Image.png
Paste_Image.png
Paste_Image.png
  • 架構
    Paste_Image.png
    其中App是主application,ModuleA和ModuleB是兩個業務模組,Library是基礎模組,包含所有模組需要的依賴庫,以及一些工具類:如網路訪問、時間工具等。代碼結構

Paste_Image.png
  • Module作為application開發

ModuleA和ModuleB是相對獨立的業務模組,可以分別進行開發,編譯時間只編譯自身,具體實現時在gradle.properties中設定變數,如:IsBuildMudle=false
在模組的的build.gradle中:

if (IsBuildMudle.toBoolean()) {    apply plugin: ‘com.android.application‘} else {    apply plugin: ‘com.android.library‘}

在主模組的build.gradle中設定:

    if (!IsBuildMudle.toBoolean()) {        compile project(‘:ModuleA‘)        compile project(‘:ModuleB‘)    } else {        compile project(‘:Library‘)    }

這樣每個module就可以獨立安裝使用了,注意在修改IsBuildMudle的值時,一定要sync gradle
當module單獨運行和作為module運行時,其activity在manifest中設定也會不同,這裡可以根據IsBuildMudle設定不同的manifest:

    sourceSets {        main {            if (IsBuildMudle.toBoolean()) {                manifest.srcFile ‘src/main/debug/AndroidManifest.xml‘            } else {                manifest.srcFile ‘src/main/release/AndroidManifest.xml‘            }        }    }

分別在不同的目錄下建立manifest檔案。一定要注意兩個manifest的同步問題,否則出現了莫名其名的bug,還找不到原因……

  • 資源衝突問題

    當分別開發模組時,容易出資源重複命名的問題,可以在build.gradle中設定

    resourcePrefix "module1_"

    通過給模組設定不同的資源首碼,可以避免重複命名。

  • Activity跳轉問題

    拆分業務代碼時,自然會涉及到跨module的Activity跳轉,當單獨編譯時間,自然是不能擷取到其他模組的引用的。有幾種方式可以實現跨模組的喚起Activity:

隱式啟動
通過設定intent-filter實現,這需要在manifest中插入大量代碼,同時也降低了安全性(其他app就可以通過這種方式隨意啟動)。
通過類名跳轉
Android業務組件化開發實踐提出了一種通過類名跳轉的方式,使用指令碼產生Rlist類,比較方便快捷,但感覺不方便activity間傳遞資料。
Scheme跳轉
Scheme的方式是建立映射表,集中處理Activity,這種方式可以傳遞一定的資料。Activity傳遞大量資料時可以通過EventBus來進行傳遞(其實即使通過intent顯示啟動,也不要把大量資料放置在intent中,intent對資料大小有限制)。
在進行本次實踐時找到github上的一個url Router,同時支援http和程式內Activity跳轉,而且通過註解的方式進行,使用非常方便,於是引入到了項目中。項目地址ActivityRouterActivityRouter的readme中已經有比較詳細的wiki,但是還有一些需要注意的:

依賴問題:

ActivityRouter使用了apt方式,因此每個使用的module中均需要設定

apt ‘com.github.mzule.activityrouter:compiler:1.1.5‘

注意是每個module,在Library module中設定

classpath ‘com.neenbedankt.gradle.plugins:android-apt:1.8‘

即可。

多module問題

ActivityRouter通過註解在編譯時間產生mapping,如果多個module設定依賴,就會產生多個java檔案,導致源檔案重複,編譯出錯,ActivityRouter目前提供瞭解決方法,但是還沒有正式發布版本,可以設定:

compile ‘com.github.mzule.activityrouter:activityrouter:1.1.9‘ apt ‘com.github.mzule.activityrouter:compiler:1.1.6‘

使用。使用在application中註解:

@Modules({"app", "moduleA", "moduleB"})public class ModularizationApplication extends Application {}

每個module中建立空java類註解:

@Module("moduleA")public class ModuleA {}

具體可以clone ModularizationApp查看代碼。

編譯運行

當在gradle.properties中設定IsBuildMudle=true時,可以獨立運行每個module,獨立運行調試,當設定IsBuildMudle=false,可以編譯運行整個project,注意IsBuildMudle變數設定改變時,要對gradle進行sy

運行過程中有什麼問題可以評論或者在github中提issue。



wutongke
連結:http://www.jianshu.com/p/186fa07fc48a
來源:簡書
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。

Android組件化開發實踐

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.