2015-10-17 11 views
9

Ich habe versucht, unsere Web-Anwendung zu verschleiern, die Feder, Jaxb verwenden und auf Anmerkungen und Reflexion stark beruht. Ich verwende viele Rezepte im Internet, um einige Klassen, Attribute, Anmerkungen und Aufzählungen zu behalten. Aber mit Aufzählungen haben immer noch ein Problem. Ich habe erhalten können Enum-Konstanten Konfiguration von http://proguard.sourceforge.net/manual/examples.html#enumerations gelten:Wie man Proguard sagt Enum Konstanten und Felder zu halten

-keepclassmembers,allowoptimization enum * { 
    public static **[] values(); 
    public static ** valueOf(java.lang.String); 
} 

Auf den ersten Blick wie Arbeitslösung und konstant aussieht erhalten, so (Class.getEnumConstants()) korrekte Liste von Werten zurück. Aber ich habe NoSuchFieldException, wenn ich versuche, Feld von diesem Namen zu nennen.

Problem von jaxb reflection navigator kommen, schauen Sie sich bitte 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()); 
    } 
} 

I fallen genau in die "unmöglich" Zweig. Ich denke, es wird leicht verständlich sein, um Debug-Sitzung Screenshot zu sehen (dort aufgelistet auch constants): Screenshot of debug session1

Und wenn ich erhalten versuchen fields, werden sie als a, b verschleierten Listed, c, d, e, f: Screenshot of debug session2

Meine proguard Konfiguration jetzt folgendermaßen aussehen (Streifen aus einer Bibliothek Auflistung und bestimmte Klassen, Felder und Methoden über proguard beschweren KIPP):

-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); 
} 

Also, meine Frage, wie ich voll public enum halten konnte s aus Verschleierung? In beiden Fällen - verwenden Sie die Konstanten (class.getEnumConstants()) und die Felder (class.getFields()).

Antwort

19

Dank http://sourceforge.net/p/proguard/discussion/182455/thread/1c28f199/ fand ich Lösung für meine Frage (<⁠fields> hinzugefügt werden müssen):

-keepclassmembers class * extends java.lang.Enum { 
    <fields>; 
    public static **[] values(); 
    public static ** valueOf(java.lang.String); 
} 
+0

Für jeden, der auf diese stößt und die ant-Entsprechung möchte: Fügen Sie _ _ hinzu Programmaufgabe. –

+0

Ich nehme an, Sie sprechen über 'maven' Task-Konfiguration? Es gibt nichts über Maven in der ersten Frage. Ich benutze 'Gradle', aber es ist auch außerhalb des Bereichs. Die Konfiguration der Antworten gehört also zur 'proguard.conf'-Syntax. – Hubbitus

+0

Hubbitus ja, aber ich fand diese Antwort als dritte Verbindung beim Versuch, genau dieses Problem zu lösen, aber mit ant (nicht Maven), und nicht direkt mit Proguard. Die Übersetzung zwischen den beiden ist nicht sofort offensichtlich, zumindest für mich nicht, also fügte ich einen Kommentar hinzu, so dass jeder, der dies zu meinen Bedingungen findet, auch die zusätzlichen Informationen hätte. Es sollte in keiner Weise bedeuten, dass Ihre Antwort falsch oder unvollständig war. Ich bedaure, wenn das der Schluss ist, den Sie genommen haben. –

4

Dies funktionierte gut für mich.

-keep public enum com.company.appname.**{ 
    *; 
} 

Wo ** ist Paket und Unterpakete.