文章目录

  • 一、查询 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 强制指定依赖库 )相关推荐

  1. 【Android Gradle 插件】工程根目录下 build.gradle 配置文件 ( 远程仓库配置 | 依赖配置 | 所有子模块配置 | task clean 任务 )

    文章目录 一.工程根目录下 build.gradle 配置文件 1.基本作用 2.远程仓库配置 3.依赖配置 3.所有子模块配置 4.task clean 任务 Android Plugin DSL ...

  2. 小记Android Gradle插件 Iven 记于 20190522 药厂

    2016.04年 Android Gradle插件2.x 通过支持字节码注入,将代码和资源更新推送到模拟器或物理设备上正在运行的应用程序,启用Instant Run. 添加了对增量构建的支持,即使应用 ...

  3. Android Gradle 插件版本说明

    Android Studio 构建系统以 Gradle 为基础,并且 Android Gradle 插件添加了几项专用于构建 Android 应用的功能.虽然 Android 插件通常会与 Andro ...

  4. 【Android Gradle 插件】自定义 Gradle 插件优化图片 ① ( Android 中的 WebP 图片格式使用 | WebP 格式转换 | WebP 参考文档 )

    文章目录 一.Android 中的 WebP 图片格式使用 二.WebP 格式转换 三.WebP 参考文档 Android Plugin DSL Reference 参考文档 : Android St ...

  5. 【Android Gradle 插件】Extension 扩展类型 ( Module 引入插件类型 | application 插件 | library 插件 | Variants 变体列表 )

    文章目录 一.Module 引入插件类型 1.com.android.application 插件 2.com.android.library 插件 二.Extension 扩展类型 三.applic ...

  6. 【Android Gradle 插件】ProductFlavor 配置 ( ProductFlavor#buildConfigField 方法 | 单独编译生成 BuildConfig 类的任务 )

    文章目录 一.ProductFlavor#buildConfigField 方法 二.单独执行 Gradle 编译 BuildConfig 的任务 Android Plugin DSL Referen ...

  7. 【Android Gradle 插件】Android Plugin DSL Reference 离线文档下载 ( GitHub 下载文档 | 查看文档 )

    文章目录 一.Android Plugin DSL Reference 文档下载 二.Android Plugin DSL Reference 文档查看 一.Android Plugin DSL Re ...

  8. android gradle proguard,Android Gradle插件2.2.0 ProGuard开始保留内部类

    在将Android Studio更新为2.2版并将Android Gradle插件更新为2.2.0之后,在构建发行版apk时会有很多警告,例如: Error:warning: Ignoring Inn ...

  9. 各个 Android Gradle 插件版本所需的 Gradle 版本

    下表列出了各个 Android Gradle 插件版本所需的 Gradle 版本. 要获得最佳性能,您应该使用 Gradle 和插件这两者的最新版本. 插件版本 所需的 Gradle 版本 1.0.0 ...

最新文章

  1. SAP QA32 做使用决策系统报错:分类数据的不一致性=交易终止
  2. nyoj-619 青蛙过河
  3. 深入浅出聊一聊Docker
  4. 五分钟了解操作系统内核
  5. 前端学习(635):字符串拼接
  6. 前端性能优化之Lazyload
  7. Mybatis的Mapper代理
  8. CTS ( 19)---Android 8.1/GO GMS认证
  9. 【报告分享】阿里达摩院:2022十大科技趋势.pdf(附下载链接)
  10. [转载] Python使用list.reverse()返回None
  11. github 新建远程仓库 及 删除远程仓库
  12. c4d安装oc后打开计算机丢失,c4d+oc的安装及使用的全过程
  13. 蛋白互作常用的研究方法
  14. 【Nginx服务优化与防盗链】
  15. 硬件防火墙和软件防火墙的比较
  16. 《项目管理问题分析与解决方案小册》(持续更新中)
  17. 我们将与操作系统工作谈一场无私的爱──《云情人》思考
  18. fiyme android底层,魅族首批Android 10底层Flyme于今日正式推送
  19. c++2013无法卸载_ADS软件安装卸载注意事项及问题解决办法
  20. QT报错:Gtk-Message:Failed to load module :gail“

热门文章

  1. 使用DriverManager动态加载JDBC驱动时,报:java.sql.SQLException: No suitable driver found for xxxx 错误
  2. UDS诊断系列介绍08-19服务
  3. Html单选按钮自定义样式
  4. 基于mjpg-streamer实现树莓派推流至上位机(自用)
  5. 博文推荐|BookKeeper - Apache Pulsar 高可用 / 强一致 / 低延迟的存储实现
  6. bookkeeper命令行操作
  7. 电视android升级啥意思,索尼智能电视Android电视机升级教程
  8. 考研数学复习建议与资料
  9. hibernate基础(十四):二级缓存
  10. 文件下载被浏览器默认打开解决方法