dependency analysis gradle plugin

JAVA源码 2025-08-23

检测未使用和滥用的依赖

dependency analysis gradle plugin (DAGP,Née依赖分析Android Gradle插件)检测到以下内容:

  1. 未使用的依赖性。

  2. 使用的及依赖性(您可能需要直接声明)。

  3. 在错误的配置上声明的依赖项( api vs implementationcompileOnly等)。

作为副作用,该插件还可以告诉您项目的ABI,并生成代表依赖关系图的各种视图的GraphViz文件。这些副作用目前主要是无证件的内部行为,但对于某些高级用户来说可能很有趣。

建立健康

除了与依赖关系相关的建议(见上文)外,DAGP还提供了其他建议,以帮助维护您的“建立健康”。这包括检测:

  1. 不必要的插件(目前仅kapt )。

  2. 不必要地使用Android插件的子标记(“模块”),而不是“正常”的JVM库。

兼容性

请参阅Wiki,以获取有关Gradle,Android Gradle插件等版本的信息,该插件与此插件兼容。

添加到您的项目并使用

有关详细说明,请参阅Wiki。

最简单的方法是添加以下内容:

settings.gradle.kts
plugins {
  id( " com.autonomousapps.build-health " ) version " <> "
}
重要的
如果您的项目使用Kotlin或Android(或两者都),则这些插件也必须加载在“设置脚本classloader”(或父级)中。有关更多信息,请参见Wiki

快速启动,只需运行以下内容:

 ./gradlew buildHealth

您可能会看到以下输出:

 >任务:BuildHealth失败

失败:构建失败,例外。

*出了什么问题:
执行失败了任务':buildHealth'。
>存在违规行为。请参阅文件:////path/to/project/build/reports/depperency-analisy/build-health-report.txt

如果您希望将此(可能很长的)报告打印到控制台上,请将其添加到您的gradle.properties文件:

gradle.properties
 dependency.analysis.print.build.health=true 

存储库

该插件从2.19.0的发行版和2.18.1-snapshot,此插件使用https://central.s*o*n*atype.com。要将此插件添加到您的项目中,请使用以下存储库。

settings.gradle.kts
pluginManagement {
  repositories {
    // releases
    mavenCentral()
    // snapshots
    maven(url = " https://central.*s*onat*ype.com/repository/maven-snapshots/ " )
    // Once you start using pluginManagement, you should explicitly add this,
    // unless you NEVER want to use this repository
    gradlePluginPortal()
  }
}

更高级的用法

您不必通过设置脚本将此插件应用于所有项目。它也只能应用于特定的子标题。在这种情况下,还必须将其应用于root Build脚本。

root build.gradle.kts
plugins {
  id( " com.autonomousapps.dependency-analysis " ) version " <> "
}
sub/project/build.gradle.kts
plugins {
  id( " com.autonomousapps.dependency-analysis " )
}
重要的
如果您的项目使用Kotlin或Android(或两者),则这些插件也必须加载在Root Build Script Loader(或父级)中。有关更多信息,请参见Wiki

项目健康

可以按照projectHealth任务对单个模块进行分析。例如:

 ./gradlew App:ProjectHealth

自动解决依赖性问题

插件通常会报告项目依赖性声明的许多问题。由于手动修复可能很乏味,因此该插件还提供了一项任务以使所有问题自动化。

 ./gradlew fixDependencies

fixDependencies任务已在应用插件的每个项目上注册。按照上述运行它将在每个子项目中运行任务。另请参阅一键依赖项修复

仅修复一些依赖性问题

在某些情况下,一个通过以一通解决所有问题可能是不可行的。也许您有一个非常大的项目,或者您发布了库,并且您知道更改依赖性声明也会改变库的元数据,这可能会破坏消费者。为了支持此用例, fixDependencies任务采用可选标志来告诉它,从本质上讲,仅进行“安全”更改。

 ./gradlew fixDependencies-升级

有了此标志, fixDependencies任务将不会删除或“降级”任何依赖性声明。它将仅添加或“升级”声明(例如,从implementationapi )。

在增量的推出方案中,可以想象使用--upgrade标志,然后更新所有消费者,然后最终删除标志并删除所有未使用的依赖项。

警告

如果分析有任何错误,那么修复依赖性声明会使您的构建破坏(但手动修复也是如此)。如果您遇到此问题,请提出问题。

此外,重写功能基于简化的Gradle Groovy DSL语法,该语法将在复杂的Groovy构建脚本的存在下失败。 Kotlin DSL语法对整个Kotlin语言都有全面的支持,这使得重写功能对Gradle Kotlin DSL脚本的工作更大。 Gradle Groovy DSL没有计划做同样的计划。

原因

您可能会很好奇插件为什么会发出(或不发出)有关某些依赖性的建议。你可以问为什么:

 ./gradlew lib:原因-ID com.squareup.okio:okio:2.2.2 (1)
>任务:lib:原因

-----------------------------------------------------------
您询问了依赖项'com.squareup.okio:okio:2.2.2'。
关于这种依赖性没有任何建议。
-----------------------------------------------------------

最短的路径从:lib到com.squareup.okio:okio:2.2.2:
:lib
 --- com.squareup.okio:okio:2.2.2

来源:主
-----------------
*公开okio.bufferedsource类(暗示API)。
  1. 版本字符串是可选的。

基本配置

有关如何配置插件的详细信息,请参见Wiki。

要配置插件,请使用dependencyAnalysis扩展。

build.gradle.kts
dependencyAnalysis {
  // Declare that the plugin should use typesafe project accessors. False by default.
  useTypesafeProjectAccessors( true )

  // Configure ABI exclusion rules.
  abi { .. . }

  // Configure the severity of issues, and exclusion rules, for potentially the entire project.
  issues { .. . }

  // Configure issue reports.
  reporting {
    // false by default. Setting to true results in
    // the advice report being emitted to console.
    printBuildHealth( true )
  }

  // Configure dependency structure rules (bundles, mapping, etc).
  structure { .. . }

  // Configure usage rules.
  usage { .. . }
}

编程用法和API保证

从版本3.0.0(未发行)中,该插件在api/api.txt中包含API定义。从那时起,任何向后兼容的更改都将导致主要版本发布。请注意,某些代码仅由于工具限制而公开;此代码大部分都在internal软件包中,但是com.autonomousapps.tasks也被认为是“内部”。这些内部软件包中任何API的使用自身都有您的风险。

对于仅应用插件并运行主要任务( buildHealthprojectHealthreason等)的典型用户,应将主要版本视为非事件。对于这些用户,“ API”只是这些主要任务。

出版物

以下是已发表讨论此插件的文章 /博客文章的列表:

  1. 适当的护理和喂养您的gradle构建

  2. dependency analysis gradle plugin :使用字节码分析查找未使用的依赖项

  3. dependency analysis gradle plugin :什么是ABI?

  4. 减少我的Gradle插件对配置时间的影响:旅程

  5. 单击依赖项修复

这些插件也已在这些新闻通讯中出现:

  1. 格拉尔,2024年10月

  2. 格拉尔,2022年5月

  3. 格拉尔,2020年9月

  4. 格拉尔,2020年8月

  5. Android每周,第423期

  6. 格拉尔,2020年7月

  7. 格拉尔,2020年6月

有关此插件的播客剧集可以在此处找到:

  1. 开发人员的面包店,第31集

有关此插件的YouTube视频:

  1. 了解Gradle#28 - 带有依赖性分析插件的清洁编译类路径

下载源码

通过命令行克隆项目:

git clone https://github.com/autonomousapps/dependency-analysis-gradle-plugin.git