我想只保留包含用@Keep
注释的方法的类,以及这些方法。
即使它们未被使用,也应该保留这些方法(和拥有类)。
我在.pro文件中写的是:
-keepclassmembers class * {
@Keep *;
}
-keepclasseswithmembers class * {
@Keep *;
}
但如果没有使用@Keep方法,它会缩小类。
然后我试试这个:
-keep class * {
@Keep *;
}
它只保留所有课程。
那么,我应该在.pro文件中写什么?
更新1:示例 感谢您的回答。但我已经使用了完全限定的注释名称并包含带注释的JAR,但它并没有按照我的意愿行事。所以,我准备了一个样本。
我有2个JAR:
example.jar /
example/
code/
more/
A.class
lib.jar /
example/
lib/
Keep.class
A.java :
package example.code.more;
import example.lib.*;
public class A {
@Keep
void foo() {}
}
Keep.java :
package example.lib;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.CLASS)
@Target({ElementType.TYPE, ElementType.FIELD, ElementType.METHOD})
public @interface Keep {
}
Proguard配置, example.pro :
-injars example.jar
-injars lib.jar
-outjars obfuscated.jar
-libraryjars <java.home>/lib/rt.jar
-printmapping rt.map
-renamesourcefileattribute SourceFile
-keepattributes SourceFile,LineNumberTable
-printseeds
-overloadaggressively
-dontoptimize
-keeppackagenames example.lib.**
-keepattributes *Annotation*
-keepclassmembers class * extends java.lang.Enum {
public static **[] values();
public static ** valueOf(java.lang.String);
}
-keep class example.lib.* { *; }
-keep class * extends java.lang.annotation.Annotation { *; }
-keepclassmembers class * {
@example.lib.Keep *;
}
-keepclasseswithmembers class * {
@example.lib.Keep *;
}
请参阅包名称正确并包含所有JAR。
产生的地图文件:
example.lib.Keep -> example.lib.Keep:
所以,A.class被删除了。我做错了什么?
答案 0 :(得分:14)
与ProGuard发行版中的examples / annotations / lib / annotations.pro类似,您应指定完全限定名称。此外,选项-keepclasseswithmembers与“*”通配符不能很好地结合 - 使用“&lt;方法&gt;”通配符:
-keepclasseswithmembers class * {
@proguard.annotation.Keep <methods>;
}
您也不要忘记阅读包含注释类的jar:
-libraryjars annotations.jar