美文网首页Android
gradle插件实现增量编译

gradle插件实现增量编译

作者: 砺雪凝霜 | 来源:发表于2021-07-12 16:14 被阅读0次

    什么是增量编译

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

    相关文章

      网友评论

        本文标题:gradle插件实现增量编译

        本文链接:https://www.haomeiwen.com/subject/hsnrpltx.html