Как сохранить классы, содержащие определенные элементы?
Я хочу сохранить только классы, которые содержат методы, аннотированные с @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