如何保留包含特定成员的类?

And*_*ndy 6 java obfuscation proguard

我想只保留包含带注释方法的类@Keep,以及这些方法.即使它们未使用,也应保留这些方法(和拥有类).

我在.pro文件中写的是:

-keepclassmembers class * {
    @Keep *;
}

-keepclasseswithmembers class * {
    @Keep *;
}
Run Code Online (Sandbox Code Playgroud)

但如果它们未被使用,它会使用@Keep方法缩小类.

然后我试试这个:

-keep class * {
    @Keep *;
}
Run Code Online (Sandbox Code Playgroud)

它只保留所有课程.

那么,我应该在.pro文件中写什么?

更新1:示例 感谢您的回答.但我已经使用了完全限定的注释名称并包含带注释的JAR,但它并没有按照我的意愿行事.所以,我准备了一个样本.

我有2个JAR:

example.jar /

  example/
    code/
      more/
        A.class
Run Code Online (Sandbox Code Playgroud)

lib.jar /

  example/
    lib/
      Keep.class
Run Code Online (Sandbox Code Playgroud)

A.java:

package example.code.more;

import example.lib.*;

public class A {
  @Keep
  void foo() {}
}
Run Code Online (Sandbox Code Playgroud)

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 {

}
Run Code Online (Sandbox Code Playgroud)

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 *;
}
Run Code Online (Sandbox Code Playgroud)

请参阅包名称正确并包含所有JAR.

结果映射文件:

example.lib.Keep -> example.lib.Keep:
Run Code Online (Sandbox Code Playgroud)

因此,A.class被删除.我究竟做错了什么?

Eri*_*une 14

与ProGuard发行版中的examples/annotations/lib/annotations.pro一样,您应指定完全限定名称.此外,选项-keepclasseswithmembers与"*"通配符不能很好地结合 - 使用"<methods>"通配符代替:

-keepclasseswithmembers class * {
  @proguard.annotation.Keep <methods>;
}
Run Code Online (Sandbox Code Playgroud)

您也不要忘记阅读包含注释类的jar:

-libraryjars annotations.jar 
Run Code Online (Sandbox Code Playgroud)