KNOI Gradle Plugin 模块分析

140 阅读2分钟

KNOI Gradle Plugin 模块分析

1. 模块概述

knoi-gradle-plugin 是一个为 Android 和 Kotlin Multiplatform 项目提供 KNOI 支持的 Gradle 插件,核心功能包括:

  • 依赖注入:动态注入 KNOI 注解、处理器和核心库的依赖。
  • 配置生成:生成 KSP 参数文件供 KSP 处理器使用。
  • 任务注册:注册自定义任务(如 BinariesPublishForbiddenTask)。

2. 依赖注入详解

概念

依赖注入(DI)是一种解耦代码的设计模式,通过外部提供依赖(而非内部创建),提升灵活性和可测试性。

实现方式

  • 构造函数注入:通过构造函数传递依赖(如 Car(engine: Engine))。
  • 属性注入:通过属性赋值(如 car.engine = Engine())。
  • 方法注入:通过方法参数传递(如 car.setEngine(engine))。

在模块中的应用

  • 动态依赖选择:根据 debug 模式决定从本地模块或远程仓库加载依赖。
    fun getKNOIAnnotationDependencies(extension: KnoiExtension, project: Project): Any {
        return if (extension.debug) {
            project.project(":knoi-annotation") // 本地模块
        } else {
            "com.tencent.kuiklybase:knoi-annotation:${getKNOIVersion(extension)}" // 远程仓库
        }
    }
    
  • 解耦依赖管理:通过 KnoiExtension 配置依赖版本和来源。

3. 依赖注入分支流程图

graph TD
    A[KnoiPlugin.apply] --> B[创建KnoiExtension]
    B --> C{检测项目类型}
    C -->|Android项目| D[调用injectAndroidConfig]
    C -->|Kotlin Multiplatform项目| E[调用injectKNOIConfig]
    
    D --> F[添加Android KSP依赖]
    F --> G[注入Android配置]
    
    E --> H[检查KSP插件]
    H -->|KSP未应用| I[抛出错误]
    H -->|KSP已应用| J[配置KSP依赖]
    J --> K[添加KNOI注解和处理器依赖]
    K --> L[生成KSP参数文件]
    L --> M[写入配置文件]
    
    E --> N[注册BinariesPublishForbiddenTask]
    N --> O[绑定到generateMetadataTask]

特点总结

  • 动态性:依赖来源和任务注册由外部配置控制。
  • 安全性:强制检查 KSP 插件,避免运行时错误。
  • 可测试性:通过 DI 轻松替换模拟依赖。

核心文件

  1. KnoiPlugin.kt:插件入口,注册扩展和任务。
  2. KnoiExtension.kt:定义 Gradle 扩展配置。
  3. InjectKnoiDependencies.kt:处理通用项目的依赖注入。
  4. InjectAndroidKnoiDependencies.kt:处理 Android 项目的依赖注入。
  5. BinariesPublishForbiddenTask.kt:定义禁止发布二进制文件的任务。

主要流程

graph TD
    A[KnoiPlugin.apply] --> B[创建KnoiExtension]
    B --> C[检测Android项目]
    C --> D[注入Android配置]
    B --> E[检测Kotlin Multiplatform项目]
    E --> F[注入KNOI配置]
    F --> G[生成KSP参数]
    F --> H[注册任务]
    G --> I[写入配置文件]
    H --> J[注册BinariesPublishForbiddenTask]
    D --> K[添加Android KSP依赖]
    K --> L[注入Android配置]

关键逻辑

1. 插件入口 (KnoiPlugin.kt)

  • apply 方法
    • 创建 KnoiExtension 扩展配置。
    • 检测 Android 项目并调用 injectAndroidConfig
    • 检测 Kotlin Multiplatform 项目并调用 injectKNOIConfig
    • 在项目评估完成后,生成 KSP 参数并注册任务。

2. 依赖注入 (InjectKnoiDependencies.kt)

  • KSP 插件检查:确保项目已应用 KSP 插件。
  • 依赖注入
    • 为支持的平台(Android JVM 和 Native)配置 KSP 依赖。
    • 添加 KNOI 注解和处理器依赖。
  • KSP 参数配置:通过配置文件传递参数给 KSP 处理器。
  • 版本管理:从 version.txt 读取版本号,支持调试模式和发布模式。

3. 任务注册 (KnoiPlugin.kt)

  • BinariesPublishForbiddenTask
    • 如果是二进制模块,注册该任务以防止二进制文件发布。
    • 任务依赖于 generateMetadataFileForOhosArm64Publication

4. Android 支持 (InjectAndroidKnoiDependencies.kt)

  • KSP 依赖注入:为 Android 项目添加 KSP 依赖。
  • 配置注入:在项目评估完成后注入 Android 配置。

总结

knoi-gradle-plugin 模块通过 Gradle 插件机制,为 Android 和 Kotlin Multiplatform 项目提供了 KNOI 的集成支持。其核心功能包括依赖注入、配置生成和任务注册,确保了 KNOI 的灵活性和可扩展性。