You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于Now in Android项目Gradle插件声明方式的两项技术疑问

关于Now in Android项目Gradle插件使用的疑问解答

1. 为何不使用官方推荐的alias(libs.plugins.xxx)语法?

这并非是“硬编码”增加变更难度,反而是多模块项目配置标准化的进阶最佳实践:

  • 官方推荐的alias语法是基础的依赖版本管理方式,适合简单项目或快速搭建场景。但在Now in Android这类大型多模块项目中,各模块的配置(如Android库插件、Hilt、测试框架等)存在大量重复。
  • 项目通过自定义预编译脚本插件,把重复的配置逻辑封装成自定义ID(如nowinandroid.android.hilt)。模块引用该ID时,会自动应用整套配置,包括官方插件引入、依赖版本统一、编译选项配置等。
  • 这种方式反而降低了变更成本:如果要修改Hilt的版本或配置,仅需在build-logic模块的自定义插件里修改一次,所有引用该ID的模块都会同步更新,无需逐个模块修改alias。

2. 自定义插件ID的实现方式

项目通过Gradle预编译脚本插件实现自定义ID,核心步骤如下:

  • 第一步:创建build-logic模块作为预编译插件的载体,内部包含plugins子模块,用于编写自定义插件逻辑。
  • 第二步:编写自定义插件类,以Hilt为例:
    class AndroidHiltPlugin : Plugin<Project> {
        override fun apply(target: Project) {
            // 应用官方Hilt插件
            target.plugins.apply("com.google.dagger.hilt.android")
            // 添加Hilt注解处理器依赖
            target.dependencies.add("kapt", "com.google.dagger:hilt-compiler:${libs.versions.hilt.get()}")
            // 配置Hilt相关编译选项
            target.extensions.configure<JavaPluginExtension> {
                sourceCompatibility = JavaVersion.VERSION_17
                targetCompatibility = JavaVersion.VERSION_17
            }
        }
    }
    
  • 第三步:在build-logic/plugins/build.gradle.kts中注册自定义插件,绑定ID与实现类:
    gradlePlugin {
        plugins {
            register("androidHilt") {
                id = "nowinandroid.android.hilt"
                implementationClass = "com.nowinandroid.plugins.AndroidHiltPlugin"
            }
        }
    }
    
  • 第四步:在项目根目录的settings.gradle.kts中引入build-logic模块,让所有业务模块能识别这些自定义插件ID:
    includeBuild("build-logic")
    
  • 最终,业务模块中引用id("nowinandroid.android.hilt")时,Gradle会自动执行预编译插件中的逻辑,替代直接引用官方插件ID。

内容的提问来源于stack exchange,提问作者Mostafa Arian Nejad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 10:25:01