0
点赞
收藏
分享

微信扫一扫

gradle插件实现增量编译

芭芭蘑菇 2021-09-19 阅读 60
成长

什么是增量编译

写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 ")
}

}

举报

相关推荐

0 条评论