Android Studio3.x新的依赖方式(implementation、api、compileOnly)

本文介绍了Android Studio 3.0中新引入的依赖管理方式,如implementation和api等,并对比了与2.x版本中compile的区别。同时讲解了各种依赖类型的特点及适用场景。

https://blog.youkuaiyun.com/yuzhiqiang_1993/article/details/78366985?locationNum=6&fps=1

Android Studio3.0正式版已经出来了,相比2.x的版本,编译速度提高了不少。 
当我们使用AS3.0新建项目时会发现,默认的依赖由之前的compile更改为implementation了。

下面我们来看看他们之前的差异:

首先是2.x版本的依赖方式:

这里写图片描述

再来看看3.0的:

这里写图片描述

可以看到在Android studio3.0中,compile依赖关系已被弃用,被implementation和api替代,provided被compile only替代,apk被runtime only替代,剩下的看名字就知道了。

我们先来看看implementation和api的区别:

api:跟2.x版本的 compile完全相同

implementation:只能在内部使用此模块,比如我在一个libiary中使用implementation依赖了gson库,然后我的主项目依赖了libiary,那么,我的主项目就无法访问gson库中的方法。这样的好处是编译速度会加快,推荐使用implementation的方式去依赖,如果你需要提供给外部访问,那么就使用api依赖即可


还不熟悉2.x版本依赖的可以看看下面的说明,括号里对应的是3.0版本的依赖方式。

compile(api)

