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



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

我在.pro文件中写的是:

-keepclassmembers class * {
    @Keep *;
}
-keepclasseswithmembers class * {
    @Keep *;
}

但如果没有使用@Keep方法,它会缩小类。

然后我试试这个:

-keep class * {
    @Keep *;
}

它只是保留了所有的类。

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

更新1:示例谢谢你的回答。但我已经使用了完全限定的注释名称,并在注释中包含JAR,但这并不能满足我的要求。所以,我准备了一个样品。

我有两个JAR:

示例.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() {}
}

保留.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配置,示例。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被删除了。我做错了什么?

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

-keepclasseswithmembers class * {
  @proguard.annotation.Keep <methods>;
}

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

-libraryjars annotations.jar 

相关内容

  • 没有找到相关文章

最新更新