Android 在播放服务上生成失败:11.8.x,带有pro guard解析器错误

Android 在播放服务上生成失败:11.8.x,带有pro guard解析器错误,android,google-play-services,android-proguard,Android,Google Play Services,Android Proguard,因此,在即将部署的最新play服务中似乎存在一个bug。 有人知道如何解决这个问题吗 FAILURE: Build failed with an exception. * What went wrong: Execution failed for task ':myappname:transformClassesWithAndroidGradleClassShrinkerForDevelopmentDebug'. > ProGuard configuration parser error

因此,在即将部署的最新play服务中似乎存在一个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>'
失败:生成失败,出现异常。
*出了什么问题:
任务“:myappname:transformClassesWithAndroidGradleClassShrinkerForDevelopmentDebug”的执行失败。
>ProGuard配置解析器错误:/Users/myusername/.gradle/caches/transforms-1/files-1.1/play-services-base-11.8.0.aar/d2ad9e16677fda9cf07a1280a66e91ca/ProGuard.txt行3:88输入“”处没有可行的替代方案
更多信息。问题似乎出在核心模块中:

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>'
错误:任务的执行失败:myappname:transformClassesWithAndroidGradleClassShrinkerForDevelopmentDebug'。
>ProGuard配置解析器错误:/Users/myusername/.gradle/caches/transforms-1/files-1.1/play-services-base-11.8.0.aar/d2ad9e16677fda9cf07a1280a66e91ca/ProGuard.txt行3:88输入“”处没有可行的替代方案
编辑: 导致该错误的文件的内容是:

# 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>;
}
#b/35135904确保proguard不会剥离mResultGuardian。
-keepclassmembers类com.google.android.gms.common.api.internal.basependingreult{
com.google.android.gms.common.api.internal.basependingreult.ReleasableResultGuardian;
}

默认收缩器似乎已更改。添加配置以打开ProGuard似乎是可行的

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

除了上述解决方案(有效):问题似乎也与即时运行有关。 如果禁用Instant Run,则无需更改build.gradle即可构建应用程序。
很可能,默认收缩器只有在为即时运行构建时才更改。

我注意到,如果禁用即时运行,构建仍然会失败,并出现相同的错误(如果启用了minify,但禁用了Proguard以收缩代码以避免调试构建中的多索引)。如果您按照答案进行操作,则必须启用即时运行(并根据提示安装库),以便在调试时命中任何断点。

似乎只有在使用即时运行和Google Play Play服务时,才能启用now中所述的收缩器。

此解决方案帮助了我:

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

因此,minify可以工作,但代码不会混淆。

在得到一些验证之前,我不会将此答案标记为正确答案。如果proguard启用了调试版本,那么如果日志混淆,我应该如何读取日志?@ThomasVos我不确定你的意思,我在读取它们时没有任何问题。我通常会自己启用minify,因为它太容易使事情进入一种状态,即您的开发版本和产品版本不匹配。在更新到最新的构建工具并更新我的库依赖项后,这对我很有效。@BrillPappin我觉得有必要飞到加拿大给您买一杯啤酒。。。这个问题困扰了我一个月。谢谢有趣的观察。我找不到更改的引用,但这可能解释了原因。禁用Instant Run为我解决了这个问题。我已经向google提交了一个问题,使用它强迫代码不混淆通常是一种不好的做法。如果有人为您的项目获得了.apk,他们基本上可以将其反编译为源代码。@LukeWaggoner当然,但对于qa/debug构建,我们不能混淆代码以增加构建时间。主要的问题和答案与此无关。如果您想这样做,只需在buildType中将
minifyEnabled
设置为
false
。@温热锅版本不好,因为qa版本与发布版本会大不相同。例如,我们的qa测试人员要求团队提供与发布相同的apk。我们的争论毫无意义,因为这个问题是关于其他事情的。我的解决方案适用于上述一些问题。你对原问题的评论不适用。每个人都知道模糊处理,但有时你需要做其他事情。如果你在proguard中设置了-dontobfuscate,你的QA人员将已经在测试一个非常不同的版本。我在缩小过程中遇到的几乎所有问题都与模糊处理有关。我看不出有任何理由在代码中设置-dontobfuscate。特别是为了解决一个问题。当你需要释放时,你会怎么做?让它保持不被混淆和脆弱?