web-dev-qa-db-fra.com

Comment dire à proguard de garder les constantes et les champs enum

J'ai essayé de brouiller notre application web qui utilise spring, jaxb et s'appuie fortement sur les annotations et la réflexion. J'applique de nombreuses recettes trouvées sur Internet pour conserver certaines classes, attributs, annotations et énumérations. Mais avec des énumérations ont toujours un problème. J'ai pu conserver les constantes enum appliquer la configuration de http://proguard.sourceforge.net/manual/examples.html#enumerations :

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

À première vue, cela ressemble à une solution de travail et une constante préservée, donc ( Class.getEnumConstants () ) retourne la liste correcte des valeurs. Mais j'ai eu NoSuchFieldException lorsque j'essaie de récupérer le champ par n'importe quel nom.

Le problème vient de navigateur de réflexion jaxb , veuillez regarder le 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());
    }
}

Je tombe exactement dans la branche "impossible". Je pense qu'il sera facile de comprendre la capture d'écran de la session de débogage (il y a également des constantes ): Screenshot of debug session1

Et si j'essaye d'obtenir champs , ils sont listés obscurcis comme a, b, c, d, e, f: - Screenshot of debug session2

Ma configuration proguard ressemble maintenant à (supprimer la liste des bibliothèques et kipper les classes, champs et méthodes concernant proguard plainte):

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

Donc, ma question comment je pourrais pleinement empêcher les énumérations publiques de l'obscurcissement? Dans les deux cas - utilisez ses constantes ( class.getEnumConstants () ) et ses champs ( class.getFields () ).

20
Hubbitus

Merci à http://sourceforge.net/p/proguard/discussion/182455/thread/1c28f199/ J'ai trouvé une solution à ma question ( <⁠fields> doit être ajouté ):

-keepclassmembers class * extends Java.lang.Enum {
    <fields>;
    public static **[] values();
    public static ** valueOf(Java.lang.String);
}
45
Hubbitus

CA marchait bien pour moi.

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

Où ** est le package et les sous-packages.

10
Joma