当前位置: 首页 > 科技观察

Gradle的依赖处理不当可能会导致你编译异常!解决方案就在这里!

时间:2023-03-12 07:37:09 科技观察

我们初学接触Gradle的时候,大部分时间都是用它来添加依赖库。而你依赖的依赖库可能依赖于其他库。这种情况很常见,这种情况称为依赖转移。如果处理不好这样错综复杂的依赖关系,可能达不到你预期的效果,你有没有深入研究过?下面我们就来看看如何解决Gradle依赖导致的问题。在AndroidStudio中,Gradle构建过程对开发人员来说很大程度上是抽象的。作为一名Android开发新手,第一次接触Gradle一般是在build.gradle文件中添加一个远程依赖。让我们看看如何阅读Gradle依赖关系树和解决依赖关系问题。这是我在工作中管理的一个项目,我想将targetVersion升级到27,我也在Gradle中,将新版本的appcompat-v7支持库更新到最新的依赖版本27.0.2。更改后,同步项目,我在build.gradle中收到以下错误:ThiserrorsaysImustusetheexactsameversionofthesupportlibrary。但我只在我的build.gradle中使用了这个支持库。AndroidStudio的这个提示到底是什么意思?在此错误消息中,哪里提到了com.android.support:animated-vector-drawable:27.0.2或com.android.support-v4:21.0.3?如果只是应用的直接依赖库,只需要在build.gradle中指定依赖即可,非常清晰。但事实并非如此,这些依赖可能进一步有自己的依赖,这就是所谓的依赖传递。Gradle需要包含应用程序中的所有直接或间接依赖项。上面AndroidStudio提示的错误信息就是我们现在讨论的传递依赖导致的。Gradle必须解决所有这些依赖关系。使用了哪些库?如果两个不同的库对同一个库具有不同版本的依赖项,会发生什么情况?要查看Gradle依赖树(Gradle解析依赖的方式),我们可以转到位于AndroidStudio底部的终端选项卡并输入以下命令:gradlewapp:dependencies这将显示所有构建变体的依赖解析树。我们可以在上面的命令中添加一个标志来查看特定构建变体的配置。例如--configurationreleaseCompileClasspath将向我们展示发布变体的依赖树。关于buildingvariants,建议阅读官方文档:https://developer.android.com/studio/build/build-variants.html以上是上述命令的输出:releaseCompileClasspath-Resolvedconfigurationforcompilationforvariant:release+---com.android.databinding:library:1.3.1|+---com.android.support:support-v4:21.0.3||\---com.android.support:support-annotations:21.0.3->27.0.2|\---com.android.databinding:baseLibrary:2.3.0-dev->3.0.1+---com.android.databinding:baseLibrary:3.0.1+---com.android.databinding:adapters:1.3.1|+---com.android.databinding:library:1.3->1.3.1(*)|\---com.android.databinding:baseLibrary:2.3.0-dev->3.0。1+---com.android.support.constraint:constraint-layout:1.0.2|\---com.android.support.constraint:constraint-layout-solver:1.0.2\---com.android。支持:appcompat-v7:27.0.2+---com.android.support:support-annotations:27.0.2+---com.android.support:support-core-utils:27.0.2|+---com.android.support:support-annotations:27.0.2|\---com.android.support:support-compat:27.0.2|+---com.android.support:支持注释:27.0.2|\---android.arch.lifecycle:runtime:1.0.3|+---android.arch.lifecycle:common:1.0.3|\---android.arch.core:通用:1.0.0+---com.android.support:support-fragment:27.0.2|+---com.android.support:support-compat:27.0.2(*)|+---com.android.support:support-core-ui:27.0.2||+---com.android.support:support-annotations:27.0.2||\---com.android.support:support-compat:27.0。2(*)|+---com.android.support:support-core-utils:27.0.2(*)|\---com.android.support:support-annotations:27.0.2+---com.android.support:support-vector-drawable:27.0.2|+---com.android.support:support-annotations:27.0.2|\---com.android.support:support-compat:27.0.2(*)\---com.android.support:animated-vector-drawable:27.0.2+---com.android.support:support-vector-drawable:27.0.2(*)\---com.android.support:support-core-ui:27.0.2(*)在寻找用途之前,了解Gradle依赖树的格式很重要先说下面三个符号,它们的用途只是为了格式化:+---是依赖分支库的开始。|标识上一个依赖库中的依赖,显示它所依赖的库。\---是依赖库的结尾。依赖库末尾的星号(*)表示该库的进一步依赖项将不会显示,因为它们已经列在其他一些子依赖项树中。最重要的标志是->。如果Gradle发现多个依赖项都依赖于同一个库但版本不同,那么它必须做出选择。毕竟包含同一个库的不同版本是没有意义的。在这种情况下,Gradle默认选择最新版本的库。例如:|+——com.android.support:support-v4:21.0.3||\—com.android.support:support-annotations:21.0.3->27.0.2就可以了,Gradle告诉我们,在在support-v4:21.0.3依赖树中,support-annotations:21.0.3依赖较新的版本support-annotations:27.0.2,因此将使用27.0.2。现在我们知道如何阅读Gradle依赖项解析树,我们回到本文的核心问题:所有com.android.support库必须使用完全相同的版本。所有支持库都属于组com.android.support。正如我们在Gradle的依赖树中看到的那样,com.android.support:support-v4:21.0.3是唯一具有版本21.0.3且未解析为版本27.0.2的支持库,这就是导致冲突的原因。如何解决这个问题呢?有几种方法可以做到这一点:1.通过ResolutionStrategy强制Gradle版本。android{configurations.all{//Toresolvetheconflictforcom.android.databinding:library:1.3.1//dependencyonsupport-v4:21.0.3resolutionStrategy.force'com.android.support:support-v4:27.0.2'}}关于ResolutionStrategy的具体细节在官方文档中有详细说明:https://docs.gradle.org/current/dsl/org.gradle.api.artifacts.ResolutionStrategy.html2.在build.gradle中指定要构建的版本。gradle,明确指定添加com.android.support:support-v4:27.0.2。这将使Gradle覆盖旧版本。dependencies{implementationfileTree(dir:'libs',include:['*.jar'])implementation'com.android.support.constraint:constraint-layout:1.0.2'//解决com.android.databinding的冲突:图书馆:1.3。1//dependencyonsupport-v4:21.0.3implementation'com.android.support:support-v4:27.0.2'implementation'com.android.support:appcompat-v7:27.0.2'}对我来说,在构建中。在gradle中显式添加依赖项并留下注释似乎更自然。当我们再次更新库时,这个注释会提醒我留意它,以检查它是否仍然需要明确添加。添加后并在项目同步后,错误文本将消失。现在,如果我们再次运行dependencies命令,我们将看到support-v4:21.0.3resolved->27.0.2。Gradle大部分时间都能正确解析依赖关系。而知道了Gradle的依赖,我想我们遇到这样的问题应该更清楚如何解决。【本文为专栏作家“张扬”原创稿件,转载请微信♂联系作者获得授权】点此查看作者更多好文