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

Я хочу сохранить только классы, которые содержат методы, аннотированные @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. класс удаляется. Что я делаю не так?

6
задан Andy 4 July 2011 в 10:43
поделиться