React Native: СБОЙ приложения: проверка ОШИБОК bugduplicateclasses

#android #gradle #build.gradle #okhttp

#Android #gradle #build.gradle #okhttp

Вопрос:

Я пытаюсь реализовать Trustmanager соединения для websocket в проекте React Native, напрямую переняв код из этого gist. Для этого требуется запуск okhttp-ws модуля.

Но это не удается при :app:checkDebugDuplicateClasses

 Execution failed for task ':app:checkDebugDuplicateClasses'.
> 1 exception was raised by workers:
  java.lang.RuntimeException: java.lang.RuntimeException: 
  Duplicate class okhttp3.internal.ws.RealWebSocket found in modules okhttp-3.14.1.jar (com.squareup.okhttp3:okhttp:3.14.1) and okhttp-ws-3.4.2.jar (com.squareup.okhttp3:okhttp-ws:3.4.2)
  Duplicate class okhttp3.internal.ws.RealWebSocket$1 found in modules okhttp-3.14.1.jar (com.squareup.okhttp3:okhttp:3.14.1) and okhttp-ws-3.4.2.jar (com.squareup.okhttp3:okhttp-ws:3.4.2)
  Duplicate class okhttp3.internal.ws.WebSocketProtocol found in modules okhttp-3.14.1.jar (com.squareup.okhttp3:okhttp:3.14.1) and okhttp-ws-3.4.2.jar (com.squareup.okhttp3:okhttp-ws:3.4.2)
  Duplicate class okhttp3.internal.ws.WebSocketReader found in modules okhttp-3.14.1.jar (com.squareup.okhttp3:okhttp:3.14.1) and okhttp-ws-3.4.2.jar (com.squareup.okhttp3:okhttp-ws:3.4.2)
  Duplicate class okhttp3.internal.ws.WebSocketReader$FrameCallback found in modules okhttp-3.14.1.jar (com.squareup.okhttp3:okhttp:3.14.1) and okhttp-ws-3.4.2.jar (com.squareup.okhttp3:okhttp-ws:3.4.2)
  Duplicate class okhttp3.internal.ws.WebSocketWriter found in modules okhttp-3.14.1.jar (com.squareup.okhttp3:okhttp:3.14.1) and okhttp-ws-3.4.2.jar (com.squareup.okhttp3:okhttp-ws:3.4.2)
  Duplicate class okhttp3.internal.ws.WebSocketWriter$FrameSink found in modules okhttp-3.14.1.jar (com.squareup.okhttp3:okhttp:3.14.1) and okhttp-ws-3.4.2.jar (com.squareup.okhttp3:okhttp-ws:3.4.2)
 

Итак, я исключил okhttp из app/build.gradle

 dependencies {
    implementation fileTree(dir: "libs", include: ["*.jar"])
    
    implementation "com.facebook.react:react-native: "  // From node_modules

    implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.0.0"

    // compile the ws module
    implementation('com.squareup.okhttp3:okhttp-ws: '){
        // exclude the conflicting module
        exclude group:'com.squareup.okhttp3', module:'okhttp'
    }

    debugImplementation("com.facebook.flipper:flipper:${FLIPPER_VERSION}") {
        exclude group:'com.facebook.fbjni'
    }

    debugImplementation("com.facebook.flipper:flipper-network-plugin:${FLIPPER_VERSION}") {
        exclude group:'com.facebook.flipper'
        // interestingly, it's been excluded here too
        exclude group:'com.squareup.okhttp3', module:'okhttp'
    }

    debugImplementation("com.facebook.flipper:flipper-fresco-plugin:${FLIPPER_VERSION}") {
        exclude group:'com.facebook.flipper'
    }

    if (enableHermes) {
        def hermesPath = "../../node_modules/hermes-engine/android/";
        debugImplementation files(hermesPath   "hermes-debug.aar")
        releaseImplementation files(hermesPath   "hermes-release.aar")
    } else {
        implementation jscFlavor
    }
}
 

Тем не менее, я получаю ту же ошибку. Итак, я посетил ссылку на документы разработчика, которую показывает ошибка, и попытался выполнить поиск класса okhttp3.internal.ws.RealWebSocket в Android Studio. Но он показывает только некоторые файлы из папки кэша, содержащие проблемный класс, оба из okhttp и ws модули, из-за которых я не могу удалить эти файлы. Для других классов он просто показывает файлы okhttp только из модуля, которые я тоже не могу удалить. Есть ли обходной путь для этого? Чего мне не хватает?

Комментарии:

1. Я бы посоветовал использовать точные версии, а не , пока вы разбираетесь с этим. Вы не можете смешивать версии, поэтому следует использовать согласованную версию okhttp по всем направлениям. 3.14.1 больше не поддерживается активно, поэтому рассмотрите вариант 3.12.12 (устаревший java impl) или 4.9.0 (поддерживается последняя версия).

Ответ №1:

WebSocket теперь является частью основной библиотеки. https://square.github.io/okhttp/4.x/okhttp/okhttp3/-web-socket /

Поэтому вам следует обновиться до 4.9.0 и перестать зависеть от okhttp-ws или вернуться к версии 3.12.12 (которая является поддерживаемой устаревшей веткой).

Здесь приведен пример того, как использовать поддержку WebSocket в OkHttp https://github.com/square/okhttp/blob/master/samples/slack/src/main/java/okhttp3/slack/SlackApi.java

Или используйте встроенную поддержку react-native https://reactnative.dev/docs/network

Комментарии:

1. Спасибо. Я уже решил это. Но не могли бы вы указать мне на какую-то суть или что-то в этом роде с рабочим кодом для Android TrustManager[] , реализованным для websockets, желательно для легкой адаптации и использования с React Native?

2. добавлено к моему ответу выше, вы можете адаптировать вызовы API, показанные выше, к вашим требованиям. Но поскольку react-native поддерживает websocket, вам это может вообще не понадобиться.

3. Но React Native изначально не поддерживает соединения SSL / TLS websocket на основе сертификатов, верно? Я имею в виду wss соединения?

4. github.com/facebook/react-native/blob/…