安卓构建错误:属性“Signature”需要“InnerClasses”属性。检查“-keepattributes”指令。

12

在尝试以发布模式构建应用程序时,我遇到了这个错误。

错误:属性"Signature"要求"InnerClasses"属性。请检查-keepattributes指令

我的proguard-rules.pro行看起来像这样:

-keepattributes Signature
< p >编译器指的是哪些InnerClasses?我漏掉了什么?< /p >

请在您的Proguard配置中添加-keepattributes InnerClasses并检查。 - kj007
@kj007 是的,它起作用了,我一开始还以为它指的是某些签名的内部类。但是它的写法对我来说有点含糊不清。 - Daniele
我已经发布了我的答案。 - kj007
我还添加了可能导致签名无法工作的原因。 - kj007
2个回答

21

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

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

-keepattributes InnerClasses

InnerClasses(Java 5 或更高版本)

指定类与其内部类和外部类之间的关系。除了这一点和使用“$”作为内部类和外部类名称之间分隔符的命名约定外,内部类就像普通类一样。编译器可能需要此信息以查找在已编译库中引用的类。代码可以通过反射来访问此信息,例如派生类的简单名称。

Signature(Java 8 或更高版本)

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

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

Proguard选项


我花了一生的时间才找到这个解决方案。 - Mehrdad Shokri

2

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

keepattributes [attribute_filter]

指定要保留的任何可选属性。可以使用一个或多个-keepattributes指令指定属性。可选过滤器是由逗号分隔的属性名称列表。属性名称可以包含?、*和**通配符,并且可以在!否定符之前。典型的可选属性包括Exceptions、Signature、Deprecated、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找到。


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