Gradle Api

1,377 阅读3分钟

这是我参与更文挑战的第9天,活动详情查看:更文挑战

前言:

gradle 提供的API非常丰富,前面已经说过,gradle构建文件中使用的API主要由Project和Task两个接口组成,在项目中如果想进行在线查看API,我们可以使用 debugApi("com.android.tools.build:gradle:4.1.2")进行依赖到项目,这样我们在快速跳转时就可以看到源码

Project

简单来说一个build.gradle文件就是一个Project,我们可以使用Project接口提供的api和构建的文件交互。

在我们新建Gradle构建的项目时,会在根目录下有一个Settting.gradle/Setting.gradle.kts(如果使用kotlin),脚本执行时会根据Setting.gradle进行配置并创建Project对象,比如:

include(":app")
rootProject.name = "android-samples"

代表了Root Project ' android-samples '包含了一个名为'app'的 Sub Project (每个模块都有一个build.gradle,也就是每个模块都有一个Project对象) SubProject 脚本的执行顺序为include添加的顺序。 一个Project本质上是一个Task的集合,每一个Task都是一个最小的执行单元,比如编译类,运行test,执行clean操作tasks.register<Delete>("clean") { delete(rootProject.buildDir) } 添加Task:

  • 使用TaskContainer的create方法进行添加 TaskContainer.create(String),使用 TaskContainer 上getByName来定位任务,例如 TaskCollection.getByName(String)。
TaskContainer API

TaskContainer 继承自TaskCollection 由此可以看出 TaskContainer就是一个集合,用来管理Task

我们可以通过调用 Project.getTasks() 或使用构建脚本中的 tasks 属性来获取 TaskContainer 实例。

MethodDescription
create​(String name)以及重载方法创建一个任务并添加到TaskContainer中
register​(String name)以及重载方法定义一个新任务并在需要时进行创建(注意和create的区别)
replace​(String name)创建给定名称的Task并将其添加到TaskContainer中,替换具有相同名称的任何现有Task
findByPath​(String path)'path'为Task名称、相对路径或绝对路径。相对路径是相对于该TaskContainer。如果不存在具有给定路径的任务,则此方法返回 null
getByPath​(String path)'path'为Task名称、相对路径或绝对路径。相对路径是相对于该TaskContainer。如果不存在具有给定路径的任务,则此方法抛出异常注意和findByPath的区别
Script API
MethodDescription
apply​(Closure closure)引用脚本
afterEvaluate​(Closure closure)脚本执行完成之后执行
allprojects​(Closure configureClosure)配置此项目及其每个子项目
beforeEvaluate​(Closure closure)脚本执行前执行
buildscript​(Closure configureClosure)配置gradle脚本自身需要使用的资源
copy​(Closure closure)复制文件和目录
delete​(Object... paths)删除文件和目录
dependencies​(Closure configureClosure)配置此项目的依赖项
mkdir​(Object path)创建一个目录并返回一个指向它的文件

apply​(Closure closure)闭包委托类型为ObjectConfigurationAction

apply from(path) //可以为本地脚本或者使用Uri引用http服务

apply plugin((String pluginId)//插件配置的ID

apply plugin(Class<? extends Plugin> pluginClass)

buildscript 闭包委托类型为ScriptHandler

dependencies 闭包委托类型为 DependencyHandler

  • add(String configurationName, Object dependencyNotation)函数 configurationName 就是配置的名称比如常用的implementation,api,debugApi等 dependencyNotation 就是我们需要配置的依赖项

dependencyNotation 是一个字符串由group,name version组成,也可以使用实现了Dependency接口的类 本质上也是定义了group,name 和version

我们获取到project对象下的dependencies对象并且添加依赖

//配置当前project依赖的 configure
configurations {
    implementation.configure {
        exclude("com.gavindon")
    }
}
dependencies.add(
    "implementation",
    "org.jetbrains.kotlin:kotlin-stdlib:${parent?.extra?.get("kotlin_version")}"
) {
    //去除依赖group为com.stxx的包 当项目中所依赖的包和第三方库所依赖的包冲突时可以取消库的依赖
    //exclude 可以指定group 或者module 根据情况来指定
    exclude("com.stxx")
}
//添加一个依赖,并进行配置exclude ,include
dependencies.add(
    "implementation",
    org.gradle.api.internal.artifacts.dependencies.DefaultClientModule(
        "androidx.constraintlayout",
        "constraintlayout",
        "2.0.4"
    )
) {
    //去除依赖group为com.stxx的包
    exclude("com.stxx")
    //是否传递依赖(简单说就是是否下载当前依赖库所依赖的其他库)
    isTransitive = false
}
//添加文件
dependencies.add(
    "implementation",
    files("wemeeting.jar")
)
dependencies.run {
    implementation("androidx.core:core-ktx:1.3.2")
    implementation("androidx.appcompat:appcompat:1.2.0")
    implementation("com.google.android.material:material:1.2.1")
    testImplementation("junit:junit:4.13.2")
    androidTestImplementation("androidx.test.ext:junit:1.1.2")
    androidTestImplementation("androidx.test.espresso:espresso-core:3.3.0")
    debugApi("com.android.tools.build:gradle:4.1.2")
    implementation(
        //添加文件目录
        fileTree(
            Pair("dir", "libs"),
            Pair("include", "*.jar"),
            Pair("include", "*.aar")
        )
    )

}


我们可以在buildSrc中统一管理依赖,定义好库地址,动态add。 gitee源码地址