插件的概念
Gradle本身提供了基本的概念和 核心框架,这两样东西,完全不涉及到 业务内容,它们只提供业务可能用到的抽象过程,而业务内容(涉及到真实应用场景的逻辑性质的代码)全部以外来扩展插件的方式实现。Gradle本身内置了一些常用插件,他们基本上能帮助我们处理大部分场景,但是也有例外,有些插件需要我们手动去开发,甚至发布。
插件的作用
上面说过,插件是核心模块的扩展。我们将一个gradle plugin应用到我们的项目中之后,可以帮我们处理构建过程中的很多事情,举个例子:
-
添加扩展属性
android{} 内部诸多的配置项,就是
com.android.tools.build:gradle
插件为project对象(gradle默认的顶层对象)添加的一个扩展,我们在android{}中指定sdk版本以及其他参数 -
添加新的task到你已有的task列表中
添加自定义的task,然后与已有任务挂钩,是非常基础的改变打包流程的做法。
-
添加依赖配置
当我们编译项目时,如果需要用到第三方依赖,gradle插件可以帮助我们设定第三方依赖库的地址
-
预设约定
比如我们的java源代码的位置,默认就是src/main/java,如果我们想把其他某些地方的java文件也打成class,dex到最终的apk内部,也能用插件来做到。
如何应用插件
假如有一个新的插件,我们希望它在我们的项目中发挥作用,应该如何做?
首先来看看插件的分类:
二进制插件
二进制插件有几个要素:
- 实现 org.gradle.api.Plugin接口
- 进行全局id的注册
它的本质是一个jar包,内部包含了插件逻辑,可编写的语言包括 java, kotlin以及groovy,
假如我们实现了一个二进制插件,完整类名为:com.test.my.MyPlugin,那么应用它的写法为:
apply plugin: ‘com.test.my.MyPlugin’
必须确保完整类名全局唯一。
脚本插件
脚本插件,则是 以纯 gradle文件的形式体现的 插件逻辑。
比如,我们设定了一个version.gradle
用于保存所有的版本号:
// ext是rootProject的成员属性,
// 注意,所有的gradle文件都默认引用了 全局的rootProject
ext {
versionName = '1.0.0'
versionCode = 100
}
那么,我们在同级目录下的build.gradle文件中则可以直接这么用:
相对路径的写法:
apply from: "../version.gradle"
或者 用 rootProject对象来获取文件:
apply from: rootProject.file('version.gradle')
总是就是让当前的build.gradle引用到 其他位置的gradle文件,类似 java的import操作。
同样,如果是网络上的 gradle文件,则可以直接使用:
apply from: 'https://example.com/version.gradle'
apply的多种用法
map方式
剖析刚才的 apply from的写法,其实后面的 from:'xxxx'
是一个 Map的写法,方法的原型是:
void apply(Map<String, ?> options);
闭包方式
还有闭包的写法:
apply {
from '../version.gradle'
}
它的原型则是:
void apply(Closure closure)
另外,还有 action的写法:
action方式
void apply(Action<? super ObjectConfigurationAction> action);
具体写法为:
apply (new Action<ObjectConfigurationAction>() {
@Override
void execute(ObjectConfigurationAction objectConfigurationAction) {
objectConfigurationAction.from('../version.gradle')
}
})
以上三种写法效果等同。
应用第三方插件
常规方式
第三方发布的二进制插件,我们必须在 使用之前先下载它的下载仓库,位置在 全局的build.gradle
中:
比如:
buildscript {
repositories {
google()
}
dependencies {
classpath 'com.android.tools.build:gradle:4.0.0'
}
}
比如上面的写法,buildScript配置,就是配置了 远程仓库地址为:google()
. 实际地址为:https://dl.google.com/dl/android/maven2/
然后设定要使用的插件的 DSL参数,包括 group
,name
,以及version
,分别对应上面的:com.android.tools.build
, gradle
, 4.0.0
这3个。
除此之外,还有另外一种写法:
使用plugins DSL
plugins {
id 'com.android.tools.build:gradle' version '4.0.0'
}
效果等同。
必须注意的是
如果是要apply一个官方仓库的插件的话,前面 buildScript 的配置可以不写,因为内置了,在官方插件仓库有很多优秀的插件,好用的轮子,可以直接找到而不需要自己开发,这就是gradle的生态。
最后
如果想要成为架构师或想突破20~30K薪资范畴,那就不要局限在编码,业务,要会选型、扩展,提升编程思维。此外,良好的职业规划也很重要,学习的习惯很重要,但是最重要的还是要能持之以恒,任何不能坚持落实的计划都是空谈。
如果你没有方向,这里给大家分享一套由阿里高级架构师编写的《Android八大模块进阶笔记》,帮大家将杂乱、零散、碎片化的知识进行体系化的整理,让大家系统而高效地掌握Android开发的各个知识点。
相对于我们平时看的碎片化内容,这份笔记的知识点更系统化,更容易理解和记忆,是严格按照知识体系编排的。
欢迎大家一键三连支持,若需要文中资料,直接扫描文末CSDN官方认证微信卡片免费领取↓↓↓
PS:群里还设有ChatGPT机器人,可以解答大家在工作上或者是技术上的问题