如何查看Android 包依赖关系

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

目录

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

在这里插入图片描述

一、导读

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

二、概览

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

三、查看依赖关系

3.1 方式一

Tasks->help->dependencies
可以看项目中的依赖库以及依赖库的导入关系
在这里插入图片描述

3.2 方式二

Tasks->android->androidDependencies
可以看项目中的依赖库以及依赖库的导入关系
在这里插入图片描述

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

_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目录。在这个目录下查看多余的依赖库是否已经被移除。
如下图:
在这里插入图片描述

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

当然上面的写法可能会比较麻烦,因为每个相关的三方库都要写一下,所以我们可以强制指定整个项目依赖固定版本的第三方库,避免重复依赖不同版本相同库。
方法如下:项目build文件下
在这里插入图片描述

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

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

五、查找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"

添加完依赖后,进行同步,会出现如下所示的任务:
在这里插入图片描述

使用

执行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
如下图:
在这里插入图片描述

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

ddd

未经允许不得转载

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/124929.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

安防监控系统视频融合平台EasyCVR页面地图功能细节详解

安防监控视频汇聚平台EasyCVR可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安防视频监控的能力&#xff…

混沌系统在图像加密中的应用(小波混沌神经网络)

混沌系统在图像加密中的应用(小波混沌神经网络) 前言一、小波混沌神经网络模型二、拓展三、python代码 前言 小波混沌神经网络是一种神经网络模型,结合了小波变换和混沌理论,用于信号处理、分类和预测。该模型基于多层前向神经网…

selenium元素定位与操作

说明:本篇博客基于selenium 4.1.0 在selenium中,想要对元素进行操作,一般需要如下步骤: 在浏览器中查看元素属性,便于selenium在页面中找到该元素在代码中创建元素对象元素操作、获取元素信息 查看元素属性 浏览器…

【快速使用ShardingJDBC的哈希分片策略进行分库分表】

文章目录 🔊博主介绍🥤本文内容🍊1.引入maven依赖🍊2.启动类上添加注解MapperScan🍊3.添加application.properties配置🍊4.普通的自定义实体类🍊5.写个测试类验证一下🍊6.控制台打印…

[架构之路-246]:目标系统 - 设计方法 - 软件工程 - 需求工程- 需求开发:获取、分析、定义、验证

目录 前言: 架构师为什么需要了解需求分析 一、需求工程概述 1.1 概述 1.2 需求工程的两大部分 (1)需求开发:系统工程师的职责、目标系统开发角度 (2)需求管理:项目管理者的职责、项目管…

uni-app多端开发

uni-app 多端开发 一、命令创建uni-app 项目二、在微信小程序后台找到 appId 填写 appId三、运行项目四、使用 uni-ui4-1、下载4-2、自动导入4-3、ts项目下载类型校验 (uni-ui 组件库)4-3-1、下载4-3-2、配置 五、持久化 pinia六、数据请求封装七、获取组…

C++day6作业

1.思维导图 2.编程题: 以下是一个简单的比喻,将多态概念与生活中的实际情况相联系: 比喻:动物园的讲解员和动物表演 想象一下你去了一家动物园,看到了许多不同种类的动物,如狮子、大象、猴子等。现在&am…

Spring笔记(四)(黑马)(web层解决方案-SpringMVC)

01、Spring MVC 简介 1.1 SpringMVC概述 SpringMVC是一个基于Spring开发的MVC轻量级框架,Spring3.0后发布的组件,SpringMVC和Spring可以无 缝整合,使用DispatcherServlet作为前端控制器,且内部提供了处理器映射器、处理器适配器…

OpenTiny Vue 组件库支持 Vue2.7 啦!

之前 OpenTiny 发布了一篇 Vue2 升级 Vue3 的文章。 🖖少年,该升级 Vue3 了! 里面提到使用了 ElementUI 的 Vue2 项目,可以通过 TinyVue 和 gogocode 快速升级到 Vue3 项目。 有朋友评论替换button出错了,并且贴出了…

