27.組件化項目結構搭建

一.組件化簡介

注:組件化開發只適用於大型團隊協作開發大型項目的場景,如果只是個人或者兩三人開發則沒有必要使用

什麼是組件化

業務按照功能劃分爲一個一個模塊,模塊之間沒有依賴關係,相互平行,模塊之間的通信通過一定技術手段實現的開發方式就叫組件化

爲什麼需要組件化?

傳統的開發方式:多人協作開發同一個項目,代碼雜亂不易管理,並且多個功能之間依賴程度較高,無法做到按功能分組來打包提測,必須同步進行,有可能開發週期較短的功能需要等待開發週期較長的功能,效率較低

組件化開發方式:各功能之間互不影響,獨立進行,並且可以實現單獨模塊打包,一個模塊的進度不會影響到另一個模塊的進展,有效的提高了開發測試的效率,代碼結構清晰,便於管理。

組件化的實現方式

上邊提到組件化各模塊之間相互不允許有依賴關係,那麼模塊之間的通信方式就是一個需要首先解決的問題。通常來說實現方式有下面幾種:

1.EventBus(每一個消息傳遞都需要一個獨立的EventBean,維護成本太高)
2.廣播 (不好管理,都統一發出去了)
3.使用隱士意圖方式(在AndroidManifest.xml裏面配置xml寫的太多了)
4.使用類加載方式 (除了容易寫錯包名類名之外,其他缺點較少)
5.使用全局Map的方式(要在Application中註冊很多的對象,太費事)
6.ARouter目前應用最廣的方式 ARouter

ARouter由阿里巴巴開源(https://github.com/alibaba/ARouter)

二.這篇文章不去關注如何使用ARouter,而是重點放在組件化基礎配置的搭建上

1.實現組件獨立打包

既然是搭建組件化項目,那麼首先我們要分出幾個功能模塊來!創建一個工程,app爲項目主模塊,然後創建另外三個Module:home,mine,news,最後創建一個Library庫作爲最底層的基礎庫

他們的依賴關係是這樣的

app

implementation project(':mine')
implementation project(':home')
implementation project(':news')

mine

implementation project(':library')

home

implementation project(':library')

news

implementation project(':library')

創建一個common.gradle文件做全局的一些配置


然後在項目根目錄的build.gradle中引入這個文件


common.gradle

ext {
    isRelease = true
}

定義一個isRelease變量來作爲項目的環境配置,我們要實現,線上環境打包把所有模塊都打進去,測試環境打包可以指定模塊單獨打包

那麼怎麼實現呢?

我們知道,每個module要單獨能夠打包的話,他就必須有這樣一個配置,也就是說它必須是一個module而不是一個library

apply plugin: 'com.android.application'

那麼我們就可以通過isRelease這個變量來if else判斷了,我們在每個組件的build.gradle文件頂部配置如下:

if (isRelease) {
    apply plugin :'com.android.library'
} else {
    apply plugin: 'com.android.application'
}

android {
    ...
    defaultConfig {
        if (!isRelease) {  // 能夠獨立運行 必須要有applicationId
            applicationId "com.renzhenming.xxxx"
        }
        ....
    }
}

也就是說release環境下,這個組件作爲library被app依賴,debug環境下,這個組件是一個單獨的module,可以實現獨立打包。這樣一來我們mine home news 三個module下都配置好了

然後在app build.gradle下配置如下,只有release環境下才去依賴三個library

dependencies {
    ...
    if (isRelease){
        implementation project(':mine')
        implementation project(':home')
        implementation project(':news')
    }
}

如此,只是通過改變common.gradle文件中的isRelease字段的值就可以控制是否進行模塊打包了,我們將isRelease設置爲false,然後編譯下看看,可以看到home,mine,news三個組件可以單獨打包了


然後把isRelease設置爲true再次編譯


2.組件獨立打包如何運行

僅僅是獨立打包是不行的,總要有一個啓動的Activity吧,但是這個Activity在release環境下又不能讓他起作用,也就是不能在組件的AndroidManifest中配置,那麼我們是不是可以指定一個debug環境下的AndroidManifest文件呢?

當然是可以的,我們在每個組件的src/main下創建一個debug目錄和一個AndroidManifest,在這裏指定LAUNCHER Activity


在這個組件的build.gradle下配置debug環境時文件AndroidManifest的目錄指向我們創建的這個AndroidManifest

android {
    ...
    sourceSets {
        main {
            if (!isRelease) {
                // 如果是組件化模式
                manifest.srcFile 'src/main/debug/AndroidManifest.xml' // 生效
            } else { // 正式環境下
                manifest.srcFile 'src/main/AndroidManifest.xml' // 讓我們之前 默認的路徑下的清單文件再次生xiao
            }
        }
    }
}

但是有一個問題,這個debug目錄既然時測試環境打包用的,release環境我們肯定不希望它的代碼被打進包裏去,那麼release的時候我們就要把這個目錄移除,添加一行配置

android {
    ...
    sourceSets {
        main {
            if (!isRelease) {
                // 如果是組件化模式
                manifest.srcFile 'src/main/debug/AndroidManifest.xml' // 生效
            } else { // 正式環境下
                manifest.srcFile 'src/main/AndroidManifest.xml' // 讓我們之前 默認的路徑下的清單文件再次生xiao
                java {
                    // release 時 debug 目錄下文件不需要合併到主工程
                    exclude "**/debug/**"
                }
            }
        }
    }
}

這樣一來,組件化的基礎配置就完成了,下篇文章正式進入APT技術和JavaPoet的使用

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章