DSL(Domain-Specific Language)
Gradle 是一个编译打包工具,但实际上它也是一个编程框架。
Task 是 Gradle 中的一种数据类型,它代表了一些要执行或者要干的工作。不同的插件可以添加不同的 Task。每一个 Task 都需要和一个 Project 关联。
Task 的 API 文档位于:https://docs.gradle.org/current/dsl/org.gradle.api.Task.html
- 任务创建
task hello { doLast {//doLast 可用 << 代替,不推荐此写法 println "hello"//gradle运行阶段打印出来 } } task hello { println "hello"//gradle配置阶段打印出来 }
- 任务依赖
A 依赖 B,A 又同时依赖 C。但执行的结果可能是 B -> C -> A,我们想 C 在 B 之前执行,可以使用 mustRunAfter task A << {println 'Hello from A'} task B << {println 'Hello from B'} task C << {println 'Hello from C'} A.dependsOn B //执行 A 之前会先执行 B A.dependsOn C //执行 A 之前会先执行 C B.mustRunAfter C //B 必须在 C 之后执行
task autoSign {
//依赖于其他Task执行完,在执行本Task
dependsOn ''
//先执行
doFirst{ }
// 后执行
doLast{ }
}
dependsOn出现如下异常时
A problem occurred evaluating script. > Could not get unknown property 'installApk' for project ':app' of type org.gradle.api.Project.
解决方案:
// 对project的生命周期进行监听
this.afterEvaluate {
setDependsOn([assembleDebugChannels])
}
实例操作渠道包后自动安装并启动
- 创建安装启动APP GRADLE
app中build.gradle中添加
apply from: rootProject.file('gradle/launchApp.gradle')
launchApp.gradle内容如下
// 一键安装渠道包 assembleDebugChannels --> installApk --> launchApp task installApk() { // 对project的生命周期进行监听 this.afterEvaluate { setDependsOn([assembleDebugChannels]) } doLast { walle{ // apk path def path = "${project.buildDir}/outputs/channels/xxx.apk" def command = "adb install -r ${path}" executeCommand(command) println "installApk success" } } } // 启动APP task launchApp(dependsOn: installApk) { doLast { //指定要启动的Activity啦 def command = "adb shell am start com.example.xxx/.MainActivity" executeCommand(command) println "launchApk success" } } /** * 执行shell指令 * @param command 命令 * @return */ def executeCommand(String command) { try { exec { ExecSpec execSpec -> executable 'sh' args '-c', command } } catch (Exception e) { e.printStackTrace() } }