2015-10-17 16 views
9

Próbowałem zaciemnić naszą aplikację internetową, która używa sprężyny, jaxb i polega na adnotacjach i silnym odbiciu. Stosuję wiele przepisów znalezionych w Internecie, aby zachować klasy, atrybuty, adnotacje i wyliczenia. Ale z wyliczeniami nadal występują problemy. Byłem w stanie utrzymać stałe enum zastosować konfigurację z http://proguard.sourceforge.net/manual/examples.html#enumerations:Jak powiedzieć proguardowi, aby utrzymywał stałe i stałe enum

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

Na pierwszy rzut oka wygląda na to rozwiązanie i zachowaną stałą pracę, więc (Class.getEnumConstants()) zwracają poprawną listę wartości. Ale otrzymałem NoSuchFieldException, gdy próbuję pobrać pole przez którykolwiek z tego po nazwie.

Problem pochodzą z jaxb reflection navigator, proszę spojrzeć na kod:

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

spadnę dokładnie do "niemożliwe" oddział. Myślę, że będzie łatwo zrozumiałe, aby spojrzeć na sesji debugowania zrzutu ekranu (tam również wymienione constants): Screenshot of debug session1

A jeśli próbuję uzyskać fields, są one wymienione ukrywane jako a, b, c, d, e, f: Screenshot of debug session2

Moja konfiguracja PROGUARD teraz wyglądać (strip niektóre biblioteki wystawianie i Kipp poszczególnych klas, pól i metod dotyczących PROGUARD skarżą):

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

Więc moje pytanie, jak mogę w pełni zachować public enum s od zaciemniania? W obu przypadkach użyj jego stałych (class.getEnumConstants()) i pól (class.getFields()).

Odpowiedz

19

Dzięki http://sourceforge.net/p/proguard/discussion/182455/thread/1c28f199/ znalazłem rozwiązanie na moje pytanie (<⁠fields> należy dodać):

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

Dla każdego, kto natknie się na to i chce ekwiwalentu ant: Dodaj _ _ do twojego zadanie proguard. –

+0

Przypuszczam, że mówisz o konfiguracji zadania 'maven'? W pierwszym pytaniu nie ma nic o mavenie. Używam 'gradle', ale także poza zakresem. Tak więc cała konfiguracja podana w odpowiedziach należy do składni "proguard.conf". – Hubbitus

+0

Hubbitus tak, jednak znalazłem tę odpowiedź jako trzecie ogniwo, próbując rozwiązać dokładnie ten problem, ale używając mrówki (nie maven) i nie używając bezpośrednio proguarda. Tłumaczenie między nimi nie jest od razu oczywiste, przynajmniej nie dla mnie, więc dodałem komentarz, aby każdy, kto znajdzie to pod moimi warunkami, również miałby dodatkowe informacje. To w żaden sposób nie znaczyło, że twoja odpowiedź była błędna lub niekompletna. Żałuję, że to wnioskowanie, które wziąłeś. –

4

To działało w porządku dla mnie.

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

Gdzie ** jest pakiet i podpakiety.