在多模块的Android项目中,我们需要在gradle中定义一些通用的参数、方法或者任务,然后提供给各个子模块使用。
最初的时候,我们会在projectRoot/build.gradle中定义属性或者方法,比如:
1// 在projectRoot/build.gradle中
2buildscript {
3 ext {
4 //定义属性
5 compileSdkVersion = 30
6 //或者方法
7 configureAndroidByExt = { project ->
8 project.android {
9 compileSdkVersion 30
10 }
11 }
12 }
13}
14
15// 在projectRoot/module/build.gradle中
16//通过调用方法来设置
17configureAndroidByExt(this)
18//通过使用属性来设置
19android {
20 compileSdkVersion rootProject.ext.compileSdkVersion
21}
但是这种方式有点不足是,不能代码补全和单击跳转,查找和修改不是很方便。
参考:Gradle 提示与诀窍
注释buildSrc提供了更加灵活的配置,最重要的是它支持自动补全和单机跳转,我们需要在项目根目录下创建一个名为buildSrc的文件夹,在文件夹内创建build.gradle文件以及src/main/java/com/example/compositebuild/Versions.java,在Versions.java中定义属性。
package com.example.compositebuild;
public class Versions {
public static final int compileSdkVersion = 30;
}
然后在模块的build.gradle中直接引用属性。
android {
//通过buildSrc定义的属性来配置compileSdkVersion,单击可跳转,可自动补全
compileSdkVersion Versions.compileSdkVersion
}
目前来看,buildSrc已经非常不错了,至少在维护上面方便了很多,但是它有一个缺点是,当更新buildSrc时,会导致整个项目重新编译,增加编译时间,如果项目小影响还不是很大,但是如果项目很大,这个增加的时间将会变得不可接受。
Composing builds与buildSrc的使用方式相似,首先在项目中创建模块depsVersion1,在模块中创建src/main/java/com/example/compositebuild/DepsPlugin.java
public class DepsPlugin implements Plugin<Project> {
public static final int compileSdkVersion = 30;
@Override
public void apply(Project project) {
}
}
创建并配置depsVersion/build.gradle
plugins {
id 'java-gradle-plugin'
}
gradlePlugin {
plugins.register("deps-plugin") {
id = 'deps-plugin'
version = '1.0'
implementationClass = 'com.example.compositebuild.DepsPlugin'
}
}
在projectRoot/settings.gradle中配置
//注意和平时的模块配置不一样,比如app模块配置是 include ':app'
includeBuild 'depsVersion'
这样Composing builds模块就配置好了,如果其它模块需要使用,则需要在模块的build.gradle中配置,比如app模块
plugins {
...
//引入Composing Builds的插件
id 'deps-plugin'
}
android {
//通过Compositing Build定义的属性来配置compileSdkVersion,单击可跳转,可自动补全
compileSdkVersion DepsPlugin.compileSdkVersion
}
这样app模块就能使用Composing builds模块中定义的属性了,不仅支持自动补全和代码跳转,而且Composing builds模块更新并不会导致整个项目重新编译。