本节介绍了一些高级主题,这些主题在您希望扩展 Android Gradle 插件或编写自己的插件时非常有用。
将变体依赖项发布到自定义逻辑
库可以包含其他项目或子项目可能希望使用的功能。发布库是将库提供给其使用者的过程。库可以控制其使用者在编译时和运行时可以访问哪些依赖项。
有两个独立的配置用于保存每个类路径的传递依赖项,使用者必须使用这些配置来使用库,如下所述:
variant_nameApiElements
: 此配置包含编译时可供使用者使用的传递依赖项。variant_nameRuntimeElements
: 此配置包含运行时可供使用者使用的传递依赖项。
要详细了解不同配置之间的关系,请访问Java 库插件配置。
自定义依赖项解析策略
一个项目可能依赖于同一个库的两个不同版本,这可能导致依赖项冲突。例如,如果您的项目依赖于模块 A 的版本 1 和模块 B 的版本 2,并且模块 A 传递性地依赖于模块 B 的版本 3,则会发生依赖项版本冲突。
为解决此冲突,Android Gradle 插件采用以下依赖项解析策略:当插件检测到依赖项图中存在同一模块的不同版本时,默认情况下,它会选择版本号最高的那个。
但是,此策略可能并非总能按预期工作。要自定义依赖项解析策略,请使用以下配置来解析任务所需的特定变体依赖项:
variant_nameCompileClasspath
: 此配置包含给定变体编译类路径的解析策略。variant_nameRuntimeClasspath
: 此配置包含给定变体运行时类路径的解析策略。
Android Gradle 插件包含获取器,可用于访问每个变体的配置对象。因此,您可以使用变体 API 查询依赖项解析,如下例所示:
Kotlin
android { applicationVariants.all { // Return compile configuration objects of a variant. compileConfiguration.resolutionStrategy { // Use Gradle's ResolutionStrategy API // to customize how this variant resolves dependencies. ... } // Return runtime configuration objects of a variant. runtimeConfiguration.resolutionStrategy { ... } // Return annotation processor configuration of a variant. annotationProcessorConfiguration.resolutionStrategy { ... } } }
Groovy
android { applicationVariants.all { variant -> // Return compile configuration objects of a variant. variant.getCompileConfiguration().resolutionStrategy { // Use Gradle's ResolutionStrategy API // to customize how this variant resolves dependencies. ... } // Return runtime configuration objects of a variant. variant.getRuntimeConfiguration().resolutionStrategy { ... } // Return annotation processor configuration of a variant. variant.getAnnotationProcessorConfiguration().resolutionStrategy { ... } } }