【Android Gradle 插件】Android 依赖管理 ⑥ ( 依赖冲突处理 | transitive 依赖传递设置 | exclude 依赖排除设置 | force 强制指定依赖库 )
文章目录
- 一、查询 Android 依赖库的配置
- 二、通过 ModuleDependency#transitive 依赖传递设置
- 三、通过 ModuleDependency#exclude 设置排除子依赖库
- 四、通过 configuration 配置排除子依赖库
- 五、force 强制指定依赖库
一、查询 Android 依赖库的配置
在遇到 依赖冲突 时 , 如果要 排查某个依赖的子库 时 , 就需要对该依赖库非常熟悉 , 最好是找出该依赖库位置 , 并 分析该依赖库的 Maven 配置文件 , 即 pom.xml 配置文件 ; 下面以 com.android.support:appcompat-v7 依赖库 为例进行演示 , 这个库经常会造成依赖冲突 ;
Android 官方提供的依赖库 , 都放在 SDK 的 extras 目录 下 , 如下图所示 :
其中 Android Support 依赖库的路径位置 , 在 D:\001_Develop\001_SDK\Sdk\extras\android\m2repository\com\android\support 路径中的依赖库如下图所示 :
这里以 appcompat-v7 依赖库为例 , 查看 23.3.0 版本的 com.android.support:appcompat-v7 依赖库 , 其目录为 D:\001_Develop\001_SDK\Sdk\extras\android\m2repository\com\android\support\appcompat-v7\23.3.0 , 依赖库内容如下 :
查看其 appcompat-v7-23.3.0.pom 依赖配置文件 , 发现该 pom 文件中有配置 com.android.support:support-v4 依赖 , pom 配置文件是 Maven 的依赖配置 , 其格式是 Xml 形式的 ;
<dependency><groupId>com.android.support</groupId><artifactId>support-v4</artifactId><version>23.3.0</version><type>aar</type><scope>compile</scope></dependency>
二、通过 ModuleDependency#transitive 依赖传递设置
在 dependencies 中配置依赖时 , implementation 依赖配置 后 , 可以 在闭包中 使用 transitive 函数 设置依赖是否传递 ,
- 如果为 transitive 函数设置 true 参数 , 则 包含传递依赖 ;
- 如果为 transitive 函数设置 false 参数 , 则 排除传递依赖 ;
dependencies {implementation ('androidx.appcompat:appcompat:1.4.1') {transitive true // 包括传递依赖, 如果设置为 false 则排除传递依赖}
}
ModuleDependency#transitive 函数的原型如下 :
/*** 设置是否应解析此依赖项,包括或排除其可传递依赖项。* 属于此依赖项的工件本身可能依赖于其他工件。* 后者称为传递依赖。** @param transitive 是否应解析可传递依赖项。* @return this*/ModuleDependency setTransitive(boolean transitive);
三、通过 ModuleDependency#exclude 设置排除子依赖库
针对依赖库冲突 : 依赖库 A 中 , 包含了 B , C 分库 ,
- 它们的 所有版本都是 1.0 版本 , 这两个分库是无法分开的 ;
- 应用突然 单独的依赖了 2.0 版本的 B 依赖库 ,
这就 出现了冲突 , 此时就会 引入了两个版本的 B 依赖库 , 导致了冲突 ;
在依赖库中 , 可以将其中的某个依赖库剔除 , 如 androidx.appcompat:appcompat
依赖库中 , 依赖了
androidx.annotation:annotation
依赖库androidx.core:core
依赖库ndroidx.cursoradapter:cursoradapter
依赖库androidx.activity:activity
依赖库
+--- androidx.appcompat:appcompat:1.4.1
| +--- androidx.annotation:annotation:1.3.0
| +--- androidx.core:core:1.7.0 (*)
| +--- androidx.cursoradapter:cursoradapter:1.0.0
| +--- androidx.activity:activity:1.2.4
使用如下配置 , 在闭包中调用 ModuleDependency#exclude 方法 , 可以排除 androidx.activity:activity
依赖库 ;
设置之后 , 导入 androidx.appcompat:appcompat
依赖库 , 就会将 androidx.activity:activity
依赖库排除出去 , 不再加载该依赖库 ;
dependencies {implementation ('androidx.appcompat:appcompat:1.4.1') {// 排除 androidx.annotation:annotation 依赖exclude group: "androidx.activity", module: "activity"}
}
特别注意 : 如果在此处排除了 , 如果在其它地方引用了 androidx.appcompat:appcompat
依赖库 , 则该设置无效 ;
ModuleDependency#exclude 方法函数原型如下 :
/*** 添加排除规则以排除此依赖项的可传递依赖项。* <p>* 排除特定的可传递依赖项并不保证它不会出现* 在给定配置的依赖性中。* 例如,没有任何排除规则的某些其他依赖项,* 可能会引入完全相同的传递依赖关系。* 确保从整个配置中排除可传递依赖项* 请使用每个配置的排除规则:{@link configuration#getExcludeRules()}。* 事实上,在大多数情况下,配置每个依赖项排除的实际意图* 实际上是从整个配置(或类路径)中排除依赖项。* <p>* 如果您的意图是排除特定的可传递依赖关系* 因为您不喜欢它引入配置的版本* 然后考虑使用强制版本的功能:{@link ResolutionStrategy#force(Object…)}。** <pre class='autoTested'>* plugins {* id 'java' // so that I can declare 'implementation' dependencies* }** dependencies {* implementation('org.hibernate:hibernate:3.1') {* //excluding a particular transitive dependency:* exclude module: 'cglib' //by artifact name* exclude group: 'org.jmock' //by group* exclude group: 'org.unwanted', module: 'iAmBuggy' //by both name and group* }* }* </pre>** @param excludeProperties 定义排除规则的属性。* @return this*/
ModuleDependency exclude(Map<String, String> excludeProperties);
特别注意 : 如果在此处排除了 , 如果在其它地方引用了 androidx.appcompat:appcompat
依赖库 , 则该设置无效 ;
四、通过 configuration 配置排除子依赖库
首先 , 执行
gradlew app:dependencies --configuration releaseRuntimeClasspath
命令 , 查看 androidx.appcompat:appcompat
依赖库中 , 包含 androidx.activity:activity
依赖库 , 如下图所示 ;
然后 , 在 configurations#configuration 脚本块 中 , 配置如下依赖配置 :
configurations {configuration{all*.exclude group: "androidx.activity", module: "activity"}
}dependencies {implementation 'androidx.appcompat:appcompat:1.4.1'
}
最后 , 再执行
gradlew app:dependencies --configuration releaseRuntimeClasspath
命令 , 查看 androidx.appcompat:appcompat
依赖库中 , 不再包含 androidx.activity:activity
依赖库 ;
五、force 强制指定依赖库
在 configurations.all#resolutionStrategy 脚本块 中 , 可以 使用 force 强制指定依赖库 ;
使用如下代码 , 将 androidx.appcompat:appcompat
依赖库 , 强制指定为 1.2.0 版本 , 即使有更高版本的 androidx.appcompat:appcompat:1.4.
依赖库 , 也会强制使用该 androidx.appcompat:appcompat:1.2.0
低版本依赖库 ;
configurations.all {resolutionStrategy {force 'androidx.appcompat:appcompat:1.2.0'}
}dependencies {implementation 'androidx.appcompat:appcompat:1.4.1'
}
执行
gradlew app:dependencies --configuration releaseRuntimeClasspath
命令 , 查看 androidx.appcompat:appcompat
依赖库中 , 发现有 1.4.1 高版本依赖库 , 但是还是被强制使用了 1.2.0 版本的依赖库 ;
【Android Gradle 插件】Android 依赖管理 ⑥ ( 依赖冲突处理 | transitive 依赖传递设置 | exclude 依赖排除设置 | force 强制指定依赖库 )相关推荐
- 【Android Gradle 插件】工程根目录下 build.gradle 配置文件 ( 远程仓库配置 | 依赖配置 | 所有子模块配置 | task clean 任务 )
文章目录 一.工程根目录下 build.gradle 配置文件 1.基本作用 2.远程仓库配置 3.依赖配置 3.所有子模块配置 4.task clean 任务 Android Plugin DSL ...
- 小记Android Gradle插件 Iven 记于 20190522 药厂
2016.04年 Android Gradle插件2.x 通过支持字节码注入,将代码和资源更新推送到模拟器或物理设备上正在运行的应用程序,启用Instant Run. 添加了对增量构建的支持,即使应用 ...
- Android Gradle 插件版本说明
Android Studio 构建系统以 Gradle 为基础,并且 Android Gradle 插件添加了几项专用于构建 Android 应用的功能.虽然 Android 插件通常会与 Andro ...
- 【Android Gradle 插件】自定义 Gradle 插件优化图片 ① ( Android 中的 WebP 图片格式使用 | WebP 格式转换 | WebP 参考文档 )
文章目录 一.Android 中的 WebP 图片格式使用 二.WebP 格式转换 三.WebP 参考文档 Android Plugin DSL Reference 参考文档 : Android St ...
- 【Android Gradle 插件】Extension 扩展类型 ( Module 引入插件类型 | application 插件 | library 插件 | Variants 变体列表 )
文章目录 一.Module 引入插件类型 1.com.android.application 插件 2.com.android.library 插件 二.Extension 扩展类型 三.applic ...
- 【Android Gradle 插件】ProductFlavor 配置 ( ProductFlavor#buildConfigField 方法 | 单独编译生成 BuildConfig 类的任务 )
文章目录 一.ProductFlavor#buildConfigField 方法 二.单独执行 Gradle 编译 BuildConfig 的任务 Android Plugin DSL Referen ...
- 【Android Gradle 插件】Android Plugin DSL Reference 离线文档下载 ( GitHub 下载文档 | 查看文档 )
文章目录 一.Android Plugin DSL Reference 文档下载 二.Android Plugin DSL Reference 文档查看 一.Android Plugin DSL Re ...
- android gradle proguard,Android Gradle插件2.2.0 ProGuard开始保留内部类
在将Android Studio更新为2.2版并将Android Gradle插件更新为2.2.0之后,在构建发行版apk时会有很多警告,例如: Error:warning: Ignoring Inn ...
- 各个 Android Gradle 插件版本所需的 Gradle 版本
下表列出了各个 Android Gradle 插件版本所需的 Gradle 版本. 要获得最佳性能,您应该使用 Gradle 和插件这两者的最新版本. 插件版本 所需的 Gradle 版本 1.0.0 ...
最新文章
- SAP QA32 做使用决策系统报错:分类数据的不一致性=交易终止
- nyoj-619 青蛙过河
- 深入浅出聊一聊Docker
- 五分钟了解操作系统内核
- 前端学习(635):字符串拼接
- 前端性能优化之Lazyload
- Mybatis的Mapper代理
- CTS ( 19)---Android 8.1/GO GMS认证
- 【报告分享】阿里达摩院:2022十大科技趋势.pdf(附下载链接)
- [转载] Python使用list.reverse()返回None
- github 新建远程仓库 及 删除远程仓库
- c4d安装oc后打开计算机丢失,c4d+oc的安装及使用的全过程
- 蛋白互作常用的研究方法
- 【Nginx服务优化与防盗链】
- 硬件防火墙和软件防火墙的比较
- 《项目管理问题分析与解决方案小册》(持续更新中)
- 我们将与操作系统工作谈一场无私的爱──《云情人》思考
- fiyme android底层,魅族首批Android 10底层Flyme于今日正式推送
- c++2013无法卸载_ADS软件安装卸载注意事项及问题解决办法
- QT报错:Gtk-Message:Failed to load module :gail“
热门文章
- 使用DriverManager动态加载JDBC驱动时,报:java.sql.SQLException: No suitable driver found for xxxx 错误
- UDS诊断系列介绍08-19服务
- Html单选按钮自定义样式
- 基于mjpg-streamer实现树莓派推流至上位机(自用)
- 博文推荐|BookKeeper - Apache Pulsar 高可用 / 强一致 / 低延迟的存储实现
- bookkeeper命令行操作
- 电视android升级啥意思,索尼智能电视Android电视机升级教程
- 考研数学复习建议与资料
- hibernate基础(十四):二级缓存
- 文件下载被浏览器默认打开解决方法