【问题标题】:VerifyError: Verifier rejected class com.google.firebase.FirebaseApp using Gradle Plugin 3.2.0 + Proguard to strip logs验证错误:验证程序拒绝使用 Gradle 插件 3.2.0 + Proguard 删除日志的类 com.google.firebase.FirebaseApp
【发布时间】:2019-03-06 12:54:56
【问题描述】:

在我们的项目中我们一直使用成功:

  • Firebase(用于 FCM)
  • Crashlytics(用于报告崩溃)
  • Proguard(优化版)

直到上周我们升级到gradle plugin 3.2.0时一切都很好。

在这个版本中,如果我们有以下 proguard 配置来删除对 Log 的调用:

-assumenosideeffects class android.util.Log { *; }

运行应用时,我们得到:

java.lang.VerifyError: Verifier denied class com.google.firebase.FirebaseApp: void com.google.firebase.FirebaseApp.() 验证失败: void com.google.firebase.FirebaseApp.(): [0x37]寄存器 v0 具有未初始化类型参考:java.lang.Object 分配 PC:53 但预期参考:java.lang.Object void com.google.firebase.FirebaseApp.(android.content.Context, java.lang.String, com.google.firebase.b) 验证失败:void com.google.firebase.FirebaseApp.(android.content.Context, java.lang.String, com.google.firebase.b): [0x3C] register v8 has type Uninitialized Reference: com.google.firebase.internal.a Allocation PC: 58 but expected Reference: com.google.firebase.FirebaseApp$一种 com.google.firebase.FirebaseApp com.google.firebase.FirebaseApp.a(android.content.Context, com.google.firebase.b, java.lang.String) 验证失败:com.google.firebase.FirebaseApp com. google.firebase.FirebaseApp.a(android.content.Context, com.google.firebase.b, java.lang.String): [0x17] register v1 has type Uninitialized Reference: com.google.firebase.FirebaseApp$1 Allocation PC: 21 但预期参考:com.google.android.gms.common.api.internal.a$a('com.google.firebase.FirebaseApp' 的声明出现在 /data/app/com.example.app-2/base .apk)`

如果我们删除该配置以剥离对 Log 的调用,一切都很好,就像之前版本的 gradle 插件 (3.1.4) 一样。

有人知道是什么原因造成的吗?

【问题讨论】:

  • 这里有同样的问题,而且每次都发生在不同的地方。这个等级的插件版本根本不稳定......如果我使用proguard优化规则会出现问题,但如果使用简单规则则不会。暂时恢复到 3.1.4 版
  • @don11995 检查 Aybareon 提供的解决方案,它对我有用

标签: android firebase crash android-proguard verifyerror


【解决方案1】:

proguard -assumenosideeffectsLog 似乎有问题。

尝试仅在您使用的方法以及依赖于这些 Log 方法的任何方法上使用 -assumenosideffects

类似:

-assumenosideeffects class android.util.Log {
    public static *** v(...);
    public static *** d(...);
    public static *** i(...);
    public static *** w(...);
    public static *** e(...);
}

而不是通常的

-assumenosideeffects class android.util.Log {*;}

希望这会有所帮助。

【讨论】:

  • 这对我不起作用。我已经有了上面提到的规则。
  • 好的,找到问题了。问题出在其他 assumenosideeffects 规则中,特别是在 *** <init>(...); 规则中。删除此行后,一切正常。
猜你喜欢
  • 1970-01-01
  • 2017-06-11
  • 1970-01-01
  • 1970-01-01
  • 2013-01-21
  • 2018-03-06
  • 2016-05-22
  • 1970-01-01
  • 2018-07-25
相关资源
最近更新 更多