VerifyError:验证者使用Gradle插件3.2.0 + Proguard拒绝了日志com.google.firebase.FirebaseApp类

pan*_*dre 1 crash android verifyerror firebase android-proguard

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

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

一切正常,直到上周我们升级到gradle plugin 3.2.0。

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

-assumenosideeffects class android.util.Log { *; }
Run Code Online (Sandbox Code Playgroud)

在运行应用程序时,我们得到:

java.lang.VerifyError:验证程序拒绝类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)无法验证:无效com.google.firebase.FirebaseApp。(android.content.Context,java.lang.String,com.google.firebase.b):[0x3C]寄存器v8的类型为未初始化参考:com.google .firebase.internal.a分配PC:58,但预期参考:com.google.firebase.FirebaseApp $ a 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]寄存器v1具有未初始化的引用类型:com。 google.firebase.FirebaseApp $ 1分配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)的先前版本中那样。

有谁知道这可能是什么原因?

小智 7

似乎proguard -assumenosideeffects和Log。

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

就像是:

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

而不是通常的

-assumenosideeffects class android.util.Log {*;}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助。

  • 好,找到问题了。问题出在其他“假定副作用”规则中,尤其是在“ *** <init>(...);”规则中。删除此行后,一切正常。 (2认同)