更新至Google Play服务11.8.0后,Proguard不起作用。

15

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

下面是错误信息:

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

我正在使用 Android Studio 3.0.1 和 Gradle 4.4.1

我的app 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"

尝试清理重新构建项目。 - Aditya
1
请在此处发布您的 build.gradle 文件。 - Anand Jain
海森堡我试过了,没有帮助。@AnandJain,我刚刚更新了我的问题,请查看。 - PiotrWpl
可能是重复的问题,参考链接:https://dev59.com/alYN5IYBdhLWcg3wJFT8#47894812 - ReyAnthonyRenacia
@noogui 我不这么认为,因为我有一个不同的错误信息,他们的解决方案对我没有用。但还是谢谢你的尝试! - PiotrWpl
2个回答

17

你不需要完全关闭优化,只需要针对问题类进行优化。我曾经遇到过同样的问题,通过在proguard-rules.pro文件中添加以下内容来解决:


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

这对我来说已经足够编译项目了。我不需要使用proguard-android.txt而不是proguard-android-optimize.txt,也不需要在build.gradle中添加额外的行,如debuggable false和useProguard true。 - PiotrWpl
就像@PiotrWpl所说的那样:没有必要从优化Proguard设置切换回来,只需在设置中添加内部GMS类的keep即可。 - racs

2

我有一个类似的问题。正如这个SO线程中建议的那样,你只需要在你的build.gradle文件中添加这些行:

...
release {
   debuggable false
   useProguard true
   ...
}
...

我还需要通过替换以下内容来删除ProGuard优化:

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' signingConfig signingConfigs.release } - Noel Chew
1
虽然这样做可以解决问题,但是你的二进制文件不会被Proguard优化。 - racs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接