Gradle开发,APT采集页面路由信息(二),页面信息映射关系文档生成

文章目录

  • Gradle开发,页面信息映射关系文档生成
  • 一. 功能
    • 1.1 传递路径
    • 1.2 JSON文件
    • 1.3 生成文档
      • 1.3.1 插件自动传递路径参数(gradle插件优化)
      • 1.3.2 自动清除旧的构建产物(gradle插件优化)
      • 1.3.3 通过javac编译之后,生成文档

Gradle开发,页面信息映射关系文档生成

一. 功能

为什么需要这个功能,如何设计这个功能。

记录页面对应的URL。

1.1 传递路径

跟注解处理器差不多一样的功能去传递参数,

使用kapt依赖

Gradle开发,APT采集页面路由信息(二),页面信息映射关系文档生成_第1张图片

在app模块中 声明kapt插件

Gradle开发,APT采集页面路由信息(二),页面信息映射关系文档生成_第2张图片

注解处理器改为kapt

Gradle开发,APT采集页面路由信息(二),页面信息映射关系文档生成_第3张图片

验证是否可以收集kotlin类和java类上面标记的注解信息

kotlin

Gradle开发,APT采集页面路由信息(二),页面信息映射关系文档生成_第4张图片

java

Gradle开发,APT采集页面路由信息(二),页面信息映射关系文档生成_第5张图片

构建一下项目,成功收集到注解的信息了

Gradle开发,APT采集页面路由信息(二),页面信息映射关系文档生成_第6张图片

传递路径参数

app模块下加上这个

Gradle开发,APT采集页面路由信息(二),页面信息映射关系文档生成_第7张图片

在注解处理器中,说明注解处理器kapt拿到了app下传递过来的对应的信息。

Gradle开发,APT采集页面路由信息(二),页面信息映射关系文档生成_第8张图片

1.2 JSON文件

改造注解处理器,让处理器可以从上面传递过来的路径中生成一个本地的json文件。

引入gson库

Gradle开发,APT采集页面路由信息(二),页面信息映射关系文档生成_第9张图片

new 一个这个

Gradle开发,APT采集页面路由信息(二),页面信息映射关系文档生成_第10张图片

把数据保存到jsonobject中,for循环走完后,我们就拿到了注解所以的映射信息的一个数组

Gradle开发,APT采集页面路由信息(二),页面信息映射关系文档生成_第11张图片

把数组写入一个文件中保存

Gradle开发,APT采集页面路由信息(二),页面信息映射关系文档生成_第12张图片

构建一下项目,生成这个就说明成功了。

Gradle开发,APT采集页面路由信息(二),页面信息映射关系文档生成_第13张图片

1.3 生成文档

1.3.1 插件自动传递路径参数(gradle插件优化)

让我们的插件自动实现传递路径参数,这样我们的开发者就不需要手动再去传递了。删掉下面这段kapt代码

Gradle开发,APT采集页面路由信息(二),页面信息映射关系文档生成_第14张图片

自定义插件放在kapt下面,否则我们的自定义插件可能无法设置kapt的参数

Gradle开发,APT采集页面路由信息(二),页面信息映射关系文档生成_第15张图片

在我们的插件中写入这段代码,自动传递路径参数

Gradle开发,APT采集页面路由信息(二),页面信息映射关系文档生成_第16张图片

构建项目,生成这个说明成功了。

Gradle开发,APT采集页面路由信息(二),页面信息映射关系文档生成_第17张图片

1.3.2 自动清除旧的构建产物(gradle插件优化)

这是我们上一次构建项目生成的保存页面信息的一个目录,我们的目标是每次都自动清除一遍

Gradle开发,APT采集页面路由信息(二),页面信息映射关系文档生成_第18张图片

用户执行clean命令的时候清除

Gradle开发,APT采集页面路由信息(二),页面信息映射关系文档生成_第19张图片

在项目的根目录下执行clean命令,这样就成功了

Gradle开发,APT采集页面路由信息(二),页面信息映射关系文档生成_第20张图片

1.3.3 通过javac编译之后,生成文档

//打印本次构建执行的所有任务的名称
gradle.taskGraph.beforeTask {
    task-> println "qfhqfh task:${task.name}"
}

我们要找到javac的task任务,构建一下项目

Gradle开发,APT采集页面路由信息(二),页面信息映射关系文档生成_第21张图片

生成本地文档方便其他开发者集成。

package com.qfhqfh.plugin;

import org.gradle.api.Plugin
import org.gradle.api.Project
import groovy.json.JsonSlurper

class DependenciesPluginQfh implements Plugin<Project> {
    //实现apply方法,注入插件的逻辑
    //自动帮助用户传递路径参数到注解处理器中
    //实现旧的构建产物的自动清理
    //在javac任务后,汇总生成文档
    @Override
    void apply(Project project) {
        if (project.extensions.findByName("kapt") != null) {
            project.extensions.findByName("kapt").
                    arguments {
                        arg("root_project_dir", project.rootProject.projectDir.absolutePath)
                    }
        }
//      //删除 上一次构建生成的 router_mapping
        project.clean.doFirst {
            File mappingFile = new File(project.rootProject.projectDir, "router_mapping")
            if (mappingFile.exists()) {
                println ">>>>>>>>>>>>>>>>  mappingFile.exists()"
                mappingFile.deleteDir()
            }
        }
        project.getExtensions().create("router", RouterExtension)

        project.afterEvaluate {
            RouterExtension extension = project["router"]
            println "qfh WIKI path:  ${extension.wikiDir}"
            //javac任务compileDebugJavaWithJavac执行后,
            project.tasks.findAll {
                task ->
                    task.name.startsWith('compile') &&
                            task.name.endsWith('JavaWithJavac')
            }.each {
                task ->
                    task.doLast {
                        File mappingFile = new File(project.rootProject.projectDir, "router_mapping")
                        if (!mappingFile.exists()) {
                            return
                        }
                        File[] allChildFiles = mappingFile.listFiles()
                        if (allChildFiles.length < 1) {
                            return
                        }
                        StringBuilder stringBuilder = new StringBuilder()
                        stringBuilder.append("# 文档\n\n")
                        allChildFiles.each {
                            child ->
                                if (child.name.endsWith(".json")) {
                                    JsonSlurper slurper = new JsonSlurper()
                                    def content = slurper.parse(child)
                                    content.each {
                                        innerContent ->
                                            def url = innerContent['url']
                                            def description = innerContent['description']
                                            def realPath = innerContent['realPath']
                                            stringBuilder.append("## $description \n")
                                            stringBuilder.append("--- url $url \n")
                                            stringBuilder.append("--- realPath $realPath \n\n")

                                    }
                                }
                        }
                        File fileDir = new File(extension.wikiDir)
                        if (!fileDir.exists()) {
                            fileDir.mkdir()
                        }
                        File file = new File(fileDir, "页面文档.md")
                        if (file.exists()) {
                            file.delete()
                        }
                        file.write(stringBuilder.toString())
                    }
            }
        }
        println ">>>>>>>>>>>>>>>>  " + this.getClass().getName()
    }
}

最终我们生成了一个md文档

Gradle开发,APT采集页面路由信息(二),页面信息映射关系文档生成_第22张图片

你可能感兴趣的:(Android进阶训练营,android)