OkHttp:TlsUtil 中的 NoSuchMethodError copyInto

tir*_*r38 8 kotlin okhttp3

使用RESTMock我们运行仪器测试时出现此错误

java.lang.NoSuchMethodError: No static method copyInto$default([Ljava/lang/Object;[Ljava/lang/Object;IIIILjava/lang/Object;)[Ljava/lang/Object; in class Lkotlin/collections/ArraysKt; or its super classes (declaration of 'kotlin.collections.ArraysKt' appears in /data/app/com.example.debug-1/base.apk)
FATAL EXCEPTION: pool-6-thread-1
Process: com.example.debug, PID: 6606
java.lang.NoSuchMethodError: No static method copyInto$default([Ljava/lang/Object;[Ljava/lang/Object;IIIILjava/lang/Object;)[Ljava/lang/Object; in class Lkotlin/collections/ArraysKt; or its super classes (declaration of 'kotlin.collections.ArraysKt' appears in /data/app/com.example.debug-1/base.apk)
    at okhttp3.tls.internal.TlsUtil.newKeyManager(TlsUtil.kt:84)
    at okhttp3.tls.HandshakeCertificates$Builder.build(HandshakeCertificates.kt:144)
    at io.appflate.restmock.SslUtils.localhost(SslUtils.java:49)
    at io.appflate.restmock.RESTMockServer.setUpHttps(RESTMockServer.java:91)
    at io.appflate.restmock.RESTMockServer.init(RESTMockServer.java:74)
    at io.appflate.restmock.RESTMockServerStarter$1.run(RESTMockServerStarter.java:56)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
Run Code Online (Sandbox Code Playgroud)

这是OkHttp中有问题的行

IIUC,Kotlin 可以把 avarargs当作 Kotlin Array 然后调用像copyInto这样的扩展函数

我们使用 OkHttp 4.0.1、Kotlin 1.3.40、R8 1.5.41

我们的测试 apk 正确包含copyInto方法,所以我认为这不是 proguard/R8 问题:

在此处输入图片说明

我不知道接下来要测试什么。我在 OkHttp 的 github issuse 页面上询问,他们建议我在这里发布链接

更新:仍然发生在 OkHttp 4.1.0 上。我也意识到它不可能是 R8 问题,因为 R8 不会从测试 apk 中删除代码。

Ale*_*lex 6

当我使用okhttp3.mockwebserver.MockWebServer启用了 https 的服务器证书时,我遇到了同样的问题okhttp-tls
就我而言,问题在于,仅通过导入com.squareup.okhttp3:okhttp-tls:4.2.0依赖项,org.jetbrains.kotlin:kotlin-stdlib就可以将其解析为 version 1.2.71
鉴于该copyInto方法是在启动 kotlin1.3时引入的,它失败并出现与您相同的错误。

我通过在我的 gradle.build 文件中明确添加 kotlin 版本来修复它:
testRuntime 'org.jetbrains.kotlin:kotlin-stdlib:1.3.50'

  • okhttp 和 okhttp-tls 依赖于 1.3.50,因此一定有其他东西将其固定回旧版本。https://mvnrepository.com/artifact/com.squareup.okhttp3/okhttp/4.2.0 (3认同)

Rez*_*eza 6

我遇到了同样的问题,然后将提及的 lib 添加到我的项目中。它解决了我的问题:

行家:

<!-- https://mvnrepository.com/artifact/org.jetbrains.kotlin/kotlin-stdlib -->
        <dependency>
            <groupId>org.jetbrains.kotlin</groupId>
            <artifactId>kotlin-stdlib</artifactId>
            <version>1.3.70</version>
        </dependency>
Run Code Online (Sandbox Code Playgroud)

或者

'org.jetbrains.kotlin:kotlin-stdlib:1.3.70'
Run Code Online (Sandbox Code Playgroud)