【问题标题】:build failing on play-services:11.8.x with pro guard parser error在 play-services:11.8.x 上构建失败,带有 pro Guard 解析器错误
【发布时间】:2018-06-02 06:14:24
【问题描述】:

所以看起来要部署的最新播放服务中存在错误。 有谁知道如何解决这个问题?

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>;
}

【问题讨论】:

标签: android google-play-services android-proguard


【解决方案1】:

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

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

【讨论】:

  • 在得到一些验证之前,我不会将此答案标记为正确答案。
  • 如果为调试版本启用了 proguard,如果日志被混淆了,我应该如何读取它们?
  • @ThomasVos 我不确定你的意思,我在阅读它们时没有任何问题。我通常会启用自己的 minify,因为它太容易让你的 dev 和 prod 构建不匹配的状态。
  • 更新到最新的构建工具并更新我的库依赖项后,这对我有用。
  • @BrillPappin 我觉得有必要飞到加拿大给你买啤酒……这个问题困扰了我一个月。谢谢!
【解决方案2】:

除了上述解决方案(有效):该问题似乎也与 Instant Run 有关。 如果您禁用 Instant Run,您可以在不更改 build.gradle 的情况下构建您的应用程序。 可能只有在为 Instant Run 构建时才会更改默认收缩器。

【讨论】:

  • 有趣的观察。我找不到有关更改的参考,但这可以解释原因。
  • 禁用 Instant Run 为我解决了这个问题。
【解决方案3】:

这个解决方案帮助了我:

首先,在 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

所以,缩小是可行的,但代码不会混淆。

【讨论】:

  • 强制代码不混淆通常是一种不好的做法。如果有人为您的项目获得了 .apk,他们将能够从本质上将其反编译为其源代码。
  • @LukeWaggoner 课程,但是对于 qa/debug 构建,我们不能混淆代码以增加构建时间。主要问题和答案与此无关。
  • 如果您想这样做,只需在您的 buildType 中将 minifyEnabled 设置为 false
  • @LukeWaggoner 错误版本,因为 qa 版本与发布版本有很大不同。例如,我们的 QA 测试人员要求团队使用与发布相同的 apk。我们的争论没有意义,因为问题是关于别的事情。我的解决方案适用于上面描述的一些问题。您对原始问题的评论不适用。每个人都知道混淆,但有时您需要不这样做。
  • 如果您在 proguard 中设置了 -dontobfuscate,那么您的 QA 人员将已经在测试一个非常不同的版本。我在缩小中遇到的几乎所有问题都与混淆有关。我认为没有理由在您的代码中设置 -dontobfuscate 。尤其是解决问题。当你需要释放的时候你会怎么做?让它不被混淆和易受攻击吗?
【解决方案4】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-26
    • 1970-01-01
    • 1970-01-01
    • 2020-02-18
    • 2018-11-20
    • 1970-01-01
    相关资源
    最近更新 更多