Android构建错误:属性签名需要InnerClasses属性。检查-keepattributes指令

时间:2018-09-10 07:15:49

标签: android android-gradle android-proguard

尝试在发布模式下构建应用程序时遇到此错误。

  

错误:属性签名需要InnerClasses属性。检查-keepattributes指令

我的proguard-rules.pro行如下所示:

-keepattributes Signature

编译器指的是什么InnerClasses?我要省略什么?

2 个答案:

答案 0 :(得分:7)

签名(Java 8或更高版本)仅适用于Java 8或更高版本以及InnerClasses(Java 5或更高版本),因此请检查您的Android Studio是否使用Java SDK版本。 请使用以下设置更新您的Proguard配置

将此行添加到您的proguard-rules.pro文件中:

-keepattributes InnerClasses
  

InnerClasses(Java 5或更高版本)

     

指定一个类及其内部类之间的关系,以及   外层阶级。除此之外,以及带有“ $”的命名约定   内部类和外部类名称之间的分隔符,内部   类就像普通的类。编译器可能需要这个   查找在编译库中引用的类的信息。代码可能   通过反射访问此信息,例如得出   类的简单名称。

     

签名(Java 8或更高版本)

     

指定类,字段或方法的通用签名。   编译器可能需要此信息来正确编译   使用编译库中的泛型类型。代码可以访问此   通过反射签名。

有关-keepattributes的更多详细信息以及您可以应用的更多设置,请参见下面的链接。

Proguard options

答案 1 :(得分:0)

Ref:https://stuff.mit.edu/afs/sipb/project/android/sdk/android-sdk-linux/tools/proguard/docs/index.html#manual/usage.html

  

保持对[attribute_filter]的贡献

     

指定要保留的所有可选属性。该属性可以   用一个或多个-keepattributes指令指定。可选的   filter是以逗号分隔的属性名称列表。属性名称   可以包含?,*和**通配符,并且可以在!之前加上通配符!   否定者。典型的可选属性是“异常”,“签名”,   不推荐使用,SourceFile,SourceDir,LineNumberTable,   LocalVariableTable,LocalVariableTypeTable,Synthetic,   EnclosingMethod,RuntimeVisibleAnnotations,   RuntimeInvisibleAnnotations,RuntimeVisibleParameterAnnotations,   RuntimeInvisibleParameterAnnotations和AnnotationDefault。的   还可以指定InnerClasses属性名称,请参考   此属性的源名称部分。例如,您至少应   保留Exceptions, InnerClasses 和Signature属性   处理库。您还应该保留SourceFile和   LineNumberTable属性用于产生有用的混淆堆栈   痕迹。最后,如果您的代码取决于您,则可能需要保留注释   在他们。仅适用于混淆。

在proguard-rules.pro文件中添加此行

-keepattributes InnerClasses

https://stuff.mit.edu/afs/sipb/project/android/sdk/android-sdk-linux/tools/proguard/docs/index.html#manual/usage.html

找到的更多详细信息