这种是我们最常用的方式,使用该方式依赖的库将会参与编译和打包。 
当我们依赖一些第三方的库时,可能会遇到com.android.support冲突的问题,就是因为开发者使用的compile依赖的com.android.support包,而他所依赖的包与我们本地所依赖的com.android.support包版本不一样,所以就会报All com.android.support libraries must use the exact same version specification (mixing versions can lead to runtime crashes这个错误。

解决办法可以看这篇博客:com.android.support冲突的解决办法


provided(compileOnly)

只在编译时有效,不会参与打包 
可以在自己的moudle中使用该方式依赖一些比如com.android.support,gson这些使用者常用的库,避免冲突。


apk(runtimeOnly)

只在生成apk的时候参与打包,编译时不会参与,很少用。


testCompile(testImplementation)

testCompile 只在单元测试代码的编译以及最终打包测试apk时有效。


debugCompile(debugImplementation)

debugCompile 只在debug模式的编译和最终的debug apk打包时有效


releaseCompile(releaseImplementation)

Release compile 仅仅针对Release 模式的编译和最终的Release apk打包。

 

转载于:https://www.cnblogs.com/tc310/p/9086627.html

<think>嗯,用户遇到了Android Studio中configurations.all配置无效的问题,这确实是个棘手的配置问题。从用户描述看,ta可能正在尝试统一管理依赖版本,但配置没有生效,导致依赖冲突或版本不一致。 用户提供的引用信息里有几个关键点值得注意:引用[1]提到过gradle.properties配置和NDK版本问题,引用[2]则涉及主类找不到的运行时错误。虽然这些不是直接解决方案,但说明用户可能遇到的是Gradle构建层面的配置问题。 需要帮用户系统排查几个方向:首先考虑Gradle脚本作用域问题,configurations.all块必须放在正确的位置;其次检查是否被后续脚本覆盖,这在多模块项目中很常见;还要看Android Gradle插件版本兼容性,7.0之后有些配置方式变了。用户可能没意识到子模块配置会覆盖根配置,或者忘了同步Gradle。 想到三个典型排查步骤:第一验证配置位置,建议用户在根build.gradle的allprojects里添加;第二检查依赖声明方式,确保没用implementation等新语法;第三查看Gradle日志,运行时会提示配置失效原因。如果用户能提供build.gradle片段会更容易定位,不过现在也可以先给通用方案。 用户可能正在赶项目进度,语气中透着焦虑。要给出立即见效的检查项,比如建议ta先尝试在根项目添加配置块,然后clean并同步。如果还不行,就要考虑Gradle版本升级或调试模式查看apply过程了。最后提醒排除常见陷阱,比如配置块放错文件、拼写错误等低级失误。</think>好的,我们来解决 Android Studio 中 `configurations.all` 配置无效的问题。这个问题通常发生在你尝试在 Gradle 脚本中使用 `configurations.all` 块来统一修改所有配置(如解决依赖冲突、强制使用特定版本)时,但配置没有按预期生效。 以下是详细的排查步骤和解决方案: **1. 确认配置块的位置和作用域** * **根项目 vs. 子模块:** `configurations.all` 块通常应该放在**根项目**的 `build.gradle` 文件中(通常是项目根目录下的 `build.gradle`),放在 `allprojects { ... }` 块**内部**或**外部**取决于你的意图: * **放在 `allprojects { ... }` 块内部:** 该配置将应用于**根项目本身和所有子模块**。 * **放在 `allprojects { ... }` 块外部:** 该配置**仅应用于根项目本身**。如果你的依赖主要在子模块中声明,那么放在这里可能无效。 ```groovy // 根项目 build.gradle (通常位于项目根目录) allprojects { // 配置在此处会应用于所有子模块 configurations.all { resolutionStrategy { // 例如,强制某个库的版本 force &#39;com.google.guava:guava:31.1-jre&#39; } } } ``` * **子模块的 `build.gradle`:** 如果你将 `configurations.all` 放在某个**子模块**的 `build.gradle` 文件中,那么它**只对该子模块有效**。如果其他子模块没有相同的配置,它们就不会受到影响。 * **检查位置:** 仔细检查你的 `configurations.all` 块是放在哪个文件的哪个位置。确保它放在了你想影响的所有模块都能应用到的正确位置(通常是根项目的 `build.gradle` 的 `allprojects` 或 `subprojects` 块内)。 **2. 检查依赖声明的时间点** * Gradle 的配置阶段是有顺序的。`configurations.all` 块中的逻辑(尤其是 `resolutionStrategy`)需要在**依赖被解析之前**应用才有效。 * **确保 `configurations.all` 块在依赖声明之前:** 理想情况下,`configurations.all` 块应该放在**定义依赖的 `dependencies { ... }` 块之前**。虽然 Gradle 会收集所有配置,但尽早定义解析策略更安全。 * **在根项目中尽早声明:** 在根项目的 `build.gradle` 中,将 `configurations.all` 块(尤其是在 `allprojects` 内)放在文件靠前的位置,确保它在子模块的依赖被评估之前就生效。 **3. 验证配置是否被后续脚本覆盖** * 检查是否有其他 Gradle 脚本(可能是插件、其他构建脚本或你自己的脚本)在 `configurations.all` 块**之后**又修改了相同的配置(特别是 `resolutionStrategy`)。后面的修改可能会覆盖前面的设置。 * 检查是否有**子模块**在其自己的 `build.gradle` 中针对特定配置(如 `implementation`)设置了不同的解析策略,这可能会覆盖根项目设置的全局策略。 **4. 检查 Android Gradle Plugin (AGP) 版本** * 某些非常旧或非常新的 Android Gradle Plugin (AGP) 版本可能存在与全局配置解析策略相关的细微 Bug 或行为变更。 * **检查版本:** 查看你的根项目 `build.gradle` 中 `com.android.tools.build:gradle` 的版本。 * **尝试更新/回退:** 如果可能,尝试更新到 AGP 的**稳定版本**(非 RC/Beta),或者如果问题在新版本出现,尝试暂时回退到上一个已知工作正常的版本。查看 AGP 的发布说明,看是否有相关修复或变更。 **5. 使用 `subprojects` 替代 `allprojects` (如果适用)** * 如果你的根项目本身不包含任何需要该配置的代码(只是一个容器项目),而所有实际代码都在子模块中,可以尝试在根项目中使用 `subprojects { ... }` 替代 `allprojects { ... }` 来包裹 `configurations.all`。这确保配置只应用于子模块,避免潜在的根项目配置冲突。 ```groovy // 根项目 build.gradle subprojects { configurations.all { resolutionStrategy { force &#39;com.google.guava:guava:31.1-jre&#39; } } } ``` **6. 检查依赖配置类型** * `configurations.all` 会作用于项目中的所有配置(`implementation`, `api`, `compileOnly`, `runtimeOnly`, `testImplementation` 等)。 * 确保你尝试影响的依赖确实是声明在会被 `configurations.all` 覆盖的配置中。例如,如果依赖是用 `compileOnly` 声明的,而你的 `resolutionStrategy.force` 是针对运行时或编译时类路径的,可能不会生效。 **7. 执行 Gradle 同步和 Clean 构建** * 每次修改 `build.gradle` 文件后,**务必点击 Android Studio 工具栏上的 "Sync Project with Gradle Files" 按钮 (大象图标)**。这确保 Android Studio 的模型与 Gradle 配置保持同步。 * 在修改了解析策略后,执行一次 **`Build > Clean Project`** 是一个好习惯,可以清除旧的解析结果缓存,确保新的策略被应用。 **8. 启用 Gradle 调试日志 (高级排查)** * 如果以上步骤都无法解决问题,需要更深入地查看 Gradle 解析依赖的过程。 * 在 Android Studio 的终端 (`Terminal`) 标签页中运行以下命令: ```bash ./gradlew :app:dependencies --configuration compileClasspath --debug > dependencies.log 2>&1 ``` * 将 `:app` 替换为你的主应用模块名称(如果需要分析其他模块)。 * 将 `compileClasspath` 替换为你关心的具体配置(如 `releaseRuntimeClasspath`, `debugImplementation` 等)。 * 命令执行后,会在项目根目录生成一个 `dependencies.log` 文件。仔细搜索这个文件: * 查找你设置的强制版本 (`force`) 或排除规则 (`exclude`) 是否出现在日志中。 * 查找是否有其他解析策略覆盖了你的设置。 * 查找依赖解析的最终结果,看是否是你期望的版本。 * 分析日志通常能揭示配置为何未被应用的具体原因(例如,被其他规则覆盖、作用域错误、依赖声明方式特殊等)。 **9. 检查常见错误** * **拼写错误:** 仔细检查 `configurations` (有 &#39;s&#39;)、`resolutionStrategy`、`force`、`exclude` 等关键字的拼写。 * **语法错误:** 确保 Groovy 语法正确,特别是闭包 `{ ... }` 的配对和括号的使用。 * **依赖坐标错误:** 检查 `force` 或 `exclude` 中使用的 Group、Module 名称和版本号是否完全准确。 * **插件冲突:** 某些第三方插件可能会干扰 Gradle 的标准依赖解析过程。尝试暂时禁用可疑插件进行测试。 **总结排查流程:** 1. **定位:** 确认 `configurations.all` 块在**根项目**的 `build.gradle` 中,并位于 `allprojects { ... }` 或 `subprojects { ... }` 块内。 2. **顺序:** 确保它出现在**依赖声明 (`dependencies { ... }`)** 之前。 3. **同步 & 清理:** 执行 **Gradle Sync** 和 **Clean Build**。 4. **验证:** 检查构建输出或使用 `dependencies` 任务查看解析结果。 5. **日志:** 如果无效,启用 **Gradle 调试日志** (`--debug`) 分析具体原因。 6. **AGP 版本:** 考虑 Android Gradle Plugin 版本兼容性。 7. **覆盖:** 检查是否有子模块或后续脚本覆盖了该配置。 遵循这些步骤,应该能够定位并解决 `configurations.all` 配置无效的问题。如果问题依然存在,仔细分析 Gradle 调试日志 (`dependencies.log`) 通常能提供最直接的线索。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值