2015-10-17 19 views
9

Ho cercato di offuscare la nostra applicazione web che usa spring, jaxb e fa affidamento su annotazioni e riflessioni. Applico molte ricette trovate in internet per mantenere alcune classi, attributi, annotazioni ed enumerazioni. Ma con le enumerazioni hanno ancora problemi. Ho potuto conservo costanti enum applicano configurazione da http://proguard.sourceforge.net/manual/examples.html#enumerations:Come dire a proguard di mantenere costanti enum e campi

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

A prima vista sembra che la soluzione e costante conservato a lavorare, in modo da (Class.getEnumConstants()) di ritorno corretto elenco di valori. Ma ho ottenuto NoSuchFieldException quando provo a recuperare il campo con uno di questi per nome.

problema viene da jaxb reflection navigator, si prega di guardare il codice:

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

cado esattamente nel ramo "impossibile". Penso che sarà facile comprensibile da guardare sessione di debug screenshot (c'è anche elencato constants): Screenshot of debug session1

E se provo ottenere fields, sono elencati offuscato come a, b, c, d, e, f: Screenshot of debug session2

la mia configurazione Proguard ora assomigliare (striscia fuori qualche libreria messa in vendita e Kipp particolari classi, campi e metodi circa Proguard lamentano):

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

Quindi, la mia domanda di come ho potuto tenere pienamente enum pubblico s da offuscamento? In entrambi i casi, utilizzare le sue costanti (class.getEnumConstants()) e i campi (class.getFields()).

risposta

19

Grazie a http://sourceforge.net/p/proguard/discussion/182455/thread/1c28f199/ ho trovato la soluzione per la mia domanda (<⁠fields> devono aggiungere):

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

Per chiunque si imbatta in questo e vuole l'equivalente di formica: Aggiungi _ _ al tuo compito proguard. –

+0

Suppongo che parli della configurazione del task 'maven'? Non c'è nulla riguardo a Maven nella domanda iniziale. Uso 'gradle', ma anche fuori portata. Quindi, tutte le configurazioni fornite nelle risposte appartengono alla sintassi 'proguard.conf'. – Hubbitus

+0

Hubbitus sì, tuttavia ho trovato questa risposta come il terzo collegamento mentre cercavo di risolvere esattamente questo problema, ma usando formica (non esperto) e non utilizzando direttamente proguard. La traduzione tra i due non è immediatamente ovvia, almeno non a me, quindi ho aggiunto un commento in modo che chiunque altro trovasse questo nelle mie condizioni avrebbe anche le informazioni aggiuntive. Non intendeva in alcun modo implicare che la tua risposta fosse errata o incompleta. Mi dispiace se questo è l'inferenza che hai preso. –

4

questo ha funzionato bene per me.

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

Dove ** è pacchetto e subpackages.

Problemi correlati