移动应用遗留系统重构(16)- Gradle依赖管理篇

前言

上一篇移动应用遗留系统重构(15)- 数据库重构示例篇我们提到CloudDisk团队已经拆分成了多仓库开发,但各个模块各自维护了第三方库。除了版本不统一、也导致打包构建时会带入多个版本的三方库。

由于目前各业务模块已经分仓开发,我们无法ext.的声明,统一版本号及定义库别名。我们只能以Gradle插件的形式发布到Maven库中,这样所有其他模块就可以直接apply使用。

CloudDisk Gradle 插件改造

Gradle 插件

  1. 创建buildSrc模块
  2. 创建BasePlugin类及LibPluginExtension
  3. 创建resource/META-INF/gradle-plugin/com.cloud.disk.plugin.properties,声明class
    1
    implementation-class=com.cloud.disk.plugin.BasePlugin

4.发布插件,在使用的工程apply

1
apply plugin: 'com.cloud.disk.plugin'

BasePlugin类如下:

1
2
3
4
5
6
7
8
9
10
public class BasePlugin implements Plugin<Project> {

public static Project mProject

@Override
void apply(Project project) {
mProject=project
project.extensions.create("Lib", LibPluginExtension.class)
}
}

LibPluginExtension类如下,部分代码省略:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
public class LibPluginExtension {
String roomVersion = '2.2.6'
String lifeCycleVersion = '2.3.0'
String hiltVersion = '2.31.2-alpha'
//... ...

void test() {
BasePlugin.mProject.dependencies {
testImplementation "junit:junit:$junitVersion"
testImplementation "org.mockito:mockito-inline:$mockitoVersion"
testImplementation "android.arch.core:core-testing:1.1.1"
testImplementation "com.google.truth:truth:1.0.1"
testImplementation 'com.tngtech.archunit:archunit-junit4:0.15.0'
testImplementation "org.robolectric:robolectric:$robolectricVersion"
testImplementation 'androidx.test:core:1.3.0'
testImplementation 'androidx.test.ext:junit:1.1.2'
testImplementation "androidx.test.espresso:espresso-core:$espressoVersion"
testImplementation "androidx.test.espresso:espresso-intents:$espressoVersion"
debugImplementation "androidx.fragment:fragment-testing:1.3.1"
}
}

void room() {
BasePlugin.mProject.dependencies {
implementation "androidx.room:room-runtime:$roomVersion"
implementation "androidx.room:room-ktx:$roomVersion"
kapt "androidx.room:room-compiler:$roomVersion"
testImplementation "androidx.room:room-testing:$roomVersion"
}
}

void coroutines() {
BasePlugin.mProject.dependencies {
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutinesVersion"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutinesVersion"
testImplementation "org.jetbrains.kotlinx:kotlinx-coroutines-test:1.3.3"
}
}


// ... ...


}

CloudDisk 改造

  1. dynamicBundle模块修改如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    dependencies {
    implementation 'com.cloud.disk:api:1.0.0'
    implementation 'com.cloud.disk:library:1.0.0'
    implementation 'com.cloud.disk:platform:1.0.0'

    project.Lib.kotlin()
    project.Lib.supportV4()
    project.Lib.appCompact()
    project.Lib.material()
    project.Lib.router()
    project.Lib.mvvm()
    project.Lib.ktx()
    project.Lib.coroutines()
    project.Lib.room()
    project.Lib.hilt()
    project.Lib.test()
    }
  2. dynamicDebug模块修改如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    dependencies {
    implementation 'com.cloud.disk:api:1.0.0'
    implementation project(':dynamicBundle')

    project.Lib.hilt()
    project.Lib.test()
    project.Lib.appCompact()
    project.Lib.material()
    project.Lib.constraintlayout()
    project.Lib.kotlin()
    project.Lib.ktx()
    }

完整修改见Github

总结

本篇主要分享了 CloudDisk Gradle 插件改造,统一的三方库的版本管理及简化依赖调用,有效的解决了三方库版本不统一问题。

随着重构工作的持续,各个模块已经补充了足量的自动化测试,但CloudDisk团队目前的CI只提供打包的功能,供测试团队进行验证。分仓以后也没有对独立模块仓库建立流水线,测试团队还是只能在最后做集成的验收。

下一篇,移动应用遗留系统重构(17)- 流水线设计篇。我们将重新对CloudDisk进行流水线的设计,必须满足质量门禁检查及根据模块、集成,制定对应的策略。

CloudDisk示例代码

CloudDisk

系列链接

移动应用遗留系统重构(1)- 开篇

移动应用遗留系统重构(2)-架构篇

移动应用遗留系统重构(3)-示例篇

移动应用遗留系统重构(4)-分析篇

移动应用遗留系统重构(5)- 重构方法篇

移动应用遗留系统重构(6)- 测试篇

移动应用遗留系统重构(7)- 解耦重构演示篇(一)+视频演示

移动应用遗留系统重构(8)- 依赖注入篇

移动应用遗留系统重构(9)- 路由篇

移动应用遗留系统重构(10)- 解耦重构演示篇(二)

移动应用遗留系统重构(11)- 制品管理篇

移动应用遗留系统重构(12)- 编译调试篇

移动应用遗留系统重构(13)- 编译调试篇

移动应用遗留系统重构(13)- 编译调试篇

移动应用遗留系统重构(14)- Kotlin+MVVM重构示例篇

移动应用遗留系统重构(15)- 数据库重构示例篇

大纲

关于