DialogFlow Android SDK需要grpc okhttp,但添加它会导致Socket IO客户端崩溃 环境详情

DialogFlow Android SDK需要grpc okhttp,但添加它会导致Socket IO客户端崩溃 环境详情,android,kotlin,socket.io,dialogflow-es,grpc,Android,Kotlin,Socket.io,Dialogflow Es,Grpc,DialogFlow Android SDK v2.1.0出现问题 复制步骤 我已经在我的Android应用程序中使用DialogFlow实现了聊天机器人。我使用gradle实现导入了DialogFlow sdk 我收到一个崩溃消息,说java.lang.NoSuchFieldError:在Lio/grpc/internal/GrpcUtil类中,没有类型为Z的静态字段 根据我在谷歌搜索中得到的搜索结果来解决这个问题,我不得不添加io.grpc:grpc-okhttpsdk。所以,我添加了它,这

DialogFlow Android SDK v2.1.0出现问题

复制步骤
  • 我已经在我的Android应用程序中使用DialogFlow实现了聊天机器人。我使用gradle实现导入了DialogFlow sdk
  • 我收到一个崩溃消息,说java.lang.NoSuchFieldError:在Lio/grpc/internal/GrpcUtil类中,没有类型为Z的静态字段
  • 根据我在谷歌搜索中得到的搜索结果来解决这个问题,我不得不添加io.grpc:grpc-okhttpsdk。所以,我添加了它,这个问题已经解决了,但还有一个问题
  • 我的Android应用程序项目也有Socket IO客户端。当我初始化socket客户端时,我得到一个崩溃消息,说没有名为nginegetconnection(Lcom/squareup/okhttp/Call;)的虚拟方法Lcom/squareup/okhttp/Connection;类内Lcom/squareup/okhttp/internal/internal
  • 如果我删除GRPCOKHTTP,那么套接字工作正常
  • 代码示例 如果您想测试它,此代码可以重现该问题

    套接字初始化

    val socket = IO.socket("URL_HERE")
    socket.connect()
    
    val stream = resources.openRawResource(R.raw.credentials)
    val credentials = GoogleCredentials.fromStream(stream)
    val projectId = (credentials as ServiceAccountCredentials).projectId
    
    val settingsBuilder = SessionsSettings.newBuilder()
    val sessionsSettings = settingsBuilder.setCredentialsProvider(FixedCredentialsProvider.create(credentials)).build()
    val sessionsClient = SessionsClient.create(sessionsSettings) //This line causes the crash
    val session = SessionName.of(projectId, UUID.randomUUID().toString())
    
    对话框流初始化

    val socket = IO.socket("URL_HERE")
    socket.connect()
    
    val stream = resources.openRawResource(R.raw.credentials)
    val credentials = GoogleCredentials.fromStream(stream)
    val projectId = (credentials as ServiceAccountCredentials).projectId
    
    val settingsBuilder = SessionsSettings.newBuilder()
    val sessionsSettings = settingsBuilder.setCredentialsProvider(FixedCredentialsProvider.create(credentials)).build()
    val sessionsClient = SessionsClient.create(sessionsSettings) //This line causes the crash
    val session = SessionName.of(projectId, UUID.randomUUID().toString())
    
    这是我的身材,格雷德尔

    apply plugin: 'com.android.application'
    apply plugin: 'kotlin-android'
    apply plugin: 'kotlin-android-extensions'
    apply plugin: 'com.google.gms.google-services'
    apply plugin: 'com.google.firebase.crashlytics'
    apply plugin: 'kotlin-kapt'
    apply plugin: 'dagger.hilt.android.plugin'
    
    android {
        compileSdkVersion 30
        buildToolsVersion "29.0.3"
    
        defaultConfig {
            applicationId "com.identiygroup.career"
            minSdkVersion 23
            targetSdkVersion 30
            versionCode 1
            versionName "1.0"
            multiDexEnabled true
            testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    
            buildConfigField("String", "googleApiKey", googleApiKey)
        }
    
        buildTypes {
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
            }
        }
        compileOptions {
            sourceCompatibility JavaVersion.VERSION_1_8
            targetCompatibility JavaVersion.VERSION_1_8
        }
        packagingOptions {
            exclude 'META-INF/DEPENDENCIES'
            exclude 'META-INF/LICENSE'
            exclude 'META-INF/LICENSE.txt'
            exclude 'META-INF/license.txt'
            exclude 'META-INF/NOTICE'
            exclude 'META-INF/NOTICE.txt'
            exclude 'META-INF/notice.txt'
            exclude 'META-INF/ASL2.0'
            exclude 'META-INF/INDEX.LIST'
            exclude("META-INF/*.kotlin_module")
        }
    }
    
    dependencies {
        implementation fileTree(dir: 'libs', include: ['*.jar'])
    
        implementation 'androidx.appcompat:appcompat:1.1.0'
        implementation 'com.google.android.material:material:1.1.0'
        implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
        implementation 'androidx.vectordrawable:vectordrawable:1.1.0'
        implementation 'androidx.navigation:navigation-fragment:2.3.0'
        implementation 'androidx.navigation:navigation-ui:2.3.0'
        implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'
    
        //firebase
        implementation 'com.google.firebase:firebase-auth:19.3.1'
        implementation 'com.google.firebase:firebase-core:17.4.3'
    
        //Crashlytics
        implementation 'com.google.firebase:firebase-crashlytics:17.1.0'
    
        //CarouselView
        implementation 'com.synnapps:carouselview:0.1.4'
    
        //exo-player
        implementation 'com.google.android.exoplayer:exoplayer:2.11.1'
    
        //PDF
        implementation 'com.github.barteksc:android-pdf-viewer:2.8.2'
        implementation files('../libs/YouTubeAndroidPlayerApi.jar')
    
        implementation 'com.google.firebase:firebase-firestore:21.4.3'
        testImplementation 'junit:junit:4.13'
        androidTestImplementation 'androidx.test.ext:junit:1.1.1'
        androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
        implementation "androidx.core:core-ktx:1.3.0"
        implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0"
        implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
        //Navigation drawer
        implementation 'com.mikepenz:materialdrawer:7.0.0'
    
        implementation 'com.github.bassaer:chatmessageview:2.0.1'
        implementation 'com.squareup.picasso:picasso:2.71828'
        implementation ('com.github.nkzawa:socket.io-client:0.6.0')
    
        //Dagger
        implementation 'com.google.dagger:hilt-android:2.28-alpha'
        kapt 'com.google.dagger:hilt-android-compiler:2.28-alpha'
        implementation 'androidx.hilt:hilt-lifecycle-viewmodel:1.0.0-alpha01'
        kapt 'androidx.hilt:hilt-compiler:1.0.0-alpha01'
    
        //Retrofit
        implementation ('com.squareup.retrofit2:retrofit:2.9.0')
        implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
        implementation 'com.squareup.okhttp3:logging-interceptor:4.7.2'
        implementation 'com.squareup.okhttp3:okhttp-urlconnection:4.7.2'
    
        //RecyclerView
        implementation 'androidx.recyclerview:recyclerview:1.1.0'
    
        // DialogFlow
        implementation ('com.google.cloud:google-cloud-dialogflow:2.1.0') {
            exclude group: "com.google.code.findbugs"
            exclude group: "javax.annotation"
        }
        implementation ('io.grpc:grpc-okhttp:1.29.0')
    }
    
    configurations.implementation.exclude(group: 'com.google.firebase', module: 'protolite-well-known-types')
    configurations.implementation.exclude(group: 'com.google.protobuf',module: 'protobuf-javalite')
    configurations.implementation.exclude(group: 'com.google.protobuf',module: 'protobuf-lite')
    configurations.implementation.exclude(group: 'com.google.code.findbugs', module: 'annotations')
    repositories {
        mavenCentral()
    }
    
    
    堆栈跟踪 当grpc加入时

    
    
    2020-07-01 22:59:15.216 6416-6668/com.identiygroup.career E/AndroidRuntime: FATAL EXCEPTION: OkHttp Dispatcher
        Process: com.identiygroup.career, PID: 6416
        java.lang.NoSuchMethodError: No virtual method callEngineGetConnection(Lcom/squareup/okhttp/Call;)Lcom/squareup/okhttp/Connection; in class Lcom/squareup/okhttp/internal/Internal; or its super classes (declaration of 'com.squareup.okhttp.internal.Internal' appears in /data/app/com.identiygroup.career-A85sKgM7VblLOhTeCZWZzQ==/base.apk!classes4.dex)
            at com.squareup.okhttp.ws.WebSocketCall.createWebSocket(WebSocketCall.java:154)
            at com.squareup.okhttp.ws.WebSocketCall.access$000(WebSocketCall.java:42)
            at com.squareup.okhttp.ws.WebSocketCall$1.onResponse(WebSocketCall.java:102)
            at com.squareup.okhttp.Call$AsyncCall.execute(Call.java:177)
            at com.squareup.okhttp.internal.NamedRunnable.run(NamedRunnable.java:33)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
            at java.lang.Thread.run(Thread.java:919)
    
    当grpc未添加时

    2020-07-01 23:03:03.749 7633-7633/com.identiygroup.career E/AndroidRuntime: FATAL EXCEPTION: main
        Process: com.identiygroup.career, PID: 7633
        java.lang.NoSuchFieldError: No static field IS_RESTRICTED_APPENGINE of type Z in class Lio/grpc/internal/GrpcUtil; or its superclasses (declaration of 'io.grpc.internal.GrpcUtil' appears in /data/app/com.identiygroup.career-iEEqTKViLiYphc8hCE-Q8w==/base.apk!classes5.dex)
            at io.grpc.okhttp.OkHttpChannelBuilder.createSslSocketFactory(OkHttpChannelBuilder.java:451)
            at io.grpc.okhttp.OkHttpChannelBuilder.buildTransportFactory(OkHttpChannelBuilder.java:418)
            at io.grpc.internal.AbstractManagedChannelImplBuilder.build(AbstractManagedChannelImplBuilder.java:513)
            at com.google.api.gax.grpc.InstantiatingGrpcChannelProvider.createSingleChannel(InstantiatingGrpcChannelProvider.java:314)
            at com.google.api.gax.grpc.InstantiatingGrpcChannelProvider.access$1600(InstantiatingGrpcChannelProvider.java:71)
            at com.google.api.gax.grpc.InstantiatingGrpcChannelProvider$1.createSingleChannel(InstantiatingGrpcChannelProvider.java:210)
            at com.google.api.gax.grpc.ChannelPool.create(ChannelPool.java:72)
            at com.google.api.gax.grpc.InstantiatingGrpcChannelProvider.createChannel(InstantiatingGrpcChannelProvider.java:217)
            at com.google.api.gax.grpc.InstantiatingGrpcChannelProvider.getTransportChannel(InstantiatingGrpcChannelProvider.java:200)
            at com.google.api.gax.rpc.ClientContext.create(ClientContext.java:156)
            at com.google.cloud.dialogflow.v2.stub.GrpcSessionsStub.create(GrpcSessionsStub.java:78)
            at com.google.cloud.dialogflow.v2.stub.SessionsStubSettings.createStub(SessionsStubSettings.java:108)
            at com.google.cloud.dialogflow.v2.SessionsClient.<init>(SessionsClient.java:132)
            at com.google.cloud.dialogflow.v2.SessionsClient.create(SessionsClient.java:114)
            at com.identiygroup.career.ChatActivity.onCreate(ChatActivity.kt:141)
            at android.app.Activity.performCreate(Activity.java:7826)
            at android.app.Activity.performCreate(Activity.java:7815)
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1318)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3355)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3519)
            at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
            at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
            at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2126)
            at android.os.Handler.dispatchMessage(Handler.java:107)
            at android.os.Looper.loop(Looper.java:219)
            at android.app.ActivityThread.main(ActivityThread.java:7709)
            at java.lang.reflect.Method.invoke(Native Method)
            at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:516)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950)
    
    
    2020-07-01 23:03:03.749 7633-7633/com.identiygroup.career E/AndroidRuntime:致命异常:main
    流程:com.identiygroup.career,PID:7633
    java.lang.NoSuchFieldError:Lio/grpc/internal/GrpcUtil类中没有限制类型为Z的静态字段;或其超类(声明'io.grpc.internal.GrpcUtil'出现在/data/app/com.identiygroup.career-iEEqTKViLiYphc8hCE-Q8w==/base.apk!classes5.dex中)
    位于io.grpc.okhttp.OkHttpChannelBuilder.createSslSocketFactory(OkHttpChannelBuilder.java:451)
    位于io.grpc.okhttp.OkHttpChannelBuilder.buildTransportFactory(OkHttpChannelBuilder.java:418)
    位于io.grpc.internal.AbstractManagedChannelImplBuilder.build(AbstractManagedChannelImplBuilder.java:513)
    位于com.google.api.gax.grpc.instantinggrpcchannelprovider.createSingleChannel(instantinggrpcchannelprovider.java:314)
    在com.google.api.gax.grpc.instantinggrpcchannelprovider.access$1600(instantinggrpcchannelprovider.java:71)
    位于com.google.api.gax.grpc.instantinggrpcchannelprovider$1.createSingleChannel(instantinggrpcchannelprovider.java:210)
    位于com.google.api.gax.grpc.ChannelPool.create(ChannelPool.java:72)
    位于com.google.api.gax.grpc.instantinggrpcchannelprovider.createChannel(instantinggrpcchannelprovider.java:217)
    位于com.google.api.gax.grpc.instantinggrpcchannelprovider.getTransportChannel(instantinggrpcchannelprovider.java:200)
    在com.google.api.gax.rpc.ClientContext.create(ClientContext.java:156)上
    位于com.google.cloud.dialogflow.v2.stub.grpcsessionstub.create(grpcsessionstub.java:78)
    位于com.google.cloud.dialogflow.v2.stub.sessionstubsettings.createStub(sessionstubsettings.java:108)
    位于com.google.cloud.dialogflow.v2.SessionClient.(sessionClient.java:132)
    在com.google.cloud.dialogflow.v2.sessionclient.create上(sessionclient.java:114)
    在com.identiygroup.career.ChatActivity.onCreate上(ChatActivity.kt:141)
    位于android.app.Activity.performCreate(Activity.java:7826)
    位于android.app.Activity.performCreate(Activity.java:7815)
    位于android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1318)
    在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3355)上
    位于android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3519)
    在android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
    在android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)中
    在android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)中
    在android.app.ActivityThread$H.handleMessage(ActivityThread.java:2126)上
    位于android.os.Handler.dispatchMessage(Handler.java:107)
    位于android.os.Looper.loop(Looper.java:219)
    位于android.app.ActivityThread.main(ActivityThread.java:7709)
    位于java.lang.reflect.Method.invoke(本机方法)
    位于com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:516)
    位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950)
    
    下面有其他信息吗
    简单地说,如果不添加grpc,对话框流将崩溃。如果grpc添加的套接字崩溃。

    升级到最新的SocketIO客户端。它将使用与gRPC不冲突的okhttp3 API。也可以考虑升级你的依赖关系,只要你遇到这样的问题。

    升级到最新的SoCKTiO客户端。它将使用与gRPC不冲突的okhttp3 API。此外,当你遇到这样的问题时,也要考虑升级你的依赖关系。

    < P>既有FixStand,也有GRPC OKHTTP,它覆盖了COM.SavaRuop.OkHTTP。所以我们需要从grpc和firestore中排除squareup okhttp,这样它们都不会覆盖squareup okhttp

    implementation ('io.grpc:grpc-okhttp:1.30.1') {
        exclude group: "com.squareup.okhttp"
    }
    
    implementation ('com.google.firebase:firebase-firestore:21.4.3') {
        exclude group: "com.squareup.okhttp"
    }
    

    Firestore和grpc okhttp都覆盖了com.squareup.okhttp。所以我们需要从grpc和firestore中排除squareup okhttp,这样它们都不会覆盖squareup okhttp

    implementation ('io.grpc:grpc-okhttp:1.30.1') {
        exclude group: "com.squareup.okhttp"
    }
    
    implementation ('com.google.firebase:firebase-firestore:21.4.3') {
        exclude group: "com.squareup.okhttp"
    }
    

    然而,我发现了问题所在。Dialogflow需要grpc okhttp。但是实现grpc会导致覆盖com.squareup.okhttp。因此,我排除了squareup ok类http实现(grpc okhttp){exclude group:“com.squareup.okhttp”},然后问题就解决了。后来,我不得不将firestore也包括在内。添加firestore后,崩溃再次发生。我怀疑firestore也在使用某种okhttp。我对Firestore也做了同样的事情。实现(firestore){exclude group:“com.squareup.okhttp”}现在一切正常。但是,我发现了问题所在。Dialogflow需要grpc okhttp。但是实现grpc会导致覆盖com.squareup.okhttp。所以,我像我一样建立了好的http