文章目錄
- 一、使用路由實作元件間通信
- 二、抽取建構腳本
在上一篇部落格 【Android Gradle 插件】元件化中的 Gradle 建構腳本實作 ① ( 元件化簡介 | 建立元件化應用 | 依賴庫子產品 / 應用子產品 切換設定 ) 最後提到了 在 Gradle 建構腳本中 , 需要實作 依賴庫子產品 / 應用子產品 切換設定
- build.gradle 建構腳本 切換設定 , 切換 應用 / 依賴庫 ;
- AndroidManifest.xml 清單檔案 切換設定 , 設定 啟動 Activity 項 ;
在 【Android Gradle 插件】元件化中的 Gradle 建構腳本實作 ② ( 元件化基本實作 | Project 相關目錄 | 定義元件切換标志位 | 切換插件導入 | 切換設定應用 ID ) 部落格中實作了 子產品化 與 元件化
在 【Android Gradle 插件】元件化中的 Gradle 建構腳本實作 ③ ( 在 Gradle 建構腳本中實作 AndroidManifest.xml 清單檔案切換設定 ) 部落格實作 使用 Gradle 腳本修改 AndroidManifest.xml 清單檔案 ;
本篇部落格中介紹 引入 ARoute 路由架構 , 實作元件間通信 , 以及 介紹 Gradle 建構腳本優化問題求 ;
GitHub 位址 : https://github.com/han1202012/Componentization
一、使用路由實作元件間通信
在 元件化模式 下 , 依賴子產品 是 可以 獨立運作的
- 子產品 B 可以獨立運作 , 是可執行子產品 , 無法被設定為依賴庫的 ;
- 子產品 A 調用 子產品 B 的代碼肯定會報錯 ;
這就需要引入 路由
這裡通過引入 ARoute 依賴庫實作元件路由 :
使用 ARouter 第三方庫實作元件化 : https://github.com/alibaba/ARouter
ARoute 是阿裡的開源庫 ;
建立項目 , 項目中有 個 Module , 個主子產品 app ,
在 app , module1 , module2 , 3 個子產品的 build.gradle 中 , 都要進行如下配置 ;
在 build.gradle 下的 " android / defaultConfig " 層級添加配置 :
android {
defaultConfig {
...
javaCompileOptions {
annotationProcessorOptions {
arguments = [AROUTER_MODULE_NAME: project.getName()]
}
}
}
}
在 build.gradle 下的 " dependencies " 層級添加 ARoute 依賴 :
// 替換成最新版本, 需要注意的是api
// 要與compiler比對使用,均使用最新版可以保證相容
api 'com.alibaba:arouter-api:1.5.1'
annotationProcessor 'com.alibaba:arouter-compiler:1.5.1'
3 子產品間的依賴關系 : app 子產品依賴剩餘兩個子產品 , 子產品之間不發生依賴關系 ;
implementation project(path: ':module1')
implementation project(path: ':module2')
二、抽取建構腳本
在應用中 , 可能存在幾十個獨立的依賴庫子產品 , 每個依賴庫子產品都需要進行 如下設定 , 這樣做比較複雜 , 一旦修改要改幾十個 build.gradle 建構腳本 ;
/**
* rootProject.projectDir 是工程的根目錄
* apply from 引入建構腳本的操作, 等同于将該建構腳本原封不動拷貝到此處
*/
apply from: "${rootProject.rootDir}/common.gradle"
if (project.isModuleDebug) {
/**
* 元件化 : 在 Debug 開發階段, 每個子產品都可以獨立運作, 是以相關的子產品都是 Application 應用子產品,
* 此時, isModuleDebug 設定為 true. ( 單獨運作 )
* 元件化導入 com.android.application 插件
*/
apply plugin: 'com.android.application'
} else {
/**
* 子產品化 : 在 Release 釋出階段, 隻有一個殼應用是可以獨立運作的, 其它所有的子產品都作為依賴庫存在,
* 此時, isModuleDebug 設定為 false. ( 非單獨運作 )
* 子產品化導入 com.android.library 插件
*/
apply plugin: 'com.android.library'
}
/**
* 導入 Kotlin 插件
*/
apply plugin: 'kotlin-android'
android {
defaultConfig {
if (project.isModuleDebug) {
/**
* 子產品化時才能設定 applicationId
* 依賴庫設定 applicationId 編譯時會報錯
*/
applicationId "kim.hsl.business"
}
}
sourceSets {
main {
if (project.isModuleDebug) {
//可運作子產品
manifest.srcFile "src/main/debug/AndroidManifest.xml"
} else {
//依賴庫子產品
manifest.srcFile "src/main/AndroidManifest.xml"
}
}
}
}
除了上述配置外 , 以下版本号 也需要進行統一管理 , 如果這些版本号配置分布到幾十個建構腳本中 , 會出現維護困難的問題 ;
android {
compileSdkVersion 32
buildToolsVersion "32.0.0"
defaultConfig {
minSdkVersion 18
targetSdkVersion 32
versionCode 1
versionName "1.0"
}
}
dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
implementation 'androidx.core:core-ktx:1.8.0'
implementation 'androidx.appcompat:appcompat:1.5.1'
implementation 'com.google.android.material:material:1.6.1'
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
testImplementation 'junit:junit:4.+'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
}