在 play-services:11.8.x 上构建失败,出现 pro guard 解析器错误

build failing on play-services:11.8.x with pro guard parser error

看来要部署的最新播放服务有bug。 有谁知道如何解决这个问题?

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':myappname:transformClassesWithAndroidGradleClassShrinkerForDevelopmentDebug'.
> ProGuard configuration parser error: /Users/myusername/.gradle/caches/transforms-1/files-1.1/play-services-base-11.8.0.aar/d2ad9e16677fda9cf07a1280a66e91ca/proguard.txt line 3:88 no viable alternative at input '<fields>'

更多信息。似乎问题出在核心模块中:

Error:Execution failed for task ':myappname:transformClassesWithAndroidGradleClassShrinkerForDevelopmentDebug'.
> ProGuard configuration parser error: /Users/myusername/.gradle/caches/transforms-1/files-1.1/play-services-base-11.8.0.aar/d2ad9e16677fda9cf07a1280a66e91ca/proguard.txt line 3:88 no viable alternative at input '<fields>'

编辑: 导致该错误的文件内容是:

# b/35135904 Ensure that proguard will not strip the mResultGuardian.
-keepclassmembers class com.google.android.gms.common.api.internal.BasePendingResult {
  com.google.android.gms.common.api.internal.BasePendingResult.ReleasableResultGuardian <fields>;
}

默认的收缩器似乎已经改变了。添加配置以打开 ProGuard 似乎有效。

buildTypes {
        release {
            debuggable false
            minifyEnabled true
            useProguard true
            ...
        }
        debug {
            debuggable true
            minifyEnabled true
            useProguard true
            ...
        }
    }

除了上述解决方案(有效)之外:该问题似乎也与 Instant 运行 有关。 如果您禁用 Instant 运行,您可以在不更改 build.gradle 的情况下构建您的应用程序。 可能只有在为 Instant 运行.

构建时,默认收缩器才发生变化

我注意到,如果您禁用 Instant 运行,构建仍然会失败并出现相同的错误(如果您启用了 minify 但禁用了 Proguard 以收缩代码以避免在调试构建中使用 multi-dex)。如果您遵循 答案,您必须启用 Instant 运行(并按提示安装库)以在调试时命中任何断点。
似乎启用 Google docs 中描述的收缩器现在仅在您将 Instant 运行 与 Google Play Play 服务一起使用时才有效。

这个解决方案帮助了我:

首先,在app/build.gradle中将useProguard改为'true'

其次,在 proguard 规则中添加行 '-dontobfuscate'

buildTypes {
    release {
        debuggable false
        minifyEnabled true
        useProguard true
        proguardFiles getDefaultProguardFile('proguard-android.txt'),
                'proguard-rules.pro'
        ...
    }
    debug {
        debuggable true
        minifyEnabled true
        useProguard true
        proguardFiles getDefaultProguardFile('proguard-android.txt'),
                'proguard-rules.pro'
        ...
    }
}

proguard-rules.pro

-dontobfuscate

因此,缩小会起作用,但代码不会混淆。