Chcę zachować tylko klasy, które zawierają metody opisane w @Keep
i te metody. Te metody (i posiadanie klas) powinny być przechowywane, nawet jeśli nie są używane.Jak prowadzić zajęcia z określonymi członkami?
Co napisać w aktach .pro jest:
-keepclassmembers class * {
@Keep *;
}
-keepclasseswithmembers class * {
@Keep *;
}
Ale to kurczy się zajęcia z metod @Keep jeśli są nieużywane.
Potem spróbuj tego:
-keep class * {
@Keep *;
}
to właśnie zachowuje wszystkie klasy.
Co powinienem napisać w pliku .pro?
Aktualizacja 1: przykład Dzięki za odpowiedź. Ale już używam w pełni kwalifikowanych nazw adnotacji i dołączam do nich JAR-y z adnotacjami, ale nie robię tego, co chcę. Przygotowałem próbkę.
mam 2 dzbanków:
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 config, 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 *;
}
nazwy See, pakietów są prawidłowe, a wszystkie słoiki są włączone.
Wynikające map-file:
example.lib.Keep -> example.lib.Keep:
Więc A.class zostanie usunięty. Co ja robię źle?
Właśnie zaktualizowałem temat próbką.Robię to samo, co sugerujesz, i nadal nie działa: "( – Andy
I określenie JAR z adnotacji jako biblioteki (-libraryjars) nie pomaga. – Andy
Zaktualizował rozwiązanie, aby użyć właściwego wieloznacznika. teraz –