关于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
相关产品推荐
相关产品推荐

