Wie zu sagen, proguard zu halten enum-Konstanten und Felder
Ich habe versucht, zu verschleiern unsere web-Anwendung, die nutzen spring, jaxb und stützt sich auf Anmerkungen und Reflexion stark.
Ich trage viele Rezepte finden Sie im internet, halten Sie einige Klassen, Attribute, Anmerkungen und Aufzählungen.
Aber mit Aufzählungen, die haben noch Probleme. Ich habe in der Lage zu bewahren, die enum-Konstanten anwenden der Konfiguration aus http://proguard.sourceforge.net/manual/examples.html#enumerations:
-keepclassmembers,allowoptimization enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
Auf den ersten Blick sieht es aus wie funktionierende Lösung und konstant beibehalten, sodass (Klasse.getEnumConstants()) return richtige Liste von Werten.
Aber ich habe NoSuchFieldException, wenn ich versuche abzurufen Feld von allen, die durch Namen.
Problem kommen aus jaxb Reflexion navigator, schauen Sie bitte in code:
public Field[] getEnumConstants(Class clazz) {
try {
Object[] values = clazz.getEnumConstants();
Field[] fields = new Field[values.length];
for (int i = 0; i < values.length; i++) {
fields[i] = clazz.getField(((Enum) values[i]).name());
}
return fields;
} catch (NoSuchFieldException e) {
//impossible
throw new NoSuchFieldError(e.getMessage());
}
}
Falle ich genau in die "unmöglich" - Zweig. Ich denke, es wird leicht verständlich zu schauen, debug-session screenshot (dort auch aufgeführt Konstanten):
Und wenn ich versuche erhalten Bereichen, in der Sie aufgelistet sind verdeckt mit a, b, c, d, e, f:
Meine proguard-Konfiguration sieht dann wie folgt aus (Streifen aus einige Bibliothek-Liste und kipp bestimmte Klassen, Felder und Methoden über proguard beschweren):
-injars core-3.15.rc5.6.jar
-outjars core-3.15.rc5.6.proguard.jar
-libraryjars <java.home>/lib/rt.jar
-libraryjars ... # Other libs listed, strip out for shortness
-printmapping core-3.15.rc5.6.proguard.map
-keep public class ru.rlh.egais.portal.backend.controller.rest.**
-keep public class ru.rlh.egais.portal.backend.integration.soap.service.**
# http://midgetontoes.com/blog/2015/06/26/tips-for-using-proguard-with-spring-framework
-optimizations !class/marking/final
-adaptresourcefilecontents **.properties,META-INF/MANIFEST.MF,META-INF/spring.*,spring/*
-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod
# Also tried:
# -keepattributes **
-allowaccessmodification
-dontshrink
-dontoptimize
-dontusemixedcaseclassnames
-keepdirectories
-keep @org.springframework.transaction.annotation.Transactional class *
-keep @org.springframework.stereotype.Service class *
-keep @org.springframework.stereotype.Repository class *
-keep @org.springframework.stereotype.Controller class *
-keep @org.springframework.stereotype.Component class *
-keep @org.springframework.beans.factory.annotation.Autowired class *
-keep @org.springframework.web.bind.annotation.ResponseBody class *
-keep @org.springframework.web.bind.annotation.RequestMapping class *
-keep @org.springframework.stereotype.Repository class *
-keep @javax.annotation.Resource class *
-keep @org.springframework.cache.annotation.EnableCaching class *
-keep @org.springframework.context.annotation.Configuration class *
-keepclassmembers class * {
@org.springframework.beans.factory.annotation.* *;
@org.springframework.beans.factory.annotation.Qualifier *;
@org.springframework.beans.factory.annotation.Value *;
@org.springframework.beans.factory.annotation.Required *;
@org.springframework.context.annotation.Bean *;
@javax.annotation.PostConstruct *;
@javax.annotation.PreDestroy *;
@org.aspectj.lang.annotation.AfterReturning *;
@org.aspectj.lang.annotation.Pointcut *;
@org.aspectj.lang.annotation.AfterThrowing *;
@org.aspectj.lang.annotation.Around *;
}
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
So, meine Frage, wie ich voll halten öffentliche Enumerationen, die von der Verschleierung? In beiden Fällen - den Konstanten (Klasse.getEnumConstants()) und Felder (Klasse.getFields()).
InformationsquelleAutor Hubbitus | 2015-10-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dank http://sourceforge.net/p/proguard/discussion/182455/thread/1c28f199/ fand ich die Lösung für meine Frage (<Felder> Hinzugefügt werden müssen):
Ich nehme an, Sie sprechen über
maven
task-Konfiguration? Es gibt nichts über maven in der ersten Frage. Ich benutzegradle
, aber auch out-of-scope. So, alle Konfiguration in Antworten gehörtproguard.conf
syntax.Hubbitus ja, aber ich fand diese Antwort als das Dritte Glied, während Sie versuchen zu lösen genau dieses problem, aber mit Hilfe von ant (nicht mit maven), und nicht mit proguard direkt. Die übersetzung zwischen den beiden ist nicht sofort offensichtlich, zumindest nicht für mich, so dass ich einen Kommentar Hinzugefügt, so dass jemand anderes, der findet diese unter meinen Bedingungen würde sich auch die zusätzlichen Informationen. Es war in keiner Weise bedeuten, dass Ihre Antwort falsch war oder unvollständig. Ich bedauere, wenn das ist die Folgerung, dass Sie nahm.
Siehe auch ProGuard docs - Verarbeitung enumeration-Klassen. - Für Android-Projekte, können diese Einstellungen geladen werden über die Referenzierung von proguard-android.txt in build.gradle.
InformationsquelleAutor Hubbitus
Dies funktionierte gut für mich.
Wo ist ** Paket und Unterpakete.
InformationsquelleAutor Joma