更新到 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"
【问题讨论】:
尝试clean和re-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 服务库更新和缺少符号 @integer/google_play_services_version