1. 程式人生 > >Android元件化學習

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