【Android Gradle 插件】组件化中的 Gradle 构建脚本实现 ④ ( 使用路由实现组件间通信 | 引入 ARoute 框架 | Gradle 构建脚本优化问题 )

2023-03-30 17:44:18 浏览数 (1)

文章目录

  • 一、使用路由实现组件间通信
  • 二、抽取构建脚本

在上一篇博客 【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

一、使用路由实现组件间通信


在 组件化模式 下 , 依赖模块 是 可以 独立运行的 , 但是 模块间 通信的源码还在 , 如 模块 A 启动 模块 B 的 Activity 组件 , 如果在 组件化状态 下 ,

  • 模块 B 可以独立运行 , 是可执行模块 , 无法被设置为依赖库的 ;
  • 模块 A 调用 模块 B 的代码肯定会报错 ;

这就需要引入 路由 实现模块间的通信 ;

这里通过引入 ARoute 依赖库实现组件路由 :

使用 ARouter 第三方库实现组件化 : https://github.com/alibaba/ARouter

ARoute 是阿里的开源库 ;

创建项目 , 项目中有 3 个 Module , 1 个主模块 app , 2 个依赖库 module1 和 module2 ;

在 app , module1 , module2 , 3 个模块的 build.gradle 中 , 都要进行如下配置 ;

在 build.gradle 下的 " android / defaultConfig " 层级添加配置 :

代码语言:javascript复制
android {
    defaultConfig {
        ...
        javaCompileOptions {
            annotationProcessorOptions {
                arguments = [AROUTER_MODULE_NAME: project.getName()]
            }
        }
    }
}

在 build.gradle 下的 " dependencies " 层级添加 ARoute 依赖 :

代码语言:javascript复制
    // 替换成最新版本, 需要注意的是api
    // 要与compiler匹配使用,均使用最新版可以保证兼容
    api 'com.alibaba:arouter-api:1.5.1'
    annotationProcessor 'com.alibaba:arouter-compiler:1.5.1'

3 模块间的依赖关系 : app 模块依赖剩余两个模块 , 模块之间不发生依赖关系 ;

代码语言:javascript复制
implementation project(path: ':module1')
implementation project(path: ':module2')

二、抽取构建脚本


在应用中 , 可能存在几十个独立的依赖库模块 , 每个依赖库模块都需要进行 如下设置 , 这样做比较复杂 , 一旦修改要改几十个 build.gradle 构建脚本 ;

代码语言:javascript复制
/**
 * 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"
            }
        }
    }
}

除了上述配置外 , 以下版本号 也需要进行统一管理 , 如果这些版本号配置分布到几十个构建脚本中 , 会出现维护困难的问题 ;

代码语言:javascript复制
android {
    compileSdkVersion 32
    buildToolsVersion "32.0.0"
    defaultConfig {
        minSdkVersion 18
        targetSdkVersion 32
        versionCode 1
        versionName "1.0"
    }
}

如下的依赖库配置中 , 依赖库的版本也需要进行统一管理 ;

代码语言:javascript复制
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'
}

下一篇博客将上述配置抽取到一个构建脚本中 ;

0 人点赞