天天看點

【Android Gradle 插件】元件化中的 Gradle 建構腳本實作 ④ ( 使用路由實作元件間通信 | 引入 ARoute 架構 | Gradle 建構腳本優化問題 )

文章目錄

  • ​​一、使用路由實作元件間通信​​
  • ​​二、抽取建構腳本​​

在上一篇部落格 ​​【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 ,

【Android Gradle 插件】元件化中的 Gradle 建構腳本實作 ④ ( 使用路由實作元件間通信 | 引入 ARoute 架構 | Gradle 建構腳本優化問題 )

在 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'
}