更新:Android組件化之通訊(多模塊,多進程)javascript
Android項目中代碼量達到必定程度,編譯將是一件很是痛苦的事情,短則一兩分鐘,長則達到五六分鐘。Android studio推出instant run因爲各類缺陷通常狀況下是被關閉的……
組件化開發能夠有效下降代碼模塊的耦合度,使代碼架構更加清晰,同時模塊化的編譯能夠有效減小編譯時間,固然總的編譯時間是不會減小的,只是App模塊化以後開發某個模塊時,只須要編譯特定模塊,能夠快速編譯調試。java
組件化和插件化有些同窗有些迷惑,簡單來講組件化是在編譯期分模塊,插件化是在運行期。通常插件化用於動態修復bug或者動態更新模塊,相對來講黑科技更多一些。android
正常一個App中能夠有多個module,可是通常只會有一個module是設置爲application的,其餘均設置爲library,組件化開發就是要每一個module均可以運行起來,所以在開發期間每一個module均設置爲application,發佈時再進行合併。git
本文主要介紹一下項目組件化開發過程碰到的問題和解決辦法,這裏以
ModularizationApp項目爲例。ModularizationApp是一個組件化的app:github
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_"複製代碼
經過給模塊設置不一樣的資源前綴,能夠避免重複命名。
拆分業務代碼時,天然會涉及到跨module的Activity跳轉,當單獨編譯時,天然是不能獲取到其餘模塊的引用的。有幾種方式能夠實現跨模塊的喚起Activity:
隱式啓動
經過設置intent-filter實現,這須要在manifest中插入大量代碼,同時也下降了安全性(其餘app就能夠經過這種方式隨意啓動)。
經過類名跳轉
Android業務組件化開發實踐提出了一種經過類名跳轉的方式,使用腳本生成Rlist類,比較方便快捷,但感受不方便activity間傳遞數據。
Scheme跳轉
Scheme的方式是創建映射表,集中處理Activity,這種方式能夠傳遞必定的數據。Activity傳遞大量數據時能夠經過EventBus來進行傳遞(其實即便經過intent顯式啓動,也不要把大量數據放置在intent中,intent對數據大小有限制)。
在進行本次實踐時找到github上的一個url Router,同時支持http和程序內Activity跳轉,並且經過註解的方式進行,使用很是方便,因而引入到了項目中。項目地址ActivityRouter。ActivityRouter的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,天天推送移動開發前沿技術文章:
推薦閱讀: