什么是增量編譯
寫gradle 腳本的時(shí)候游盲,如果task執(zhí)行的邏輯特別耗時(shí),變會影響整個(gè)打包速度,但有的時(shí)候我們沒有必要去執(zhí)行task的邏輯塔次,例如在一個(gè)Android項(xiàng)目中,只有當(dāng)我們的java代碼變更了名秀,我們變會對java代碼進(jìn)行編譯生成.class文件俺叭,我們沒有更改java代碼,那么我們就沒必要執(zhí)行javac的操作泰偿,而去直接復(fù)用上次編譯java代碼生成的class文件熄守,這樣就可以加快我們的編譯速度,增量地編譯java代碼的task就是一個(gè)增量編譯的task耗跛。
什么樣的task是增量編譯task呢裕照?首先要有輸入文件、輸出文件调塌,
- 當(dāng)我們輸入文件沒有變化晋南,什么都不干
- 當(dāng)輸入文件被添加、修改羔砾、之后负间,執(zhí)行task邏輯
怎么讓一個(gè)task實(shí)現(xiàn)增量編譯呢偶妖?
1、寫一個(gè)task繼承DefaultTask
2政溃、定義輸入趾访、輸出文件
定義輸入文件的注解:@Input、@InputDirectory董虱、@InputFile扼鞋、@InputFiles
定義輸出文件的注解:@OutputDirectories、 @OutputDirectory愤诱、@OutputFile云头、@OutputFiles
例如:
@InputFiles
List<File> inputFiles
@OutputFile
File outputDir
3、用@TaskAction修飾Task執(zhí)行的邏輯
一個(gè)File的添加淫半、刪除溃槐、修改的變化可以通過InputFileDetails類進(jìn)行判斷,如果有多個(gè)inputFile科吭,那么可以通過遍歷IncrementalTaskInputs拿到InputFileDetails來判斷昏滴。
下面是一個(gè)拿到路由文件,然后生辰一個(gè)路由文檔的例子砌溺,挨個(gè)遍歷所有路由文件影涉,當(dāng)發(fā)現(xiàn)有路由文件添加和修改之后,變會重新生成一個(gè)路由文檔规伐。
/**
* 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(">>>輸入文件發(fā)生了改變,需要生成路由文檔")
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 ")
}
}