gpt4 book ai didi

android - 如何防止 Gradle 将库的依赖版本更改为更高版本,因为另一个库需要它作为传递依赖?

转载 作者:行者123 更新时间:2023-12-02 00:49:42 26 4
gpt4 key购买 nike

上下文

我正在尝试包含 Flipper debug tool使用网络插件进入我的应用程序。为了使它有用,我需要在我的 HTTP 模块中添加一个 Flipper 网络拦截器,它提供了一个 OkHttp 客户端供我的应用程序使用。我只在调试配置中包含 Flipper 库。我在我的 http 模块中包含 Flipper 部门,如下所示:

dependencies {
[...]
debugImplementation dep('com.facebook.flipper:flipper')
debugImplementation dep('com.facebook.flipper:flipper-network-plugin')
}


问题

我面临的问题是 Flipper transitively depends on okhttp:3.14.1' 我们的应用程序支持 API 级别 16 的客户端。现在的问题是, below API 21 (Lolipop) I can't use any version of okhttp above 3.12.x.

正因为如此,其他依赖OkHttp的东西,开始使用 OkHttp的版本8.12.x 以上,导致 HTTP 初始化中断。
11-08 13:48:28.394 E/AndroidRuntime: FATAL EXCEPTION: main
java.lang.NoClassDefFoundError: java.util.Objects
at okhttp3.CertificatePinner.withCertificateChainCleaner(CertificatePinner.java:231)
at okhttp3.OkHttpClient.<init>(OkHttpClient.java:238)
at okhttp3.OkHttpClient.<init>(OkHttpClient.java:202)

查看依赖关系树,在我看来,因为 Flipper 需要 OkHttp 3.14.1 版本,我的应用程序中在调试配置中需要 OkHttp 客户端的其他部分也使用 3.14.1 而不是 3.12.3:
debugAndroidTest
[...]
+--- project :libs:http-retrofit
| +--- project :libs:http (*)
| +--- com.squareup.okhttp3:okhttp:3.12.3 -> 3.14.1 (*)
| +--- javax.inject:javax.inject:1
| +--- com.squareup.retrofit2:retrofit:2.5.0
| | \--- com.squareup.okhttp3:okhttp:3.12.0 -> 3.14.1 (*)


如何让 Gradle 不会在其他任何地方更改 OkHTTP 的依赖版本?

编辑澄清:

基本上我希望我所有依赖于 OkHttp 的 Gradle 依赖项都使用 3.12.3 版本(无论 Android API 版本),除了我只包含在调试版本中的 Flipper,如果它真的需要它应该能够拥有 3.14.1 版本至。

最佳答案

来自 dependency constraints毕业指南:

Dependency constraints allow you to define the version or the version range of both dependencies declared in the build script and transitive dependencies.



Declaring Rich Versions指导:

strictly Any version not matched by this version notation will be excluded. This is the strongest version declaration. On a declared dependency, a strictly can downgrade a version. When on a transitive dependency, it will cause dependency resolution to fail if no version acceptable by this clause can be selected. See overriding dependency version for details. This term supports dynamic versions.

When defined, overrides previous require declaration and clears previous reject.



所以把这些放在一起,我认为你应该能够做这样的事情:
dependencies {
[...]
debugImplementation dep('com.facebook.flipper:flipper')
debugImplementation dep('com.facebook.flipper:flipper-network-plugin')

constraints {
debugImplementation dep('com.squareup.okhttp3:okhttp') {
version {
strictly '3.12.3'
}
}
}

当然,如果依赖项之一 不能使用版本 3.12.3 那么它将无法解决约束。

关于android - 如何防止 Gradle 将库的依赖版本更改为更高版本,因为另一个库需要它作为传递依赖?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58768412/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com