ITmob-Ly
发布于 2022-12-16 / 393 阅读
0

Gradle 依赖分析-检测未使用的依赖项,检查和移除不再使用的依赖声明

Gradle

最近要将 Android 项目中不再使用的依赖移除。比如: kotlin-stdlib-jdk8 自从Kotlin 1.4+之后就不再需要手动添加了,Kotlin Gradle 插件会选择适当的JVM标准库自动添加。

但是目前 Android studio 和 Gradle 并没有这样的功能,怎样检测不再使用的依赖项和移除不再需要的依赖呢?

1. 使用 AGP task 检查

IssueTracker 中有相关的 Feature Request: find unused dependency declarations

Issue Tracker find unused dependency

官方的回复提到可以使用实验性的 AGP 任务 ./gradlew analyze<variant>Dependencies 生成未使用的依赖项的报告

Issue Tracker find unused dependency

Since it isn't mentioned here, there is an experimental AGP task that can be invoked by running ./gradlew analyze<variant>Dependencies that creates a JSON report of unused dependencies in build/intermediates/analyze_dependencies_report. While it cannot be guaranteed that the tool will be fully reliable, it may be helpful for identifying possible unused dependencies.

比如分析测试项目的 product 版本的依赖:

./gradlew analyzeProdSignedReleaseDependencies

分析结果会生成一个报告,文件目录是: app/build/intermediates/analyze_dependencies_report

// dependenciesReport.json
{
  "add": [
    "androidx.work:work-runtime:2.7.1"
    ],
  "remove": [
    "androidx.core:core-ktx:1.8.0",
    "androidx.databinding:databinding-ktx:7.2.2",
    "androidx.legacy:legacy-support-v4:1.0.0",
    "androidx.room:room-ktx:2.4.3",
    "androidx.work:work-runtime-ktx:2.7.1",
    "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.10"
  ]
}

当前该AGP task还是实验性的,正如官方回复中提到的:While it cannot be guaranteed that the tool will be fully reliable, it may be helpful for identifying possible unused dependencies.

2. 使用开源的 Gradle 插件

在 IssueTracker 中也有人推荐 dependency-analysis-android-gradle-plugin 插件,测试确实可用。

插件的 Github 地址:https://github.com/autonomousapps/dependency-analysis-android-gradle-plugin

在根目录的 build.gradle 添加插件

plugins {
  id 'com.autonomousapps.dependency-analysis' version "<<latest_version>>"
}

快速开始,只需运行以下命令:

./gradlew buildHealth

也可以使用 projectHealth 任务对各个模块进行分析:

./gradlew app:projectHealth

这两种方式生成的报告都要结合自己项目的实际情况,检查报告中的依赖项是否确实可以移除

3. 其他


也有一些文章介绍 Netflix 的 gradle-lint-plugin 插件。但是经过踩坑它并不适用于Android项目。

想详细了解参见:https://github.com/nebula-plugins/gradle-lint-plugin/issues/36

gradle-lint-plugin