如何查看Android 包依赖关系&gradle依赖管理

04-13 1572阅读

关于作者:CSDN内容合伙人、技术专家, 从零开始做日活千万级APP。

专注于分享各领域原创系列文章 ,擅长java后端、移动开发、商业变现、人工智能等,希望大家多多支持。

目录

  • 一、导读
  • 二、概览
  • 三、查看依赖关系
    • 3.1 方式一
    • 3.2 方式二
    • 3.3 方式三
    • 四、移除重复依赖
      • 强制指定整个项目依赖固定版本的第三方库
      • 通过 ModuleDependency#transitive 依赖传递设置
      • 五、查找Gradle依赖中不再使用的组件(无用的库)
        • 使用方式 1
        • 使用方式 2
        • 使用
        • 六、 推荐阅读

          如何查看Android 包依赖关系&gradle依赖管理

          一、导读

          我们继续总结学习,温故知新。

          二、概览

          本文讲述如何查看 android 依赖库关系。

          三、查看依赖关系

          3.1 方式一

          Tasks->help->dependencies

          可以看项目中的依赖库以及依赖库的导入关系

          如何查看Android 包依赖关系&gradle依赖管理

          3.2 方式二

          Tasks->android->androidDependencies

          可以看项目中的依赖库以及依赖库的导入关系

          如何查看Android 包依赖关系&gradle依赖管理

          以上两种方式会输出如下日志:

          _internal-unified-test-platform-android-device-provider-gradle - A configuration to resolve the Unified Test Platform dependencies.
          \--- com.android.tools.utp:android-device-provider-gradle:30.2.0
               +--- com.android.tools:common:30.2.0
               |    +--- com.android.tools:annotations:30.2.0
               |    +--- com.google.guava:guava:30.1-jre
               |    |    +--- com.google.guava:failureaccess:1.0.1
               |    |    +--- com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava
               |    |    +--- com.google.code.findbugs:jsr305:3.0.2
               |    |    +--- org.checkerframework:checker-qual:3.5.0
               |    |    +--- com.google.errorprone:error_prone_annotations:2.3.4
               |    |    \--- com.google.j2objc:j2objc-annotations:1.3
               |    +--- net.java.dev.jna:jna-platform:5.6.0
               |    |    \--- net.java.dev.jna:jna:5.6.0
               |    \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.5.31
               |         +--- org.jetbrains.kotlin:kotlin-stdlib:1.5.31
               |         |    +--- org.jetbrains:annotations:13.0
               |         |    \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.5.31
               |         \--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.5.31
               |              \--- org.jetbrains.kotlin:kotlin-stdlib:1.5.31 (*)
               +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.5.31 (*)
               +--- com.google.protobuf:protobuf-java:3.10.0
               +--- com.android.tools.utp:android-device-provider-gradle-proto:30.2.0
               |    \--- com.google.protobuf:protobuf-java:3.10.0
               \--- com.google.testing.platform:android-device-provider-local:0.0.8-alpha07
          

          3.3 方式三

          ./gradlew :app:dependencies >log.txt

          通过命令行,将输入保存到日志,更方便查看。

          四、移除重复依赖

          项目中使用了很多第三方库,很容易引入同名不同版本的库,针对于这种情况,我们需要使用exclude语句在gradle文件里移除指定的依赖库。

              implementation("com.kuaishou.koom:koom-java-leak:2.1.0") {
                  exclude group: "com.google.android.material"
              }
              
              
              compileOnly ("com.xx:yy:$er_version") {
                  exclude group:"com.xx", module: "common-x"
              }
          

          当我们移除之后,就要检查代码是否生效,

          可在android studio的project项目查看方式下,找到External Libraries目录。在这个目录下查看多余的依赖库是否已经被移除。

          如下图:

          如何查看Android 包依赖关系&gradle依赖管理

          强制指定整个项目依赖固定版本的第三方库

          当然上面的写法可能会比较麻烦,因为每个相关的三方库都要写一下,所以我们可以强制指定整个项目依赖固定版本的第三方库,避免重复依赖不同版本相同库。

          方法如下:项目build文件下

          如何查看Android 包依赖关系&gradle依赖管理

          configurations.all {
              resolutionStrategy {
                  force "com.kuaishou.koom:koom-java-leak:2.2.2"
              }
          }
          

          另外,直接通过混淆可以使不使用的文件不打包进去。

          通过 ModuleDependency#transitive 依赖传递设置

          在 dependencies 中配置依赖时 , implementation 依赖配置 后 , 可以 在闭包中 使用 transitive 函数 设置依赖是否传递 ,

          如果为 transitive 函数设置 true 参数 , 则 包含传递依赖 ;

          如果为 transitive 函数设置 false 参数 , 则 排除传递依赖 ;

          dependencies {
              implementation ('com.kuaishou.koom:koom-java-leak:2.2.2') {
                  transitive true // 包括传递依赖, 如果设置为 false 则排除传递依赖
              }
          }
          

          五、查找Gradle依赖中不再使用的组件(无用的库)

          随着android工程的不断迭代,gradle配置变得越发臃肿,dependencies中可能存在很多已经不使用的公共库,严重时可能拖慢编译速度。

          给大家推荐一个工具,可以帮助我们发现这些不再使用的组件

          工具库 github

          使用方式 1

          root build.gradle

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

          settings.gradle

          pluginManagement {
            repositories {
              mavenCentral()
              
              maven { url "https://oss.sonatype.org/content/repositories/snapshots/" }
              
              gradlePluginPortal()
            }
          }
          

          使用方式 2

          root build.gradle

          buildscript {
            repositories {
              mavenCentral()
              
              maven { url "https://oss.sonatype.org/content/repositories/snapshots/" }
            }
            
            dependencies {
              classpath "com.autonomousapps:dependency-analysis-gradle-plugin:${latest_version}"
            }
          }
          apply plugin: "com.autonomousapps.dependency-analysis"
          

          添加完依赖后,进行同步,会出现如下所示的任务:

          如何查看Android 包依赖关系&gradle依赖管理

          使用

          执行buildHealth 或者其他子task,帮助我们从不同维度生成对gradle配置的检查结果,包括但不限于:

          • 发现所有依赖的组件,包括直接依赖和传递依赖
          • 发现所以不使用的直接依赖组件
          • 发现所有的二进制依赖(ABI)
          • gradle的优化建议,例如依赖方式的修改建议等

            假设我们点击了 buildHealth任务,在命令行中会有结果输出

            > Task :buildHealth
            There were dependency violations. See report at E:\jnitest1\build\reports\dependency-analysis\build-health-report.txt 
            内容如下:
            Advice for :app
            Unused dependencies which should be removed:
              androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
              implementation 'com.google.code.gson:gson:2.8.9'
            These transitive dependencies should be declared directly:
              androidTestImplementation 'androidx.test:monitor:1.4.0'
            Existing dependencies which should be modified to be as indicated:
              androidTestImplementation 'junit:junit:4.12' (was testImplementation)
            

            同时在每个module的build目录下,也会有reports目录

            jnitest1\app\build\reports

            如下图:

            如何查看Android 包依赖关系&gradle依赖管理

            原理:

            想要查找没有依赖的组件,自然要从代码上进行静态扫描。

            插件工具借助ANTLR对编译后的字节码进行分析:收集项目中使用到的class以及组件实际提供的class,通过对比就可以找到不再使用的组件(没有class被工程使用)

            https://dev.to/autonomousapps/dependency-analysis-gradle-plugin-using-bytecode-analysis-to-find-unused-dependencies-509n

            参考如何查找Gradle依赖中不再使用的组件

            也可以使用lint来检查,

            通过依次选择 code > Analyze Code > Run Inspection By Name

            然后在对话框中输入 unused library

            六、 推荐阅读

            Java 专栏

            SQL 专栏

            数据结构与算法

            Android学习专栏

            如何查看Android 包依赖关系&gradle依赖管理

            未经允许不得转载

VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]