bingoogolapple.github.io
bingoogolapple.github.io copied to clipboard
Gradle
执行流程
- Initialization 初始化阶段
- 解析整个工程中所有的 Project 对应的 Project 对象
- Configuration 配置阶段
- 解析所有的 Project 对象中的 Task,构建好所有 Task 的拓扑图(有向无环图)
- Execution 执行阶段
- 执行具体的 Task 及其依赖 Task
生命周期监听
- settings.gradle
log "①初始化阶段 START"
rootProject.name = 'dsl-note'
include ':groovy', ':kotlin'
include ':app'
include ':dirone', ':dirone:moduleone'
include ':moduletwo'
project(':moduletwo').projectDir = new File(settingsDir, 'dirtwo/moduletwo')
gradle.addBuildListener(new BuildListener() {
@Override
void buildStarted(Gradle gradle) {
log "执行阶段开始 BuildListener buildStarted"
}
@Override
void settingsEvaluated(Settings settings) {
log "①初始化阶段「1」BuildListener settingsEvaluated"
}
@Override
void projectsLoaded(Gradle gradle) {
log "①初始化阶段「3」BuildListener projectsLoaded"
log "①初始化阶段 END"
}
@Override
void projectsEvaluated(Gradle gradle) {
log "③配置阶段结束后「4」BuildListener projectsEvaluated 所有模块的配置阶段都结束了"
}
@Override
void buildFinished(BuildResult result) {
log "⑨执行阶段完毕「1」BuildListener buildFinished ${result} ${result.action}"
}
})
gradle.settingsEvaluated { Settings settings ->
log "①初始化阶段「2」gradle.settingsEvaluated"
}
gradle.addProjectEvaluationListener(new ProjectEvaluationListener() {
@Override
void beforeEvaluate(Project project) {
log "②配置阶段开始前「1」ProjectEvaluationListener beforeEvaluate ${project.name}"
}
@Override
void afterEvaluate(Project project, ProjectState state) {
log "③配置阶段结束后「1」ProjectEvaluationListener afterEvaluate ${project.name} ${state}"
}
})
gradle.beforeProject { Project targetProject ->
log "②配置阶段开始前「2」gradle.beforeProject ${targetProject.name}"
}
gradle.afterProject { Project targetProject ->
log "③配置阶段结束后「2」gradle.afterProject ${targetProject.name} =====> ③配置阶段结束后「3」project.afterEvaluate"
}
gradle.projectsEvaluated { Gradle gradle ->
log "③配置阶段结束后「5」gradle.projectsEvaluated 所有模块的配置阶段都结束了"
}
gradle.buildStarted { Gradle gradle ->
log "执行阶段开始 buildStarted"
}
gradle.buildFinished { BuildResult buildResult ->
log "⑨执行阶段完毕「2」buildFinished ${buildResult} ${buildResult.action}"
}
def log(String msg) {
println "lifecycle ====> settings.gradle ====> ${msg}"
}
- build.gradle -> lifecycle.gradle
/**
* doFirst 越后添加的越先执行
* doLast 越后添加的越后执行
*/
task testLifecycle(group: 'bga') {
log 'testLifecycle 配置阶段 1'
doFirst {
log 'doFirst 1'
}
doFirst {
log 'doFirst 2'
}
doLast {
log 'doLast 1'
}
doLast {
log 'doLast 2'
}
log 'testLifecycle 配置阶段 2'
}
testLifecycle.doFirst {
log 'doFirst 3'
}
testLifecycle.doLast {
log 'doLast 3'
}
// 配置阶段开始前
project.beforeEvaluate { Project targetProject ->
log "project.beforeEvaluate ${project.name}"
}
// 配置阶段完毕后。afterProject 之后
project.afterEvaluate { Project targetProject ->
log "③配置阶段结束后「3」project.afterEvaluate ${project.name}"
testLifecycle.doFirst {
log 'doFirst 4'
}
testLifecycle.doLast {
log 'doLast 4'
}
}
gradle.addListener(new TaskExecutionGraphListener() {
@Override
void graphPopulated(TaskExecutionGraph graph) {
log "④构建好 Task 拓扑图「1」TaskExecutionGraphListener graphPopulated1 ${graph}"
}
})
gradle.addListener(new TaskExecutionListener() {
@Override
void beforeExecute(Task task) {
if (task.name == 'testLifecycle') {
// beforeExecute 中可以设置是否可用
// task.enabled = false
task.doFirst {
log 'doFirst 5'
}
task.doLast {
log 'doLast 5'
}
}
log "⑤执行 Task 之前「1」TaskExecutionListener beforeExecute1 ${task}"
}
@Override
void afterExecute(Task task, TaskState state) {
log "⑧执行 Task 之后「1」TaskExecutionListener afterExecute1 ${task} ${state}"
}
})
gradle.addListener(new TaskActionListener() {
@Override
void beforeActions(Task task) {
if (task.name == 'testLifecycle') {
// beforeActions 中不可以设置是否可用
task.doFirst {
log 'doFirst 8'
}
task.doLast {
log 'doLast 8'
}
}
log "⑥执行 Task Action 之前,还能添加 Action,但不能修改 Task 是否可用 ==> TaskActionListener beforeActions ${task}"
}
@Override
void afterActions(Task task) {
log "⑦执行 Task Action 之后 ==> TaskActionListener afterActions ${task}"
}
})
gradle.taskGraph.whenReady { TaskExecutionGraph graph ->
log "④构建好 Task 拓扑图「2」whenReady ${graph}"
}
gradle.taskGraph.addTaskExecutionGraphListener(new TaskExecutionGraphListener() {
@Override
void graphPopulated(TaskExecutionGraph graph) {
log "④构建好 Task 拓扑图「3」TaskExecutionGraphListener graphPopulated2 ${graph}"
}
})
gradle.taskGraph.addTaskExecutionListener(new TaskExecutionListener() {
@Override
void beforeExecute(Task task) {
if (task.name == 'testLifecycle') {
// task.enabled = false
task.doFirst {
log 'doFirst 6'
}
task.doLast {
log 'doLast 6'
}
}
log "⑤执行 Task 之前「2」TaskExecutionListener beforeExecute2 ${task}"
}
@Override
void afterExecute(Task task, TaskState state) {
log "⑧执行 Task 之后「2」TaskExecutionListener afterExecute2 ${task} ${state}"
}
})
gradle.taskGraph.beforeTask { Task task ->
if (task.name == 'testLifecycle') {
// task.enabled = false
task.doFirst {
log 'doFirst 7'
}
task.doLast {
log 'doLast 7'
}
}
log "⑤执行 Task 之前「3」beforeTask ${task}"
}
gradle.taskGraph.afterTask { Task task, TaskState state ->
log "⑧执行 Task 之后「3」afterTask ${task} ${state}"
}
def log(String msg) {
println "lifecycle ====> ${project.name} ====> ${msg}"
}
- 输出
lifecycle ====> settings.gradle ====> ①初始化阶段 START
lifecycle ====> settings.gradle ====> ①初始化阶段「1」BuildListener settingsEvaluated
lifecycle ====> settings.gradle ====> ①初始化阶段「2」gradle.settingsEvaluated
lifecycle ====> settings.gradle ====> ①初始化阶段「3」BuildListener projectsLoaded
lifecycle ====> settings.gradle ====> ①初始化阶段 END
Configuration on demand is an incubating feature.
lifecycle ====> settings.gradle ====> ②配置阶段开始前「1」ProjectEvaluationListener beforeEvaluate dsl-note
lifecycle ====> settings.gradle ====> ②配置阶段开始前「2」gradle.beforeProject dsl-note
lifecycle ====> dsl-note ====> testLifecycle 配置阶段 1
lifecycle ====> dsl-note ====> testLifecycle 配置阶段 2
lifecycle ====> settings.gradle ====> ③配置阶段结束后「1」ProjectEvaluationListener afterEvaluate dsl-note project state 'EXECUTED'
lifecycle ====> settings.gradle ====> ③配置阶段结束后「2」gradle.afterProject dsl-note =====> ③配置阶段结束后「3」project.afterEvaluate
lifecycle ====> dsl-note ====> ③配置阶段结束后「3」project.afterEvaluate dsl-note
lifecycle ====> settings.gradle ====> ②配置阶段开始前「1」ProjectEvaluationListener beforeEvaluate app
lifecycle ====> settings.gradle ====> ②配置阶段开始前「2」gradle.beforeProject app
lifecycle ====> settings.gradle ====> ③配置阶段结束后「1」ProjectEvaluationListener afterEvaluate app project state 'EXECUTED'
lifecycle ====> settings.gradle ====> ③配置阶段结束后「2」gradle.afterProject app =====> ③配置阶段结束后「3」project.afterEvaluate
lifecycle ====> settings.gradle ====> ②配置阶段开始前「1」ProjectEvaluationListener beforeEvaluate dirone
lifecycle ====> settings.gradle ====> ②配置阶段开始前「2」gradle.beforeProject dirone
lifecycle ====> settings.gradle ====> ③配置阶段结束后「1」ProjectEvaluationListener afterEvaluate dirone project state 'EXECUTED'
lifecycle ====> settings.gradle ====> ③配置阶段结束后「2」gradle.afterProject dirone =====> ③配置阶段结束后「3」project.afterEvaluate
lifecycle ====> settings.gradle ====> ②配置阶段开始前「1」ProjectEvaluationListener beforeEvaluate groovy
lifecycle ====> settings.gradle ====> ②配置阶段开始前「2」gradle.beforeProject groovy
lifecycle ====> settings.gradle ====> ③配置阶段结束后「1」ProjectEvaluationListener afterEvaluate groovy project state 'EXECUTED'
lifecycle ====> settings.gradle ====> ③配置阶段结束后「2」gradle.afterProject groovy =====> ③配置阶段结束后「3」project.afterEvaluate
lifecycle ====> settings.gradle ====> ②配置阶段开始前「1」ProjectEvaluationListener beforeEvaluate kotlin
lifecycle ====> settings.gradle ====> ②配置阶段开始前「2」gradle.beforeProject kotlin
lifecycle ====> settings.gradle ====> ③配置阶段结束后「1」ProjectEvaluationListener afterEvaluate kotlin project state 'EXECUTED'
lifecycle ====> settings.gradle ====> ③配置阶段结束后「2」gradle.afterProject kotlin =====> ③配置阶段结束后「3」project.afterEvaluate
lifecycle ====> settings.gradle ====> ②配置阶段开始前「1」ProjectEvaluationListener beforeEvaluate moduletwo
lifecycle ====> settings.gradle ====> ②配置阶段开始前「2」gradle.beforeProject moduletwo
lifecycle ====> settings.gradle ====> ③配置阶段结束后「1」ProjectEvaluationListener afterEvaluate moduletwo project state 'EXECUTED'
lifecycle ====> settings.gradle ====> ③配置阶段结束后「2」gradle.afterProject moduletwo =====> ③配置阶段结束后「3」project.afterEvaluate
lifecycle ====> settings.gradle ====> ②配置阶段开始前「1」ProjectEvaluationListener beforeEvaluate moduleone
lifecycle ====> settings.gradle ====> ②配置阶段开始前「2」gradle.beforeProject moduleone
lifecycle ====> settings.gradle ====> ③配置阶段结束后「1」ProjectEvaluationListener afterEvaluate moduleone project state 'EXECUTED'
lifecycle ====> settings.gradle ====> ③配置阶段结束后「2」gradle.afterProject moduleone =====> ③配置阶段结束后「3」project.afterEvaluate
lifecycle ====> settings.gradle ====> ③配置阶段结束后「4」BuildListener projectsEvaluated 所有模块的配置阶段都结束了
lifecycle ====> settings.gradle ====> ③配置阶段结束后「5」gradle.projectsEvaluated 所有模块的配置阶段都结束了
lifecycle ====> dsl-note ====> ④构建好 Task 拓扑图「1」TaskExecutionGraphListener graphPopulated1 org.gradle.execution.taskgraph.DefaultTaskGraphExecuter@6ad263e8
lifecycle ====> dsl-note ====> ④构建好 Task 拓扑图「2」whenReady org.gradle.execution.taskgraph.DefaultTaskGraphExecuter@6ad263e8
lifecycle ====> dsl-note ====> ④构建好 Task 拓扑图「3」TaskExecutionGraphListener graphPopulated2 org.gradle.execution.taskgraph.DefaultTaskGraphExecuter@6ad263e8
:testLifecycle
lifecycle ====> dsl-note ====> ⑤执行 Task 之前「1」TaskExecutionListener beforeExecute1 task ':testLifecycle'
lifecycle ====> dsl-note ====> ⑤执行 Task 之前「2」TaskExecutionListener beforeExecute2 task ':testLifecycle'
lifecycle ====> dsl-note ====> ⑤执行 Task 之前「3」beforeTask task ':testLifecycle'
lifecycle ====> dsl-note ====> ⑥执行 Task Action 之前,还能添加 Action,但不能修改 Task 是否可用 ==> TaskActionListener beforeActions task ':testLifecycle'
lifecycle ====> dsl-note ====> doFirst 8
lifecycle ====> dsl-note ====> doFirst 7
lifecycle ====> dsl-note ====> doFirst 6
lifecycle ====> dsl-note ====> doFirst 5
lifecycle ====> dsl-note ====> doFirst 4
lifecycle ====> dsl-note ====> doFirst 3
lifecycle ====> dsl-note ====> doFirst 2
lifecycle ====> dsl-note ====> doFirst 1
lifecycle ====> dsl-note ====> doLast 1
lifecycle ====> dsl-note ====> doLast 2
lifecycle ====> dsl-note ====> doLast 3
lifecycle ====> dsl-note ====> doLast 4
lifecycle ====> dsl-note ====> doLast 5
lifecycle ====> dsl-note ====> doLast 6
lifecycle ====> dsl-note ====> doLast 7
lifecycle ====> dsl-note ====> doLast 8
lifecycle ====> dsl-note ====> ⑦执行 Task Action 之后 ==> TaskActionListener afterActions task ':testLifecycle'
lifecycle ====> dsl-note ====> ⑧执行 Task 之后「1」TaskExecutionListener afterExecute1 task ':testLifecycle' org.gradle.api.internal.tasks.TaskStateInternal@6a52d742
lifecycle ====> dsl-note ====> ⑧执行 Task 之后「2」TaskExecutionListener afterExecute2 task ':testLifecycle' org.gradle.api.internal.tasks.TaskStateInternal@6a52d742
lifecycle ====> dsl-note ====> ⑧执行 Task 之后「3」afterTask task ':testLifecycle' org.gradle.api.internal.tasks.TaskStateInternal@6a52d742
BUILD SUCCESSFUL in 0s
1 actionable task: 1 executed
lifecycle ====> settings.gradle ====> ⑨执行阶段完毕「1」BuildListener buildFinished org.gradle.BuildResult@32bc9db9 Build
lifecycle ====> settings.gradle ====> ⑨执行阶段完毕「2」buildFinished org.gradle.BuildResult@32bc9db9 Build
TODO
TODO
TODO
- Settings
- Project ✓
- ScriptHandler ✓
- RepositoryHandler ✓
- DependencyHandler ✓
- ConfigurationContainer ✓
- Configuration
- ScriptHandler ✓
依赖管理
- 配置冲突解决和缓存策略
configurations.all {
resolutionStrategy {
// 强制指定一个版本
force 'groupId:artifactId:version'
// 当遇到版本冲突问题时让构建失败
failOnVersionConflict()
// 设置缓存动态依赖版本 0 秒超时
cacheDynamicVersionsFor 0, 'seconds'
// 配置不缓存 SNAPSHOT 版本
cacheDynamicVersionsFor 0, 'seconds'
}
}
configurations.compile.resolutionStrategy {
// 强制指定一个版本
force 'groupId:artifactId:version'
// 当遇到版本冲突问题时让构建失败
failOnVersionConflict()
// 设置缓存动态依赖版本 0 秒超时
cacheDynamicVersionsFor 0, 'seconds'
// 配置不缓存 SNAPSHOT 版本
cacheDynamicVersionsFor 0, 'seconds'
}
- 不编译指定模块
configurations {
// 设置不编译指定分组下的指定模块
all*.exclude group: 'groupId', module: 'artifactId'
}
configurations {
// 设置不编译指定分组下的模块
all*.exclude group: 'groupId'
}
- 不编译指定依赖所传递依赖的模块
dependencies {
// 设置不编译指定分组下的指定模块
compile('groupId:artifactId:version') {
exclude group: 'transtiveGroupId', module: 'transtiveArtifactId'
}
}
dependencies {
// 设置不编译指定分组下的模块
compile('groupId:artifactId:version') {
exclude group: 'transtiveGroupId'
}
}
- 排除所有传递依赖
dependencies {
// 排除所有传递依赖
compile('groupId:artifactId:version') {
transitive = false
}
}
- 查看依赖关系
gradle dependencies
- 使用依赖观察报告
gradle -q dependencyInsight --configuration compile --dependency slf4j-api
- 打印依赖的 jar 文件的存储路径
task printDependencies << {
configurations.compile.each { dependency ->
println dependency
}
}
引用本地的 aar
- 把 aar 文件放在一个或多个文件目录中,比如 meiqiasdk-release.aar 就放在 libs 目录内
- 在 app 的 build.gradle 文件添加如下内容
repositories {
flatDir {
dirs 'libs'
// 多个目录以逗号分隔,相对路径和绝对路径都可以
// dirs '../../Meiqia_SDK_For_Android/meiqia/build/outputs/aar', '../../Meiqia_SDK_For_Android/meiqiasdk/build/outputs/aar'
}
}
- 之后在其他项目中添加一句 gradle 依赖便方便的引用了该 library
compile(name:'meiqia-release', ext:'aar')
compile(name:'meiqiasdk-release', ext:'aar')
解决 Window 系统无法删除 build 目录下 jar 包问题
- ~/.gradle/init.d/init.gradle
allprojects { project ->
if (project.path != ':') {
task unlockBuildDir(type: Exec) {
String lockhunter = '\"C:\\Program Files\\LockHunter\\LockHunter.exe\"'
group 'BGA'
description '解决 Window 系统无法删除 build 目录下 jar 包问题'
commandLine 'cmd', "$lockhunter", '/delete', '/silent', project.buildDir.getAbsolutePath()
}
project.afterEvaluate {
project.tasks.clean.dependsOn(unlockBuildDir)
}
}
}