更新到 Google Play 服务 11.8.0 后 Proguard 无法正常工作

Posted

技术标签:

【中文标题】更新到 Google Play 服务 11.8.0 后 Proguard 无法正常工作【英文标题】:Proguard not working after update to Google Play Services 11.8.0 【发布时间】:2018-06-12 01:11:50 【问题描述】:

将 Google Play 服务更新到 11.8.0(从 11.6.2 开始)后,我的构建停止工作。

这是我得到的:

计算堆栈大小时出现意外错误: 类 = [com/google/android/gms/internal/zzao] 方法 = [zzf(Ljava/lang/String;)J] 异常 = [java.lang.IllegalArgumentException](在 [com/google/android/gms/internal/zzao.zzf(Ljava/lang/String;)J] 中的指令 [23] invokestatic #146 后堆栈大小变为负数) FAILURE:构建失败并出现异常。

我正在使用带有 Gradle 4.4.1 的 Android Studio 3.0.1

我的应用 build.gradle 文件

buildscript 
    repositories 
        maven  url "https://maven.fabric.io/public" 
    

    dependencies 
        classpath "io.fabric.tools:gradle:1.25.1"
    


repositories 
    maven  url "https://maven.fabric.io/public" 


apply plugin: "com.android.application"
apply plugin: "io.fabric"
apply plugin: "let"
apply plugin: "realm-android"

android 
    compileSdkVersion project.androidSDKVersion
    buildToolsVersion("$androidBuildToolsVersion")

    defaultConfig 
        versionCode project.versionCode
        versionName project.versionName

        minSdkVersion project.androidMinSdkVersion
        targetSdkVersion project.androidTargetSdkVersion

        vectorDrawables.useSupportLibrary = true
        resConfigs "pl"
    

    buildTypes 
        release 
            minifyEnabled true
            shrinkResources false
            crunchPngs false
            proguardFiles getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro", "proguard-fresco.pro"
            signingConfig signingConfigs.release
        
        debug 
            ext.enableCrashlytics = false
            ext.alwaysUpdateBuildId = false
        
    

    flavorDimensions "tier", "minApi"

    productFlavors 
        minApi21 
            minSdkVersion project.androidMinDevSdkVersion
            dimension "minApi"
        

        minApi16 
            minSdkVersion project.androidMinSdkVersion
            dimension "minApi"
        

        dev 
            multiDexEnabled true
            dimension "tier"
        

        prod 
            multiDexEnabled false
            dimension "tier"
        
    

    variantFilter  variant ->
        def names = variant.flavors*.name

        if (names.contains("prod") && names.contains("minApi21")) 
            setIgnore(true)
        
    

    applicationVariants.all  variant ->
        appendVersionNameVersionCode(variant, defaultConfig)
    

    lintOptions 
        checkReleaseBuilds false
        textReport true
        textOutput "stdout"
        fatal "UnusedResources"
    

    compileOptions 
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    


dependencies 
    debugImplementation("com.android.support:multidex:$multidexVersion")

    implementation("com.android.support:support-fragment:$androidSupportVersion")
    implementation("com.android.support:support-annotations:$androidSupportVersion")
    implementation("com.android.support:appcompat-v7:$androidSupportVersion")
    implementation("com.android.support:design:$androidSupportVersion")
    implementation("com.android.support:recyclerview-v7:$androidSupportVersion")
    implementation("com.android.support:cardview-v7:$androidSupportVersion")
    implementation("com.android.support:customtabs:$androidSupportVersion")
    implementation("com.android.support.constraint:constraint-layout:$constraintLayoutVersion")
    implementation("com.android.installreferrer:installreferrer:$installReferrerVersion")

    implementation("com.google.android.gms:play-services-analytics:$playServicesVersion")
    implementation("com.google.android.gms:play-services-location:$playServicesVersion")
    implementation("com.google.android.gms:play-services-ads:$playServicesVersion")
    implementation("com.google.android.gms:play-services-auth:$playServicesVersion")

    implementation("com.google.firebase:firebase-core:$playServicesVersion")
    implementation("com.google.firebase:firebase-messaging:$playServicesVersion")
    implementation("com.google.firebase:firebase-config:$playServicesVersion")
    implementation("com.google.firebase:firebase-auth:$playServicesVersion")
    implementation("com.google.firebase:firebase-invites:$playServicesVersion")

    (...) // I had removed other dependencies from the list


def appendVersionNameVersionCode(variant, defaultConfig) 
    variant.outputs.all  output ->

        def versionCode = android.defaultConfig.versionCode

        output.versionCodeOverride = versionCode
        outputFileName = "$rootProject.name-$variant.name-$variant.versionName-$versionCode.apk"
    


apply plugin: "com.google.gms.google-services"

【问题讨论】:

尝试cleanre-build项目。 在此处发布您的 build.gradle。 Heisen-Berg 我试过了。没有帮助。 @AnandJain 我刚刚更新了我的问题,请检查。 ***.com/a/47894812 的可能重复项 @noogui 我不这么认为,因为我有不同的错误消息,他们的解决方案对我不起作用。但是感谢您的尝试! 【参考方案1】:

您不需要完全禁用优化,只需对问题类进行优化即可。我遇到了同样的问题,并通过在 proguard-rules.pro 文件中添加以下内容来解决它:

-keep class com.google.android.gms.internal.**  *; 

【讨论】:

这足以让我编译项目。我不需要使用 proguard-android.txt 而不是 proguard-android-optimize.txt 或 build.gradle 中的额外行,例如 debuggable false & useProguard true 就像@PiotrWpl 说的:不需要从优化Proguard设置切换回来,只需在设置中为内部GMS类添加keep即可。【参考方案2】:

我也有类似的问题。正如in this SO thread 建议的那样,您只需在build.gradle 文件中添加这些行:

...
release 
   debuggable false
   useProguard true
   ...

...

我还必须通过替换来删除 pro Guard 优化:

proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'

通过

proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

【讨论】:

我遇到了完全相同的问题。你的解决方案奏效了。我使用了这些配置: debug debuggable true minifyEnabled false useProguard false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' release debuggable false minifyEnabled true useProguard true proguardFiles getDefaultProguardFile('proguard-android.txt '), 'proguard-rules.pro' 签名配置 signingConfigs.release 这不是必需的,虽然它解决了问题,但你的二进制文件不会被 Proguard 优化。

以上是关于更新到 Google Play 服务 11.8.0 后 Proguard 无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

[[15.0.1,15.0.1]] 的各种其他库正在请求库 com.google.android.gms:play-services-basement,但解析为 11.8.0

Android Studio 2.3.3:即使使用 Maven 也无法解决:com.google.android.gms:play-services-ads:11.8.0

如何将 Google Play 服务更新到 9.8.7

Google Play 服务更新到版本 13 后,出现错误

Google Play 服务库更新和缺少符号 @integer/google_play_services_version

Google (Play) 睡眠模式下的位置服务更新间隔更改 (Android)