如何告诉proguard保持枚举常量和字段 [英] How to tell proguard to keep enum constants and fields

查看:295
本文介绍了如何告诉proguard保持枚举常量和字段的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我尝试混淆使用spring,jaxb并依赖于注释和反射的Web应用程序。
我在互联网上应用了许多食谱来保存一些类,属性,注释和枚举。
但是枚举仍有问题。我能够保存枚举常量应用



如果我尝试获取



我的proguard配置现在看起来像(删除一些库列表和kipp特定的类,关于proguard抱怨的字段和方法):

  -injars core-3.15.rc5.6.jar 
-outjars cor e-3.15.rc5.6.proguard.jar

-libraryjars< java.home> /lib/rt.jar

-libraryjars ...#列出的其他库为了简洁而剥离

-printmapping core-3.15.rc5.6.proguard.map

-keep public class ru.rlh.egais.portal.backend.controller。休息。**
-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
#也试过:
#-keepattributes **

-allowaccessmodification
-dontshrink
-dontoptimize
-dontusemixedcaseclassnames
-keepdirectories
-keep @org .springframework.transaction.annotation.Transactional class *
-keep @ org.spri ngframework.stereotype.Service类*
-keep @ org.springframework.stereotype.Repository类*
-keep @ org.springframework.stereotype.Controller类*
-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);
}

那么,我的问题是如何完全保持公共枚举不被混淆?在这两种情况下 - 使用其常量( class .getEnumConstants())和字段( class.getFields())。

解决方案

感谢 http://sourceforge.net/p/proguard/discussion/182455/thread/1c28f199/ 我找到了解决方案对于我的问题(必须添加<⁠fields> ):

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


I've try obfuscate our web application which use spring, jaxb and relies on annotations, and reflection heavily. I apply many recipes found in internet to keep some classes, attributes, annotations and enumerations. But with enumerations still have problem. I've able preserve enum constants apply configuration from http://proguard.sourceforge.net/manual/examples.html#enumerations:

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

At first glance it looks like working solution and constant preserved, so (Class.getEnumConstants()) return correct list of values. But I got NoSuchFieldException when I try retrieve field by any of that by name.

Problem come from jaxb reflection navigator, please look at 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 fall exactly into "impossible" branch. I think it will be easy understandable to look at debug session screenshot (there also listed constants):

And if I try obtain fields, they are listed obfuscated as a, b, c, d, e, f:

My proguard configuration now look like (strip out some library listing and kipp particular classes, fields and methods about proguard complain):

-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, my question how I could fully keep public enums from obfuscation? In both cases - use its constants (class.getEnumConstants()) and fields (class.getFields()).

解决方案

Thanks to http://sourceforge.net/p/proguard/discussion/182455/thread/1c28f199/ I found solution for my question (<⁠fields> must be added):

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

这篇关于如何告诉proguard保持枚举常量和字段的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