Android元件化學習
元件化是將一個龐大的工程拆分成多個模組,從而達到程式碼的解耦,業務分離,加速編譯測試,同時解決多人開發的混亂等問題。
一:元件化和外掛化有什麼區別:
元件化的單位是元件(module)。
外掛化的單位是apk(一個完整的應用)。
元件化實現的是解耦與加快編譯, 隔離不需要關注的部分。
外掛化實現的也是解耦與加快編譯,同時實現熱插拔也就是熱更新。
元件化的靈活性在於按載入時機切換,分離出獨立的業務元件,比如微信的朋友圈
外掛化的靈活性在於是載入apk, 完全可以動態下載,動態更新,比元件化更靈活。
元件化能做的只是, 朋友圈已經有了,我想單獨除錯,維護,和別人不耦合。但是和整個專案還是有關聯的。
外掛化可以說朋友圈就是一個app, 我需要整合了,把它整合進微信這個大的app裡面
其實從框架名稱就可以看出: 組 和 插。
組本來就是一個系統,你把微信分為朋友圈,聊天, 通訊錄按意義上劃為獨立模組,但並不是真正意義上的獨立模組。
插本來就是不同的apk, 你把微信的朋友圈,聊天,通訊錄單獨做一個完全獨立的app, 需要微信的時候插在一起,就是一個大型的app了。
外掛化的載入是動態的,這點很重要,也是靈活的根源。
二:如何實現元件化
元件化需要考慮的功能:
- 程式碼解耦,如何將一個龐大的工程拆分成有機的整體
- 元件的單獨編譯除錯和整合除錯
- ui頁面跳轉
- 資料傳輸,因為每個元件都會給其他元件提供服務,那麼主專案和元件,元件和元件之間的資料傳輸
- 程式碼隔離,元件之間還是直接飲用互動的話,那麼元件之間根本沒有做到解耦
1:程式碼解耦:將龐大的工程拆分成一個個獨立module元件,其中主module負責拼裝其他的業務元件,形成一個完整的APP, 把每個元件都會用到的功能封裝一個元件中,比如網路庫,BaseActivity,顏色值,工具類等等,把這些封裝成一個Library 元件,其他所以的元件都依賴這個library元件,其他的可根據具體的業務需求進行拆分,一般來說,一些獨立業務模組可單獨 拆分出來,比如播放視訊中,播放的功能和邏輯
2:元件的單獨編譯和整合除錯:這是元件化較核心的功能,相信大家有遇到過,若專案很大,集成了很多第三方的東西,每次 修改點程式碼編譯測試一次就需要很長時間,這嚴重的降低了我們的開發效率,實現對某個模組進行單獨編譯很好的解決了這個問題。在工程目錄下的gradle.properties中設定一個isModule=true值,然後在主專案的module的builde.gradle中的dependencies{}中去判斷這個值
if (!isModule.toBoolean()) { implementation project(':homemodule') implementation project(':readermodule') implementation project(':sharemodule') }
如果是false就新增其他的業務元件的依賴,如果是true,則表明業務元件是可單獨編譯的,不需要新增依賴,同樣在每個需要單獨編譯元件的build.gradle中判斷這個值
if (isModule.toBoolean()) {
apply plugin: 'com.android.application'
} else {
apply plugin: 'com.android.library'
}
同時在module main下和java檔案同層級中建立一個runalone檔案,檔名可隨便命名,在runalone下建立一個AndroidManifest.xml檔案,在這個AndroidManifest.xml中新增module單獨編譯時的入口,然後在build.gradle中的android下設定AndroidManifest.xml
sourceSets {
main {
if (isModule.toBoolean()) {
manifest.srcFile 'src/main/runalone/AndroidManifest.xml'
} else {
manifest.srcFile 'src/main/AndroidManifest.xml'
//整合開發模式下排除debug資料夾中的所有Java檔案
java {
exclude 'debug/**'
}
}
}
}
這樣,只要我們改變這個isModule的值,就可以在整合編譯和單獨編譯進行切換,改變這個值後必須要在Rebuild Project一下
3:ui跳轉和資料傳輸:由於我們需要程式碼隔離,也就是每個業務元件不能依賴其他的元件,但通常開發中,不同業務元件需要進行資料互動和頁面跳轉,這個可以通過阿里巴巴開源的ARouter路由實現,這也是元件化過程中最重要的部分了,ARouter地址 https://github.com/alibaba/ARouter,ARouter不僅能實現頁面跳轉,資料傳輸,還能獲取Fragment的例項,和攔截器的功能,具體不瞭解的可看這個文件 https://www.jianshu.com/p/6021f3f61fa6。