Как сохранить классы, содержащие определенные элементы?

Я хочу сохранить только классы, которые содержат методы, аннотированные с @Keep, и этими методами. Эти методы (и владеющие классами) должны храниться, даже если они не используются.

что я пишу .pro-файл:

-keepclassmembers class * {
    @Keep *;
}

-keepclasseswithmembers class * {
    @Keep *;
}

но он сжимает классы с методами @Keep, если они не используются.

тогда я попробую это:

-keep class * {
    @Keep *;
}

он просто сохраняет все классы.

Итак, что я должен писать в - ... pro-файл?

обновление 1: пример Спасибо за ответ. Но я уже использую полные имена аннотаций и включаю банки с аннотациями, но он не делает то, что я хочу. Итак, я подготовил образец.

у меня есть 2 Банки:

пример.Джар/

  example/
    code/
      more/
        A.class

lib.Джар/

  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, пример.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 *;
}

см., имена пакетов правильные, и все банки включены.

результирующий файл карты:

example.lib.Keep -> example.lib.Keep:

Итак, A.class удаляется. Что я делаю не так?

1 ответов


как в примерах / аннотации/lib / аннотации.pro в дистрибутиве ProGuard необходимо указать полные имена. Кроме того, опция-keepclasseswithmembers не хорошо сочетается с подстановочным знаком " * " -- вместо этого используйте подстановочный знак "":

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

вы также не должны забывать читать банку, содержащую классы аннотаций:

-libraryjars annotations.jar