如果你对本文感兴趣,也许你对我的公众号也会有兴趣,可扫下方二维码或搜索公众微信号:mxszgg
本文基于 Android Gradle plugin 3.0.1
前言
在 app/build.gradle
中添加如下依赖:
compileOnly ‘com.android.tools.build:gradle:3.0.1’
即可在 External Libraries 中看到关于 Gradle plugin 的源码。
Gradle 源码如何引入将会在下一节中介绍
task 撰写
task 声明
根据官方文档和 Task#create() 可以知道,task 的基本写法可以是如下四种:
task myTask
task myTask { configure closure }
task (myTask) { configure closure }
task (name: myTask) { configure closure }
每一个 task 都有自己的名字,这样开发者才能调用它,例如调用上面的 task:
./gradlew myTask
但是有一个问题,倘若当前项目的 app module 和 a module 都含有一个名为 myTask 的 task,那么会不会起冲突,该如何调用它们?答案是不会冲突,调用方式如下:
./gradlew app:myTask
(调用 app module 的 myTask)
./gradlew a:myTask
(调用 a module 的 myTask)
通过 ProjectName:taskName
的形式便可以指定唯一绝对路径去调用指定 Project 的指定 task 了。
扩展
根据 Task#create() 可以知道,task 的创建是可以声明参数的,除了上述的 name
参数之外,还有如下几种:
-
type
:默认为 DefaultTask。类似于父类。在后文中将会提及该参数。 -
dependsOn
:默认为[]。希望依赖的 tasks,等同于Task.dependsOn(Object... path)
中的 path。在后文中将会提及该参数。 -
action
:默认为 null。等同于Task.doFirst { Action }
中的 Action。task (name: actionTest, action: new Action<Task>() { @Override void execute(Task task) { println 'hello' } }) { }
等同于
task (name: actionTest) { doFirst { println