9

将我的应用程序迁移到 Android Studio 3.2 上的 AndroidX 库。在调试中运行时,一切都按预期工作,但如果我生成一个签名的 APK,使用 Proguard 进行混淆 - 我收到此错误:

java.lang.VerifyError: Verifier rejected class d.a: androidx.preference.Preference d.a.a(androidx.fragment.app.k, int)
failed to verify: androidx.preference.Preference d.a.a(androidx.fragment.app.k, int): [0x8] ‘this’ argument ‘Reference:
androidx.fragment.app.k’ not instance of ‘Reference: 
androidx.preference.B’ (declaration of ‘d.a’ appears in base.apk)

我尝试排除所有 AndroidX 库:

-dontwarn androidx.**
-keep class androidx.** { *; }
-keep interface androidx.** { *; }

但是问题仍然存在,除非我基本上使用取消混淆

-keep class com.myapp.package.** { *; }

还尝试查看映射文件的类d.a是什么,但它并没有提示我问题的方向。

喷射器已启用

android.useAndroidX=true
android.enableJetifier=true

我在这里错过了什么吗?有没有可能这是 android.preference 库的问题?

4

2 回答 2

1

解决了。

添加android.enableR8=false到您的project gradle.properties文件中,一切都会按预期工作。

请注意,这不是臭名昭著的 d8 错误。R8 是一个新的代码压缩和混淆工具,它取代了 ProGuard,它在 Android Studio 3.2 canary 上默认启用。

选项 #2:(这是由Google提供的)

如果您想使用 R8 收缩器,请build.gradle像这样编辑您的项目:(注意 r8 类路径必须位于构建工具类路径之上)

buildscript {
     repositories {
        jcenter()
        google()

        maven {
            url "http://storage.googleapis.com/r8-releases/raw/master"
        }
    }
    dependencies {
        classpath 'com.android.tools:r8:ff9c89416cc1c8adf83d481a1e5fd515fcb893b9'
        classpath 'com.android.tools.build:gradle:3.3.0-alpha08'
    }
}
于 2018-09-05T13:34:59.970 回答
0

java类在编译时和运行时不一致java.lang.VerifyError可能会导致,Try File -> Invalidate Caches / Restart... -> Invalidate and Restart

于 2018-08-27T09:32:53.220 回答