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

立山  金牌会员 | 2024-6-19 23:40:08 | 来自手机 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 579|帖子 579|积分 1737

关于作者:CSDN内容合资人、技术专家, 从零开始做日活千万级APP。
专注于分享各范畴原创系列文章 ,擅长java后端、移动开发、贸易变现、人工智能等,盼望各人多多支持。
  
  

一、导读

我们继续总结学习,温故知新。
二、概览

本文报告如何查看 android 依赖库关系。
三、查看依赖关系

3.1 方式一

Tasks->help->dependencies
可以看项目中的依赖库以及依赖库的导入关系

3.2 方式二

Tasks->android->androidDependencies
可以看项目中的依赖库以及依赖库的导入关系

以上两种方式会输出如下日志:
  1. _internal-unified-test-platform-android-device-provider-gradle - A configuration to resolve the Unified Test Platform dependencies.
  2. \--- com.android.tools.utp:android-device-provider-gradle:30.2.0
  3.      +--- com.android.tools:common:30.2.0
  4.      |    +--- com.android.tools:annotations:30.2.0
  5.      |    +--- com.google.guava:guava:30.1-jre
  6.      |    |    +--- com.google.guava:failureaccess:1.0.1
  7.      |    |    +--- com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava
  8.      |    |    +--- com.google.code.findbugs:jsr305:3.0.2
  9.      |    |    +--- org.checkerframework:checker-qual:3.5.0
  10.      |    |    +--- com.google.errorprone:error_prone_annotations:2.3.4
  11.      |    |    \--- com.google.j2objc:j2objc-annotations:1.3
  12.      |    +--- net.java.dev.jna:jna-platform:5.6.0
  13.      |    |    \--- net.java.dev.jna:jna:5.6.0
  14.      |    \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.5.31
  15.      |         +--- org.jetbrains.kotlin:kotlin-stdlib:1.5.31
  16.      |         |    +--- org.jetbrains:annotations:13.0
  17.      |         |    \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.5.31
  18.      |         \--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.5.31
  19.      |              \--- org.jetbrains.kotlin:kotlin-stdlib:1.5.31 (*)
  20.      +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.5.31 (*)
  21.      +--- com.google.protobuf:protobuf-java:3.10.0
  22.      +--- com.android.tools.utp:android-device-provider-gradle-proto:30.2.0
  23.      |    \--- com.google.protobuf:protobuf-java:3.10.0
  24.      \--- com.google.testing.platform:android-device-provider-local:0.0.8-alpha07
复制代码
3.3 方式三

./gradlew :app:dependencies >log.txt
通过命令行,将输入保存到日志,更方便查看。
四、移除重复依赖

项目中使用了许多第三方库,很轻易引入同名不同版本的库,针对于这种环境,我们需要使用exclude语句在gradle文件里移除指定的依赖库。
  1.     implementation("com.kuaishou.koom:koom-java-leak:2.1.0") {
  2.         exclude group: "com.google.android.material"
  3.     }
  4.    
  5.    
  6.     compileOnly ("com.xx:yy:$er_version") {
  7.         exclude group:"com.xx", module: "common-x"
  8.     }
复制代码
当我们移除之后,就要查抄代码是否生效,
可在android studio的project项目查看方式下,找到External Libraries目录。在这个目录下查看多余的依赖库是否已经被移除。
如下图:

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

当然上面的写法大概会比力贫苦,因为每个相关的三方库都要写一下,以是我们可以逼迫指定整个项目依赖固定版本的第三方库,避免重复依赖不同版本雷同库。
方法如下:项目build文件下

  1. configurations.all {
  2.     resolutionStrategy {
  3.         force "com.kuaishou.koom:koom-java-leak:2.2.2"
  4.     }
  5. }
复制代码
别的,直接通过混淆可以使不使用的文件不打包进去。
通过 ModuleDependency#transitive 依赖通报设置

在 dependencies 中设置依赖时 , implementation 依赖设置 后 , 可以 在闭包中 使用 transitive 函数 设置依赖是否通报 ,
假如为 transitive 函数设置 true 参数 , 则 包含通报依赖 ;
假如为 transitive 函数设置 false 参数 , 则 排除通报依赖 ;
  1. dependencies {
  2.     implementation ('com.kuaishou.koom:koom-java-leak:2.2.2') {
  3.         transitive true // 包括传递依赖, 如果设置为 false 则排除传递依赖
  4.     }
  5. }
复制代码
五、查找Gradle依赖中不再使用的组件(无用的库)

随着android工程的不断迭代,gradle设置变得越发臃肿,dependencies中大概存在许多已经不使用的公共库,严肃时大概拖慢编译速度。
给各人推荐一个工具,可以帮助我们发现这些不再使用的组件
工具库 github
使用方式 1

root build.gradle
  1. plugins {
  2.   id 'com.autonomousapps.dependency-analysis' version "${latest_version}"
  3. }
复制代码
settings.gradle
  1. pluginManagement {
  2.   repositories {
  3.     mavenCentral()
  4.    
  5.     maven { url "https://oss.sonatype.org/content/repositories/snapshots/" }
  6.    
  7.     gradlePluginPortal()
  8.   }
  9. }
复制代码
使用方式 2

root build.gradle
  1. buildscript {
  2.   repositories {
  3.     mavenCentral()
  4.    
  5.     maven { url "https://oss.sonatype.org/content/repositories/snapshots/" }
  6.   }
  7.   
  8.   dependencies {
  9.     classpath "com.autonomousapps:dependency-analysis-gradle-plugin:${latest_version}"
  10.   }
  11. }
  12. apply plugin: "com.autonomousapps.dependency-analysis"
复制代码
添加完依赖后,进行同步,会出现如下所示的任务:

使用

实行buildHealth 大概其他子task,帮助我们从不同维度生成对gradle设置的查抄效果,包罗但不限于:


  • 发现所有依赖的组件,包罗直接依赖和通报依赖
  • 发现以是不使用的直接依赖组件
  • 发现所有的二进制依赖(ABI)
  • gradle的优化建议,例如依赖方式的修改建议等
假设我们点击了 buildHealth任务,在命令行中会有用果输出
  1. > Task :buildHealth
  2. There were dependency violations. See report at E:\jnitest1\build\reports\dependency-analysis\build-health-report.txt
  3. 内容如下:
  4. Advice for :app
  5. Unused dependencies which should be removed:
  6.   androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
  7.   implementation 'com.google.code.gson:gson:2.8.9'
  8. These transitive dependencies should be declared directly:
  9.   androidTestImplementation 'androidx.test:monitor:1.4.0'
  10. Existing dependencies which should be modified to be as indicated:
  11.   androidTestImplementation 'junit:junit:4.12' (was testImplementation)
复制代码
同时在每个module的build目录下,也会有reports目录
jnitest1\app\build\reports
如下图:

原理:
想要查找没有依赖的组件,自然要从代码上进行静态扫描。
插件工具借助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学习专栏

未经允许不得转载

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

立山

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表