什么是增量编译
写gradle 脚本的时候,如果task执行的逻辑特别耗时,变会影响整个打包速度,但有的时候我们没有必要去执行task的逻辑,例如在一个Android项目中,只有当我们的java代码变更了,我们变会对java代码进行编译生成.class文件,我们没有更改java代码,那么我们就没必要执行javac的操作,而去直接复用上次编译java代码生成的class文件,这样就可以加快我们的编译速度,增量地编译java代码的task就是一个增量编译的task。
什么样的task是增量编译task呢?首先要有输入文件、输出文件,
- 当我们输入文件没有变化,什么都不干
- 当输入文件被添加、修改、之后,执行task逻辑
怎么让一个task实现增量编译呢?
1、写一个task继承DefaultTask
2、定义输入、输出文件
定义输入文件的注解:@Input、@InputDirectory、@InputFile、@InputFiles
定义输出文件的注解:@OutputDirectories、 @OutputDirectory、@OutputFile、@OutputFiles
例如:
@InputFiles
List<File> inputFiles
@OutputFile
File outputDir
3、用@TaskAction修饰Task执行的逻辑
一个File的添加、删除、修改的变化可以通过InputFileDetails类进行判断,如果有多个inputFile,那么可以通过遍历IncrementalTaskInputs拿到InputFileDetails来判断。
下面是一个拿到路由文件,然后生辰一个路由文档的例子,挨个遍历所有路由文件,当发现有路由文件添加和修改之后,变会重新生成一个路由文档。
/**
* Task action that will check if a source file is out of date
* or removed. If out of date the source file is converted
* to HTML. If source file is removed the generated
* HTML file is removed.
*
* @param inputs Used for incremental task action.
*/
@TaskAction
void generateRouterDoc(IncrementalTaskInputs inputs){
if (!inputs.incremental) {
println("incremental is execute")
}
boolean isNeedGenerate = false
// Input file has changed
inputs.outOfDate { InputFileDetails outOfDate ->
if(outOfDate.added || outOfDate.modified){
//如果输入文件有改变,那么我们才生成文档,其它不做任何处理
println(">>>输入文件发生了改变,需要生成路由文档")
isNeedGenerate = true
}
println("${outOfDate.file.absolutePath} is outOfDate")
}
if (!outputDir.exists()) {
isNeedGenerate = true
}
if(isNeedGenerate){
generateRouterDocument(inputFiles)
}
// Input file is removed, so we remove the
// output file that was created for the input file.
inputs.removed { InputFileDetails removed ->
println("${removed.file.name} is removed ")
}
}
网友评论