Java进阶(垃圾回收GC)——理论篇:JVM内存模型 垃圾回收定位清除算法 JVM中的垃圾回收器

前言 JVM作为Java进阶的知识,是需要Java程序员不断深度和理解的。 本篇博客介绍JVM的内存模型,对比了1.7和1.8的内存模型的变化;介绍了垃圾回收的语言发展;阐述了定位垃圾的方法,引用计数法和可达性分析发以及垃圾清…

基于指数分布算法的无人机航迹规划-附代码

基于指数分布算法的无人机航迹规划 文章目录 基于指数分布算法的无人机航迹规划1.指数分布搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要:本文主要介绍利用指数分布算法来优化无人机航迹规划。 …

阿里云服务器密码在哪查看?如何设置修改初始密码?

阿里云服务器创建后没有默认初始密码,需要用户通过重置实例密码的方式来设置新的密码,阿里云服务器网aliyunfuwuqi.com分享阿里云服务器ECS重置实例密码的详细操作流程: 阿里云服务器重置密码方法 1、登录到阿里云服务器管理控制台 2、左侧…

乐园要吸引儿童还是家长?万达宝贝王2000万会员的求精之路

2023年6月,万达宝贝王正式迈入“400店时代”。 万达宝贝王在全国200多座城市,以游乐设施、主题活动、成长课程服务10亿多用户,拥有2000多万名会员,是真正的国内儿童乐园领跑者。 当流量时代变成“留量”时代,用户增长…

按键精灵中的UI界面操作

1. 按键精灵中UI界面常用的控件 1. 文字框 界面1: {标签页1:{文字框:{名称:"文字框1",显示内容:"显示内容",文字大小:0,高度:0,宽度:0,注释:"文字大小、高度、宽度是可选属性,如需使用默认值,可保持值为0或直接删除此属性&qu…

汽车制造业,通常都穿用哪些防护功能的劳保鞋呢?

近年来汽车行业发展迅速,各家各户有条件的话都会买车,汽车已经成为人们主要出行工具。随着人们生活水平的提高,汽车市场需求持续增长,现在的汽车制造厂也是越来越多,使得汽车制造业成为机械行业的重要支柱之一。 那么对…

【深度学习】可交互讲解图神经网络GNN

在正式开始前,先找准图神经网络GNN(Graph Neural Network)的位置。 图神经网络GNN是深度学习的一个分支。 深度学习的四个分支对应了四种常见的数据格式,前馈神经网络FNN处理表格数据,表格数据可以是特征向量,卷积神经网络CNN处理…

Spark大数据应用实战

系列文章目录 送书第一期 《用户画像:平台构建与业务实践》 送书活动之抽奖工具的打造 《获取博客评论用户抽取幸运中奖者》 送书第二期 《Spring Cloud Alibaba核心技术与实战案例》 送书第三期 《深入浅出Java虚拟机》 送书第四期 《AI时代项目经理成长之道》 …

昇腾CANN 7.0 黑科技:DVPP硬件加速训练数据预处理,友好解决Host CPU预处理瓶颈

在NPU/GPU上进行模型训练计算,为了充分使用计算资源,一般采用批量数据处理方式,因此一般情况下为提升整体吞吐率,batch值会设置的比较大,常见的batch数为256/512,这样一来,对数据预处理处理速度…

第十五章,输入输出流代码

package 例题;import java.io.File;public class 例题1 {public static void main(String[] args) {//创建文件对象File file new File("D:\\Java15-1.docx");//判断,如果该文件存在。exists存在的意思if (file.exists()) {//删除//file.delete();//Syst…

Modbus协议简介及模拟环境搭建

Modbus协议是一种已广泛应用于当今工业控制领域的通用通讯协议,Modbus 是MODICON公司(现为施耐德电气公司的一个品牌)最先倡导的一种软的通讯规约。 通过此协议,控制器相互之间、或控制器经由网络(如以太网)可以和其它设备之间进…