作者:e1985522z | 来源:互联网 | 2024-12-14 12:48
自Gradle3.3起,复合构建功能得以实现,这是一种能够整合其他独立构建的高级构建模式。本文将详细介绍复合构建与多项目构建的区别,以及如何在实际项目中应用复合构建。
1. 复合构建概述
自Gradle 3.3版本(注意不是Gradle插件)开始,复合构建成为了可能。复合构建是指一种可以包含其他独立构建的构建类型。尽管与Gradle多项目构建有相似之处,但两者的主要区别在于复合构建整合的是完全独立的项目,而非单一项目内的多个子项目。
为了更好地理解两者的差异,可以从以下两个方面进行对比:
- 多项目构建:其核心在于如何有效地组织多个相互关联的项目。例如,在一个电子商务平台中,前端展示和后台管理系统可以分别作为两个子项目来处理(如:front-end和admin)。
- 复合构建:侧重于如何将多个独立运作的项目整合在一起。例如,某个项目可能依赖于公司内部的另一个独立SDK,而这个SDK本身也可以作为一个独立项目运行。
复合构建的主要优势包括:
- 能够将通常独立开发的构建合并,便于在应用中测试库的bug修复等场景。
- 有助于将大型多项目构建拆分为更小、更独立的部分,这些部分既可单独运行也可协同工作。
若要将一个构建加入到复合构建中,需满足以下条件:
- 必须包含一个
settings.gradle
文件。
- 该构建自身不能已经是复合构建的一部分。
- 构建的
rootProject.name
属性不能与其他已加入构建的同名。
- 构建的
rootProject.name
属性不能与顶层构建的名称相同。
2. 官方使用指南
官方文档提供了详细的示例(基于Gradle项目):官方文档链接。这里简要介绍三种实现复合构建的方法:
方法一:通过命令行参数--include-build
实现
假设项目结构如下(其中my-app
和my-utils
均为独立项目):
/samples/compositeBuilds/basic
|--my-app
|--build.gradle
|--src/main/java
|--my-utils
|--number-utils
|--string-utils
|--build.gradle
|--setting.gradle
在my-app
的build.gradle
中添加依赖:
dependencies {
compile 'org.sample:number-utils:1.0'
compile 'org.sample:string-utils:1.0'
}
然后在my-app
目录下执行命令gradle --include-build ../my-utils run
即可实现复合构建。
方法二:在settings.gradle
中声明复合构建
同样地,my-app/build.gradle
中的依赖保持不变。而在my-app/settings.gradle
中添加:
rootProject.name = 'my-app'
includeBuild '../my-utils'
之后,直接运行my-app
即可。
3. IDE集成
IDE集成是复合构建的一大亮点。通过在构建脚本中应用IDE插件,可以生成IDE项目,使得所有参与构建的项目能够在一个环境中共同开发。
除了Gradle插件外,最新的IntelliJ IDEA和Eclipse Buildship也直接支持复合构建的导入。这允许从各个独立的Gradle构建中轻松共享源代码,并提供跨构建的导航和重构支持。
在Android Studio中,只需要在AppProject/settings.gradle
中配置复合构建,打开项目时,IDE会自动识别并整合所有相关的构建。
4. Android环境下的应用实例
接下来,我们将探讨复合构建在Android项目中的具体应用。参考项目:调研项目地址。
项目结构
该项目由SDKProject
和AppProject
组成,其中SDKProject
包含一个SDK库和一个演示应用。
SDKProject
SDK库中仅有一个简单的工具类:
package com.wuba.survey.sdk.core;
public final class StringUtils {
private StringUtils() {}
public static String concat(String str) {
return '[Tunable]: ' + str;
}
}
此SDK可以通过Maven发布,例如:com.turn.test.sdk:TestSDK:xxx
。
AppProject
在AppProject
中,我们需要依赖上述发布的SDK:
dependencies {
implementation 'com.android.support.constraint:constraint-layout:2.0.4'
implementation fileTree(dir: 'libs', include: ['*.jar'])
// 依赖Maven发布的aar
implementation 'com.turn.test.sdk:TestSDK:1.0.0'
}
在settings.gradle
中配置复合构建和依赖替换:
include ':app'
// 复合构建 + 依赖替换
includeBuild('../SDKProject') {
dependencySubstitution {
substitute module('com.turn.test.sdk:TestSDK') with project(':TestSDK')
}
}
以上配置实现了:
- 自动导入
SDKProject
项目,并确保在构建AppProject
之前先构建SDKProject
。
- 将对
'com.turn.test.sdk:TestSDK'
的依赖替换为SDKProject
中的TestSDK
模块。
这种做法不仅简化了开发流程,还极大地提高了调试效率,尤其是在处理SDK相关问题时尤为明显。