java.lang.VerifyError:验证程序拒绝类-验证失败
我正在使用java.lang.VerifyError:验证程序拒绝类-验证失败,java,android,protocol-buffers,grpc,grpc-java,Java,Android,Protocol Buffers,Grpc,Grpc Java,我正在使用protobuf在技术上在我的android客户端自动生成API服务。我已经好几个月没出问题了。现在,AndroidRuntime验证器突然拒绝了我API中自动生成的方法之一 这是stacktrace: com.company.companyplayer E/AndroidRuntime: FATAL EXCEPTION: main Process: com.company.companyplayer,
protobuf
在技术上在我的android客户端自动生成API服务。我已经好几个月没出问题了。现在,AndroidRuntime验证器突然拒绝了我API中自动生成的方法之一
这是stacktrace:
com.company.companyplayer E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.company.companyplayer, PID: 18181
java.lang.VerifyError: Verifier rejected class company.v1.PlayerEarningsPageDataResponse: void company.v1.PlayerEarningsPageDataResponse.mergeNextDepositDate(com.google.protobuf.Timestamp) failed to verify: void company.v1.PlayerEarningsPageDataResponse.mergeNextDepositDate(com.google.protobuf.Timestamp): [0x26] register v5 has type Precise Reference: com.google.protobuf.Timestamp but expected Reference: com.google.protobuf.GeneratedMessageLiteVerifier rejected class company.v1.PlayerEarningsPageDataResponse: java.lang.Object company.v1.PlayerEarningsPageDataResponse.dynamicMethod(com.google.protobuf.GeneratedMessageLite$MethodToInvoke, java.lang.Object, java.lang.Object) failed to verify: java.lang.Object company.v1.PlayerEarningsPageDataResponse.dynamicMethod(com.google.protobuf.GeneratedMessageLite$MethodToInvoke, java.lang.Object, java.lang.Object): [0x16E] register v8 has type Precise Reference: com.google.protobuf.Timestamp but expected Reference: com.google.protobuf.GeneratedMessageLite (declaration of 'company.v1.PlayerEarningsPageDataResponse' appears in /data/app/com.company.companyplayer-1/split_lib_slice_4_apk.apk)
at company.v1.PlayerEarningsPageDataResponse.getDefaultInstance(PlayerEarningsPageDataResponse.java:0)
at company.v1.APIGrpc.<clinit>(APIGrpc.java:47)
at company.v1.APIGrpc.newStub(APIGrpc.java:0)
at com.company.companyplayer.backend.Client.getAuthAsyncStub(Client.java:103)
at com.company.companyplayer.backend.Client.playerLogin(Client.java:119)
at com.company.companyplayer.ui.activity.LoginActivity.loginAndGoToMainActivity(LoginActivity.java:202)
at com.company.companyplayer.ui.activity.LoginActivity.onActivityResult(LoginActivity.java:127)
at android.app.Activity.dispatchActivityResult(Activity.java:6935)
at android.app.ActivityThread.deliverResults(ActivityThread.java:4086)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:4133)
at android.app.ActivityThread.-wrap20(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1534)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6121)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:889)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:779)
private void mergeNextDepositDate(com.google.protobuf.Timestamp value) {
if (nextDepositDate_ != null && nextDepositDate_ != com.google.protobuf.Timestamp.getDefaultInstance()) {
nextDepositDate_ = com.google.protobuf.Timestamp.newBuilder(nextDepositDate_).mergeFrom(value).buildPartial();
} else {
nextDepositDate_ = value;
}
}
可以看出,该方法既不冗长,也不需要太多的参数;有些已经说过的事情可能是导致这一错误的常见原因
以下是我的应用程序的build.gradle:(自上次所有这些都正常运行以来,gradle中没有任何更改)
更新:该错误肯定与
google.protobuf.Timestamp
有关。下面是重现此问题的示例。您正在混合lite和full protobuf
您不能对googleapis common protos
具有编译或运行时依赖关系,因为它是为完整protobuf生成的代码,而完整protobuf不适用于lite protobuf。它还带来了对protobufjava
的依赖,当与protobuflite
混合时,将导致重复的类。不要编译依赖项,而是使用protobuf依赖项让protobuf gradle插件从JAR中包含的.proto
s生成代码
您目前也不依赖于protobuf-lite
,因此如果没有公共protos依赖项,您将获得编译失败。通用protos还引入了所需的grpc protobuf lite
依赖项。我建议在io.grpc:grpc-protobuf-lite:1.3.0
上添加编译时依赖项,这也将引入protobuf-lite
因此,简而言之,对项目进行这些更改,它将编译:
diff --git a/app/build.gradle b/app/build.gradle
index 8f606bb..2fb997b 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -62,7 +62,8 @@ dependencies {
compile 'javax.annotation:javax.annotation-api:1.2'
compile 'io.grpc:grpc-stub:1.3.0'
compile 'io.grpc:grpc-okhttp:1.3.0'
+ compile 'io.grpc:grpc-protobuf-lite:1.3.0'
- compile 'com.google.api.grpc:googleapis-common-protos:0.0.3'
+ protobuf 'com.google.api.grpc:googleapis-common-protos:0.0.3'
protobuf 'com.google.protobuf:protobuf-java:3.1.0'
}
您是否可能意外地将完整protobuf作为依赖项?我想你应该使用protobuf lite。运行
/gradlew dependencies
,确保您只有com.google.protobuf:protobuf lite依赖项,而不是com.google.protobuf:protobuf-java@EricAnderson在我的gradle中有许多与protobuf相关的条目,其中大多数是“lite”。因为我不确定你说的是哪一个,所以我将我的build.gradle添加到上面的问题中。
diff --git a/app/build.gradle b/app/build.gradle
index 8f606bb..2fb997b 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -62,7 +62,8 @@ dependencies {
compile 'javax.annotation:javax.annotation-api:1.2'
compile 'io.grpc:grpc-stub:1.3.0'
compile 'io.grpc:grpc-okhttp:1.3.0'
+ compile 'io.grpc:grpc-protobuf-lite:1.3.0'
- compile 'com.google.api.grpc:googleapis-common-protos:0.0.3'
+ protobuf 'com.google.api.grpc:googleapis-common-protos:0.0.3'
protobuf 'com.google.protobuf:protobuf-java:3.1.0'
}