评估指令时出现 Proguard 错误

Posted

技术标签:

【中文标题】评估指令时出现 Proguard 错误【英文标题】:Proguard error while evaluating instruction 【发布时间】:2016-10-28 20:54:28 【问题描述】:

我将我的 android 项目升级到 24 SDK 版本。

但我在构建的 Proguard 路径中遇到错误:

Unexpected error while evaluating instruction:
  Class       = [com/google/android/gms/iid/zzd]
  Method      = [zzeC(Ljava/lang/String;)V]
  Instruction = [11] invokevirtual #50
  Exception   = [java.lang.ArrayIndexOutOfBoundsException] (1)
Unexpected error while performing partial evaluation:
  Class       = [com/google/android/gms/iid/zzd]
  Method      = [zzeC(Ljava/lang/String;)V]
  Exception   = [java.lang.ArrayIndexOutOfBoundsException] (1)
Warning: Exception while processing task java.io.IOException: java.lang.ArrayIndexOutOfBoundsException: 1
:PC:transformClassesAndResourcesWithProguardForDebug FAILED

FAILURE: Build failed with an exception.

我的 proguard.cfg 文件:

-printmapping /build/proguard-mapping.txt
-printusage /build/proguard-usage.txt
-printseeds /build/proguard-seeds.txt
-printconfiguration /build/proguard-configuration.txt

-optimizationpasses 5
-dontskipnonpubliclibraryclasses
-dontskipnonpubliclibraryclassmembers
#-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
-optimizations !class/unboxing/enum
-allowaccessmodification
-repackageclasses ''
-keepattributes Signature
-keepattributes SetjavascriptEnabled
-keepattributes JavascriptInterface
-keepattributes InlinedApi
-keepattributes SourceFile, LineNumberTable
-keepattributes *Annotation*

-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.preference.Preference

-libraryjars /libs

-dontwarn android.**
-dontwarn com.android.**
-dontwarn com.google.**
-dontwarn okio.**

-keep class com.google.** *;
-keepclassmembers class com.google.**  *; 

-keep class com.android.** *;
-keepclassmembers class com.android.**  *; 

-keep class okio.** *;
-keepclassmembers class okio.**  *; 

项目中的Build.gradle:

buildscript 
    repositories 
        jcenter()
    
    dependencies 
        classpath 'com.android.tools.build:gradle:2.1.2'
        classpath 'com.google.gms:google-services:3.0.0'
    

应用中的Build.gradle:

apply plugin: 'com.android.application'
apply plugin: 'com.google.gms.google-services'

buildscript 
    repositories 
        jcenter()
        mavenCentral()
    
    dependencies 
        classpath 'com.android.tools.build:gradle:2.1.2'
    


android 
    compileSdkVersion 24
    buildToolsVersion "24.0.0"

    defaultConfig 
        minSdkVersion 11
        targetSdkVersion 24
        signingConfig signingConfigs.release
    

    buildTypes 
        debug 
            debuggable true
            minifyEnabled true
            signingConfig signingConfigs.release
            proguardFile 'proguard.cfg'
        
        release 
            debuggable true
            minifyEnabled true
            signingConfig signingConfigs.release
            proguardFile 'proguard.cfg'
        
    


dependencies 
    compile fileTree(include: ['*.jar'], dir: 'libs')
    compile 'com.google.android.gms:play-services-gcm:9.0.0'
    compile 'com.android.support:support-v4:24.0.0'
    compile 'com.android.support:appcompat-v7:24.0.0'

此配置在 22 android SDK 上运行良好,但更新到 24 后出现错误。

我尝试添加下一个但不成功:

-keep class com.google.android.gms.analytics.**
-keep class com.google.analytics.tracking.**
-dontwarn com.google.android.gms.analytics.**
-dontwarn com.google.analytics.tracking.**

我的错误是什么?解决方法是什么?

【问题讨论】:

你为什么不用proguardFiles getDefaultProguardFile('proguard-android-optimize.txt') 我尝试过,但没有改变 您能否尝试保留以下类以使其未得到优化:-keep,allowshrinking class com.google.android.gms.iid.** *; @tome 不起作用 =( 【参考方案1】:

我最终得到了以下 proguard 选项:

# WORKAROUND for building project with GMS (google play services) 
-keep class com.google.android.gms.iid.zzd  *; 
-keep class android.support.v4.content.ContextCompat  *; 

【讨论】:

【参考方案2】:

这是由于 buildtools 使用 8.4 版本的 google play 服务造成的。我尝试使用 -keep 将特定类排除在优化之外,但它不起作用。我最终迁移到 google play services 9.0.2:

classpath 'com.android.tools.build:gradle:2.0.0'
classpath 'com.google.gms:google-services:3.0.0'

...

buildToolsVersion "24.0.0"

...

// google play services
compile ('com.google.android.gms:play-services-gcm:9.0.2')
compile ('com.google.android.gms:play-services-analytics:9.0.2')

...

【讨论】:

【参考方案3】:

尝试使用 9.2.1 版本;看来他们已经解决了一个proguard问题。基于发行说明。

参考链接:https://developers.google.com/android/guides/releases

【讨论】:

【参考方案4】:

如果你还不想影响播放服务只是,你也可以在 ProGuard 中关闭以下优化,例如

-optimizations !method/marking/private,!method/marking/static,!method/removal/parameter,!method/propagation/parameter

显然,这可能意味着性能下降,因此请谨慎使用。

【讨论】:

【参考方案5】:

尝试使用 9.2.1 版本;看来他们已经解决了一个proguard问题。基于发行说明。

参考链接:https://developers.google.com/android/guides/releases

【讨论】:

以上是关于评估指令时出现 Proguard 错误的主要内容,如果未能解决你的问题,请参考以下文章

启用 proguard 时出现杰克逊错误(缩小)

签署 Android 应用程序时出现错误 Proguard

为 OnClickListener 使用 Proguard 时出现 NoSuchMethodError 错误

尝试在 ProGuard 中启用缩小时出现 DexGuard 错误

在 Gradle Proguard 优化时出现大量内存错误

Proguard 错误:“处理任务 java.io.IOException 时出现异常:请先更正上述警告”