DialogFlow Android SDK需要grpc okhttp,但添加它会导致Socket IO客户端崩溃 环境详情
DialogFlow Android SDK v2.1.0出现问题 复制步骤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。所以,我添加了它,这
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