Android組件化開發實踐

更新:Android組件化之通訊(多模塊,多進程)javascript

Android項目中代碼量達到必定程度,編譯將是一件很是痛苦的事情,短則一兩分鐘,長則達到五六分鐘。Android studio推出instant run因爲各類缺陷通常狀況下是被關閉的……
組件化開發能夠有效下降代碼模塊的耦合度,使代碼架構更加清晰,同時模塊化的編譯能夠有效減小編譯時間,固然總的編譯時間是不會減小的,只是App模塊化以後開發某個模塊時,只須要編譯特定模塊,能夠快速編譯調試。java

原理

組件化和插件化有些同窗有些迷惑,簡單來講組件化是在編譯期分模塊,插件化是在運行期。通常插件化用於動態修復bug或者動態更新模塊,相對來講黑科技更多一些。android

正常一個App中能夠有多個module,可是通常只會有一個module是設置爲application的,其餘均設置爲library,組件化開發就是要每一個module均可以運行起來,所以在開發期間每一個module均設置爲application,發佈時再進行合併。git

實踐

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

  • 架構


    其中App是主application,ModuleA和ModuleB是兩個業務模塊,Library是基礎模塊,包含全部模塊須要的依賴庫,以及一些工具類:如網絡訪問、時間工具等。代碼結構如圖:

  • 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,還找不到緣由……app

  • 資源衝突問題

    當分別開發模塊時,容易出資源重複命名的問題,能夠在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進行sync

運行過程當中有什麼問題能夠評論或者在github中提issue。

參考:
kymjs.com/code/2016/1…
github.com/mzule/Activ…
github.com/liangzhitao…

##Other
歡迎關注公衆號wutongke,天天推送移動開發前沿技術文章:

wutongke

推薦閱讀:

Android 組件化開發原理和配置

Android組件化開發實踐

Android組件化之通訊(多模塊,多進程)

相關文章
相關標籤/搜索