根目录 build.gradle 引入 kotlin 插件
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
主工程 build.gradle 添加 kotlin 依赖
apply plugin: 'kotlin-android'apply plugin: 'kotlin-kapt'android {// 传递路径信息 kapt { arguments { arg('root_project_dir', rootProject.projectDir.absolutePath) } }}dependencies {kapt project(':router-processor')implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"}
注解生成 json 文件
router-processor build.gradle 添加 gson 库依赖
implementation 'com.google.code.gson:gson:2.8.6'
将解析到的路由信息封装成json,然后写入到本地文件目录
@AutoService(Processor.class)public class DestinationProcessor extends AbstractProcessor { private static final String TAG = "DestinationProcessor"; @Override public boolean process(Set<? extends TypeElement> set, RoundEnvironment roundEnvironment) { String rootDir = processingEnv.getOptions().get("root_project_dir"); final JsonArray destinationJsonArray = new JsonArray(); // 遍历所有 @Destination 注解信息 for (Element element : elements) { // 获取添加了注解类的信息 Destination annotation = typeElement.getAnnotation(Destination.class); if (annotation==null) continue; // 获取添加的注解信息 String url = annotation.url(); String description = annotation.description(); String realPath = typeElement.getQualifiedName().toString(); // 获取添加注解的类名 // 添加路由信息到jsonArray JsonObject jsonObject = new JsonObject(); jsonObject.addProperty("url",url); jsonObject.addProperty("description",description); jsonObject.addProperty("realPath",realPath); destinationJsonArray.add(jsonObject); } // 写入 JSON 到本地文件中 // 检测父目录是否存在 File rootDirFile = new File(rootDir); if (!rootDirFile.exists()){ throw new RuntimeException("root_project_dir not exist!"); } // 创建 routet_mapping 目录 File routerFileDir = new File(rootDirFile,"router_mapping"); if (!routerFileDir.exists()){ routerFileDir.mkdirs(); } File mappingFile = new File(routerFileDir,"mapping_"+System.currentTimeMillis()+".json"); // 写入json 路由信息到文件 try{ BufferedWriter out = new BufferedWriter(new FileWriter(mappingFile)); out.write(destinationJsonArray.toString()); out.flush(); out.close(); }catch (Throwable throwable){ } }
buildSrc 插件工程读取传递的路径参数,并在每次构建任务之前对构建产物进行清理
class RouterPlugin implements Plugin
每次构建的时候会自动扫描所有添加了注解的类,并自动以json格式写入到 指定目录中
class RouterPlugin implements Plugin