什么是組件化?
為什么要用組件化?在項目的開發過程中,隨著開發人員的增多及功能的增加,如果提前沒有使用合理的開發架構,那么代碼會越來臃腫,功能間代碼耦合也會越來越嚴重,這時候為了保證項目代碼的質量,我們就必須進行重構
組件化的介紹
組件化是指解耦復雜系統時將多個功能模塊拆分,重組的過程。在Android工程上表現上就是把app按照其業務的不同,劃分為不同的Module
組件化的優點
- 編譯速度 :我們可以按需測試單一模塊極大的提升了我們的開發速度
- 超級解耦 :極度的降低了模塊之間的耦合,便于后期維護與更新
- 功能重用 : 某一塊的功能在另外的組件化項目中使用只需要單獨依賴這一模塊即可
- 便于團隊開發 : 組件化架構是團隊開發必然會選擇的一種開發方式,它能有效的使團隊更好的協作 組件化的框架 先看一下整體的結構
舉個例子:以某個直播平臺為例(沒有畫完整),
- 基礎層:包含的是一些基礎庫以及對基礎庫的封裝,比如常用的圖片加載,網絡請求,數據存儲操作等等,其他模塊或者組件都可以引用同一套基礎庫,這樣不但只需要開發一套代碼,還解耦了基礎功能和業務功能的耦合,在基礎庫變更時更加容易操作。
- 功能組件層:包含一些簡單的功能組件,比如視頻,支付等等
- 業務組件層:這是通過模塊化劃分出來的,即根據業務的不同劃分為不同的模塊,一個具體的業務模塊會按需引用不同的組件,最終實現業務功能,如上有三個業務組件
- app層:多個業務模塊,各自按需引用組件,最后將各個模塊統籌輸出 APP。
開始創建
啟動Android Studio創建一個Android項目,在項目里new Module,彈出的Create New Module中選擇Android Libary或Phone & Tablet,配置完成Module name等參數后點擊finish完成創建。
在上圖中,創建了common與order組件,common組件推薦作為一個基礎庫,第三方的一些都在該庫進行依賴,其它組件庫使用第三方庫直接引用common組件即可,一定程度上避免了組件庫重復引用的問題。
創建好的Module文件目錄下都有一個屬于自己的build.gradle文件,Gradle文件執行順序:settings.gradle > Project build.gradle > Module build.gradle。
在Module build.gradle中可以通過plugins修改當前Model為application或library,如下:
plugins {id 'com.android.application' // application,可以作為app獨立運行id 'com.android.library' // library,可作為aar包引入application包使用
}
com.android.application與com.android.library無法共存,同一個Model只能存在一個。不同的Model可以相互使用implementation引入到Model中,使得Model里的方法可以相互調用。
創建配置共享文件
在Android項目中,每個Module都有自己的.gradle文件,Gradle是一個使用Groovy語言(核心代碼是 Java )編寫的構建工具,具體使用教程可參考:來自Gradle開發團隊的Gradle入門教程
使用組件化的項目一般會有多個 Module ,為了使不同 Module 的版本庫配置使用相同的參數,需要在項目根目錄創建一個app_config.gradle,用以共享組件間相同的配置,避免過度碎片化。
app_config.gradle:ext {app_android = [compileSdk : 32,minSdk : 21,targetSdk : 32,versionCode: 1,versionName: "1.0"]
}
app_config.gradle 要想使其它 Module 都可以引用,需要在 Project 的 build.gradle 中對其進行全局引用。
apply from: 'app_config.gradle'
這樣一來,所有 Module 的 build.gradle 就可以使用 app_config.gradle 的共享參數了
android {compileSdk app_android.compileSdkdefaultConfig {minSdk app_android.minSdktargetSdk app_android.targetSdkversionCode app_android.versionCodeversionName app_android.versionName}
}
打包模式配置
組件化的優點中有一個加快編譯速度、提升開發效率的功能。
上面說到:在 Module 的 build.gradle 可以通過修改 application 或 library 控制當前組件為打包或集成模式。為了方便后續修改打包模式,app_config.gradle 增加了一個 isRelease 的打包配置參數。
ext {// 控制打包的模式isRelease = true
}
通過控制 isRelease 的布爾值,即可實現自動配置對應的 build.gradle 值,當然,前提是自動配置的代碼提前寫好。
// 公用的插件
plugins {id 'org.jetbrains.kotlin.android'
}
// 根據打包模式使用的插件
if (isRelease){apply plugin : 'com.android.library'
} else {apply plugin : 'com.android.application'
}
當模塊處于打包模式時,為避免安裝一次出現兩個應用圖標的問題,整個App工程的所有 AndroidManifest.xml 只能出現一個帶android.intent.action.MAIN 的 intent-filter。
針對這種情況需要額外對不同打包模式下的 AndroidManifest.xml 文件做處理。
為此,我們可以在除主工程以外,需要在 debug 期間作為 application 工程獨立運行項目的 build.gradle 文件添加以下配置。
android {// 源集 —— 用來設置Java目錄或者資源目錄sourceSets {main {if (!isRelease) {// 如果是組件化模式,需要單獨運行時使用該文件manifest.srcFile 'src/main/debug/AndroidManifest.xml'} else {// 集成化模式,整個項目打包時使用該文件manifest.srcFile 'src/main/AndroidManifest.xml'java {// release 時 debug 目錄下的Java文件不需要合并到主工程exclude '**/debug/**'}}}}
}
接著在main文件夾添加debug文件,將用到的 AndroidManifest.xml 文件放入里面,并將 src/main/AndroidManifest.xml 文件的配置設置為集成模式,可參考如下代碼:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"><application><activityandroid:name=".MainActivity"android:exported="true" ></activity></application>
</manifest>
到這里基本上就結束了,更多的Android組件化進階或者Android開發高級進階學習,可以參考《Android核心技術手冊》點擊可以查看詳細類目。