Gradle buildSrc替换方案之Composing builds

Android面试技术要点汇总
2021-05-17 14:29 · 阅读时长5分钟
小课

在多模块的Android项目中,我们需要在gradle中定义一些通用的参数、方法或者任务,然后提供给各个子模块使用。

一、通过ext配置

最初的时候,我们会在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}

但是这种方式有点不足是,不能代码补全和单击跳转,查找和修改不是很方便。

二、通过buildSrc配置

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配置

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模块更新并不会导致整个项目重新编译。

  1. 与buildSrc不同的是,名字可修改,而且buildSrc创建的目录,gradle会自动处理为module,而这里是创建模块,并且配置到settings.gradle中。
注释
加载中...
buildSrcComposing buildsandroidgradle