主要包含:
1 2 3
| settings.gradle build.gradle app/build.gradle
|
以及gradle wrapper下的gradle jar包和配置文件
Gradle 文件执行顺序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| println("setting 开始配置") include ':app' rootProject.name='Hello' println("setting 配置完成")
println("根build.gradle 开始配置") buildscript { repositories { } dependencies { } } println("根build.gradle 配置完成")
println("app build.gradle 开始配置")
project.afterEvaluate { println "所有模块都已配置完成" }
android { defaultConfig { } buildTypes { } }
dependencies { } println("app build.gradle 配置完成")
|
三个文件中:
settings.gradle 先执行
build.gradle 第二执行
app/build.gradle 第三执行,如果注册了 project.afterEvaluate ,则后执行
在不同文件中注册project.afterEvaluate,对于不同的project
1 2 3 4 5 6 7 8 9 10 11 12
| setting 开始配置 setting 配置完成
> Configure project : 根build.gradle 开始配置 根build.gradle 配置完成 build.gradle 所有模块都已配置完成
> Configure project :app app build.gradle 开始配置 app build.gradle 配置完成 app build.gradle 所有模块都已配置完成
|
在settings.gradle中添加
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| gradle.addBuildListener(new BuildListener() {
@Override void beforeSettings(Settings settings) { super.beforeSettings(settings) }
@Override void settingsEvaluated(Settings settings) { println("settingsEvaluated------------") }
@Override void projectsLoaded(Gradle gradle) { println("projectsLoaded------------") }
@Override void projectsEvaluated(Gradle gradle) { println("projectsEvaluated------------") }
@Override void buildFinished(BuildResult result) { println("buildFinished------------") } })
|
输出
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| setting 开始配置 setting 配置完成 settingsEvaluated------------ projectsLoaded------------
> Configure project : 根build.gradle 开始配置 根build.gradle 配置完成 build.gradle 所有模块都已配置完成
> Configure project :app app build.gradle 开始配置 app build.gradle 配置完成 app build.gradle 所有模块都已配置完成 projectsEvaluated------------ buildFinished------------
|
如果是在build.gradle中添加则输出
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| setting 开始配置 setting 配置完成
> Configure project : 根build.gradle 开始配置 根build.gradle 配置完成 build.gradle 所有模块都已配置完成
> Configure project :app app build.gradle 开始配置 app build.gradle 配置完成 app build.gradle 所有模块都已配置完成 projectsEvaluated------------ buildFinished------------
|
可以看到settingsEvaluated、projectsLoaded相关的没有打印,因为这个时候settingsEvaluated和projectsLoaded已经执行过了。
Gradle Task
在build.gradle文件中:
1 2 3 4 5 6 7 8 9 10 11 12
| task hello() { println "hello world"
doFirst { println "hello task doFirst" }
doLast { println "hello task doLast" } }
|
settings.gradle是项目配置文件,无法添加task。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| setting 开始配置 setting 配置完成
> Configure project : 根build.gradle 开始配置 根build.gradle 配置完成 hello world build.gradle 所有模块都已配置完成
> Configure project :app app build.gradle 开始配置 app build.gradle 配置完成 app build.gradle 所有模块都已配置完成
> Task :hello hello task doFirst hello task doLast
|
可以看到,会先执行配置,然后才会执行task。
其中ext是内置变量
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| ext.a="1222"
task hello() { println "hello world"
doFirst { println "hello task doFirst:$a" }
doLast { println "hello task doLast" } }
|
1 2 3
| > Task :hello hello task doFirst:1222 hello task doLast
|
Build监听
在settings.gradle中配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| gradle.addBuildListener(new BuildListener() {
@Override void beforeSettings(Settings settings) { super.beforeSettings(settings) println("beforeSettings------------") }
@Override void settingsEvaluated(Settings settings) { println("settingsEvaluated------------") }
@Override void projectsLoaded(Gradle gradle) { println("projectsLoaded------------") }
@Override void projectsEvaluated(Gradle gradle) { println("projectsEvaluated------------") }
@Override void buildFinished(BuildResult result) { println("buildFinished------------") } })
|
输出
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| setting 开始配置 setting 配置完成 settingsEvaluated------------ projectsLoaded------------
> Configure project : 根build.gradle 开始配置 根build.gradle 配置完成 hello world build.gradle 所有模块都已配置完成
> Configure project :app app build.gradle 开始配置 app build.gradle 配置完成 app build.gradle 所有模块都已配置完成 projectsEvaluated------------ buildFinished------------
|
当执行assemble时
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| setting 开始配置 setting 配置完成 settingsEvaluated------------ projectsLoaded------------
> Configure project : 根build.gradle 开始配置 根build.gradle 配置完成 hello world build.gradle 所有模块都已配置完成
> Configure project :app app build.gradle 开始配置 app build.gradle 配置完成 app build.gradle 所有模块都已配置完成 projectsEvaluated------------
> Task :app:preBuild UP-TO-DATE > Task :app:preDebugBuild UP-TO-DATE ... buildFinished------------
|
可以看到,先执行Evaluated settings,然后是Loaded projects,每个项目的配置设置完后,projectsEvaluated。之后执行各种Task。执行完最后完成buildFinished。
Task执行监听
1 2 3 4 5 6 7 8 9 10 11
| gradle.addListener(new TaskExecutionListener() { @Override void beforeExecute(Task task) { println "打印beforeExecute ${task} ==" }
@Override void afterExecute(Task task, TaskState taskState) { println "打印afterExecute ${task.getPath()} --- ${taskState} ==" } })
|
输出:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| setting 开始配置 setting 配置完成
> Configure project : 根build.gradle 开始配置 根build.gradle 配置完成 hello world build.gradle 所有模块都已配置完成
> Configure project :app app build.gradle 开始配置 app build.gradle 配置完成 app build.gradle 所有模块都已配置完成
> Task :app:preBuild UP-TO-DATE 打印beforeExecute task ':app:preBuild' == 打印afterExecute :app:preBuild --- org.gradle.api.internal.tasks.TaskStateInternal@6bbf2d19 ==
> Task :app:preDebugBuild UP-TO-DATE 打印beforeExecute task ':app:preDebugBuild' == 打印afterExecute :app:preDebugBuild --- org.gradle.api.internal.tasks.TaskStateInternal@62fecb05 == ...
|
会在task执行前后打印日志
Gradle 插件
1 2 3 4 5 6 7 8 9
| println("before apply plugin") apply plugin: MyPlugin println("after apply plugin") class MyPlugin implements Plugin<Project>{ @Override void apply(Project project) { println "apply MyPlugin: ${project.name}" } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| setting 开始配置 setting 配置完成
> Configure project : 根build.gradle 开始配置 根build.gradle 配置完成 hello world build.gradle 所有模块都已配置完成
> Configure project :app app build.gradle 开始配置 app build.gradle 配置完成 before apply plugin apply MyPlugin: app after apply plugin app build.gradle 所有模块都已配置完成
|
可以看到插件走的是配置。在配置时,会执行插件的apply。
1 2 3 4 5 6 7 8 9 10 11
| println("before apply plugin") apply plugin: MyPlugin println("after apply plugin") class MyPlugin implements Plugin<Project>{ @Override void apply(Project project) { println "apply MyPlugin: ${project.name}" project.extensions.add("testKey","helloWork") } } println("$testKey")
|
通过 apply plugin: MyPlugin
后,将testKey
设置到project.extensions
中,后面直接使用。
Gradle Project
gradle project常用属性:
1 2 3 4 5 6 7 8
| project.afterEvaluate{ }
project.plugins.hasPlugin("com.android.library")
project.configurations
project.gradle.addListener()
|
通过project中的字段来设置一些东西。
Gradle 依赖
1 2 3 4 5 6 7 8 9 10 11
| project.gradle.addListener(new DependencyResolutionListener(){ @Override void beforeResolve(ResolvableDependencies resolvableDependencies) { }
@Override void afterResolve(ResolvableDependencies resolvableDependencies) {
} })
|
Gradle 插件添加任务
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| class MyTaskPlugin implements Plugin<Project>{ @Override void apply(Project project) { project.task(...) } }
class MyProjectTask extends DefaultTask{ @Input String xxx
@Input String yyy
@TaskAction void doPackage() { } }
|
打印task耗时Demo
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
| apply plugin: MyPlugin class MyPlugin implements Plugin<Project>{ private Project mProject; @Override void apply(Project project) { mProject = project; project.gradle.addListener(new BuildTimeListener()) } }
class BuildTimeListener implements TaskExecutionListener, BuildListener {
Map<String, TaskTimeInfo> taskTimeMap = new HashMap<>()
@Override void buildStarted(Gradle gradle) {
}
@Override void settingsEvaluated(Settings settings) {
}
@Override void projectsLoaded(Gradle gradle) {
}
@Override void projectsEvaluated(Gradle gradle) {
}
@Override void buildFinished(BuildResult buildResult) { println "-----------------GouAPM----------------------" println "---------------------------------------" println "build finished, now println all task execution time:" taskTimeMap.each{ k, v -> println "${k}:[${v.total}ms]" } println "---------------------------------------" println "---------------------------------------"
}
@Override void beforeExecute(Task task) { TaskTimeInfo timeInfo = new TaskTimeInfo() timeInfo.start = System.currentTimeMillis() timeInfo.path = task.getPath() taskTimeMap.put(task.getPath(), timeInfo) }
@Override void afterExecute(Task task, TaskState taskState) { TaskTimeInfo timeInfo = taskTimeMap.get(task.getPath()) timeInfo.end = System.currentTimeMillis() timeInfo.total = timeInfo.end - timeInfo.start }
class TaskTimeInfo { long total String path long start long end } }
|