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):
Wie zu sagen, proguard zu halten enum-Konstanten und Felder

Und wenn ich versuche erhalten Bereichen, in der Sie aufgelistet sind verdeckt mit a, b, c, d, e, f:
Wie zu sagen, proguard zu halten enum-Konstanten und Felder

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

Schreibe einen Kommentar