gradle扩展属性、任务与构建周期
来源:互联网 发布:新网域名转万网 编辑:程序博客网 时间:2024/06/06 00:18
gradle官网:https://docs.gradle.org/3.5/dsl/org.gradle.api.tasks.Delete.html
Demo地址:https://github.com/zhaopingfu/listener19
扩展属性
可以在build.gradle中和gradle.properties中定义局部变量:可以直接在build.gradle中声明groovy属性 作用范围:只能在定义的类中使用 //局部变量 def prop = 'prop-value'全局变量:通过ext设置的属性 作用范围:能在所有的子模块中使用 ext{ prop1 = '11' }或者ext.prop3 = '33'最后task show << { println prop}在Terminal里执行show任务就可以看到输出了 gradlew show
build.gradle在执行的时候会转换成project类,里面的方法和属性都是在类里面定义好的,如果想自己添加方法和属性的话,直接在build.gradle里写groovy代码就可以了
在gradle.properties中也可以直接定义全局变量,app下的build.gradle可以直接用
gradle_prop1='prop1'gradle_prop2='prop2'
工程的build.gradle
buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:2.3.3' }}allprojects { repositories { jcenter() }}task clean(type: Delete) { delete rootProject.buildDir}ext { prop1 = 'prop1-value' compileSdkVersion = 25 buildToolsVersion = "25.0.3"}
app的build.gradle:
apply plugin: 'com.android.application'android { compileSdkVersion rootProject.ext.compileSdkVersion buildToolsVersion rootProject.ext.buildToolsVersion defaultConfig { applicationId "com.pf.listener19" minSdkVersion 15 targetSdkVersion 25 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } }}dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { exclude group: 'com.android.support', module: 'support-annotations' }) compile 'com.android.support:appcompat-v7:25.3.1' compile 'com.android.support.constraint:constraint-layout:1.0.2' testCompile 'junit:junit:4.12'}//局部变量,作用范围只是在当前类def prop = 'prop-value'//全局变量,对所有子项目可见,比如项目里的build.gradle中声明ext属性,那么在app里面是可以拿到的,因为是全局的ext { prop1 = 'prop1-value'}android.ext.prop2 = 'prop2-value'ext.prop3 = '33'//每个对象都能够设置exttask show << { println prop println prop1 //rootProject是项目中的build.gradle println rootProject.ext.prop1 println android.ext.prop2 println project.ext.prop3 println prop3 println ext.prop4 //下面这两个属性是在gradle.properties里定义的 println gradle_prop1 println gradle_prop2 //show任务里的ext println ext //当前类的ext println project.ext //项目里的build.gradle里的ext println rootProject.ext}show.ext.prop4 = '44'
之后在terminal中直接执行gradlew show就可以看到这些输出了
自定义任务
Android构建过程就是在执行一个一个的任务
terminal中:
查看有哪些任务:gradlew task查看全部任务:gradlew task --all查看app模块下的任务:gradlew :app:task
创建一个task:
第一种方式
task 任务名 << {}
第二种方式
DefaultTasktask B { doLast { println 'doLast' } doLast { println 'doLast1' } doLast { println 'doLast2' } doFirst { println 'doFirst' }}B.doLast { println 'doLast3'}
这里会先执行doFirst,最后执行doLast,注意,有多个doLast都会依次执行
“<<”的意思 就是闭包里就是doLast
任务周期
比如有个任务叫做mergerDebugAssets执行任务可以:gradle mergerDebugAssets也可以gradle mDA
一、任务执行顺序
task C << { println 'C'}task D << { println 'D'}task MyTask(dependsOn: [D, C]) << { println 'mytask'}//依赖 执行C任务肯定执行D任务//C.dependsOn D//C必须在D后面执行//C.mustRunAfter D//C应该在D后面执行,并行编译下,不一定C在D后面执行//C.shouldRunAfterD//TODO C依赖D是执行C任务必须先执行D任务,C在D后面执行,不用先执行D任务,只有CD同时执行的时候C才会在D后面//释放资源,清理缓存task finalized << { println 'finalized'}C.finalizedBy finalizedD.dependsOn C
总结一下:
- dependsOn:依赖
A.dependsOn B:A依赖B,就是说执行A的时候,必须要先执行B任务 - mustRunAfter和shouldRunAfter
A … B:A要在B后面执行,也就是说我单独调用A任务的时候,不会执行B任务,只有A和B都要执行的时候,才会A在B后面 finalizedBy
A.finalizedBy B:B要在A执行完之后执行,就是说执行A之后,一定会执行B,这个一般用来释放资源,清理缓存二、任务类
class IncrementTask extends DefaultTask {// @Input //入参// @Optional //指明参数是可选的,不是必须赋值 String filePath //input可以使n个文件目录或者属性// @OutputFile //出参 File file //output IncrementTask() { //指明分组名 group '自定义任务' //任务描述 description '自定义任务描述' //是否每次必须执行 outputs.upToDateWhen { true } } //注解的方式指明要执行那个方法 @TaskAction void run() { println 'incrementTask' println inputs.files.first() println inputs.files.singleFile }}//tasks是一个任务容器,包含了所有的任务第一种方式:tasks.create('increment', IncrementTask)第二种方式:task increment(type: IncrementTask) { filePath = 'path/to/somefile' file = file('path.txt') inputs.file file('text')}
增强任务
Zip是android自带的一个任务
task zip(type: Zip) { //输出名字 archiveName 'my.zip' //输出路径 destinationDir file("${buildDir}/zip") //要压缩的名字 from "${buildDir}/outputs/logs"}
放在构建任务完成之后执行
//在分析完成gradle之后执行afterEvaluate { task zip(type: Zip) { //输出名字 archiveName 'my.zip' //输出路径 destinationDir file("${buildDir}/zip") println tasks.getByName('assembleDebug') //要压缩的名字 from tasks.getByName('packageDebug').outputs.files }}
gradle执行流程
- 1、分析构建脚本,生成settings与project类
- 2、进行初始化配置
- 3、执行任务
afterEvaluate {}
在分析完gradle之后执行,也就是第一步和第二部之间执行
beforeEvaluate {}
在分析gradle之前执行,对于引入了android插件的工程无效
gradle构建过程中的监听
在build.gradle中直接使用gradle.add可以看到有好几个方法
gradle.addBuildListener()
构建过程中的监听回调gradle.addProjectEvaluationListener()
分析构建脚本的监听回调gradle.addListener()
这个可以有很多个监听- org.gradle.BuildListener}
- org.gradle.api.execution.TaskExecutionGraphListener}
- org.gradle.api.ProjectEvaluationListener}
- org.gradle.api.execution.TaskExecutionListener}
- org.gradle.api.execution.TaskActionListener}
- org.gradle.api.logging.StandardOutputListener}
- org.gradle.api.tasks.testing.TestListener}
- org.gradle.api.tasks.testing.TestOutputListener}
- org.gradle.api.artifacts.DependencyResolutionListener}
其中TaskExecutionGraphListener是任务执行图,当执行一个任务时,会打印出来所有执行了的任务
gradle执行任务图
gradle.addListener(new TaskExecutionGraphListener(){ @Override void graphPopulated(TaskExecutionGraph graph) { println graph.allTasks }})
- gradle扩展属性、任务与构建周期
- Gradle(三)构建任务
- Gradle与项目构建
- Gradle使用手册(三):构建任务
- Gradle 的编译周期
- 扩展Activiti工作流任务和属性
- 时钟周期、振荡周期、机器周期、CPU周期、状态周期、指令周期、总线周期、任务周期
- 时钟周期、振荡周期、机器周期、CPU周期、状态周期、指令周期、总线周期、任务周期
- 时钟周期、振荡周期、机器周期、CPU周期、状态周期、指令周期、总线周期、任务周期
- 时钟周期、振荡周期、机器周期、CPU周期、状态周期、指令周期、总线周期、任务周期
- Gradle构建工具的学习与使用
- Gradle与Makefile构建工具的对比
- Gradle与Makefile构建工具的对比
- Gradle之多项目与混合构建
- gradle 构建
- Gradle 构建
- 【Gradle】gradle构建加速
- ScheduledExecutorService执行周期任务
- 【技术】【总结】git配合gerrit使用的一些总结
- VS+CMake+opencv3+opencv_contrib
- 解读tensorflow之rnn
- 1013. Battle Over Cities (25)
- java 的 && 和 & 、|| 和 | 区别
- gradle扩展属性、任务与构建周期
- DLL入门:C#调用C++ DLL例子
- MyBatis 动态SQL
- centos7环境下编译bitcoin
- find your present (2)
- MapReduce实战练习四:找出共同好友
- 电磁兼容设计中,有关旁路电容和耦合电容学习 从电路来说,总是存在驱动的源和被驱动的负载。如果负载电容比较大,驱动电路要把电容充电、放电,才能完成信号的跳变,在上升沿比较陡峭的时候,电流比较大,这样驱动
- win10多屏显示时分别设置壁纸
- centos7 安装rocketmq