2011-06-08 6 views
17

Estoy trabajando en una biblioteca que se distribuye como java jar, y estoy ejecutando Proguard de forma que solo quede expuesta la interfaz requerida. Tengo una clase de configuración con un grupo de variables miembro y algunas definiciones enum. Mi script proguard conserva bien las variables miembro, sin embargo, las definiciones enum están siendo ofuscadas. He intentado todo lo que se me ocurre para obligar a Proguard a conservar estas enumeraciones públicas y definidas internamente, pero no puedo lograr que funcione.Proguard no mantendrá las enumeraciones de un miembro de la clase

En este momento estoy usando:

-keep public class com.stuff.MyConfigObject { 
    public *; 
} 

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

Si trato:

-keep public enum com.stuff.MyConfigObject.MyEnum 

Me aparece un error ambiguo: "Nota: la configuración se refiere a la 'com.stuff clase desconocida .MyConfigObject.MyEnum '"

¡Gracias por la ayuda!

Respuesta

31

Pruebe com.stuff.MyConfigObject$MyEnum en su lugar. Proguard class specification espera $ como separador para las clases internas.

En realidad, por lo que quieres tal vez la mejor opción es algo como esto:

-keep public enum com.stuff.MyConfigObject$** { 
    **[] $VALUES; 
    public *; 
} 

Esto evitará que sólo los miembros requeridos para todos los enum s anidados dentro MyConfigObject - los miembros requeridos son la matriz $VALUES[] (ver this question para una explicación) y cualquier public miembros de la enumeración. Cualquier otro miembro (por ejemplo, métodos de campos privados) no se mantendrá.


Como se ha señalado por Jesse y yo en los comentarios - ya que está procesando una biblioteca, también debe agregar la opción -keepAttributes. De la guía de referencia:

For example, you should at least keep the Exceptions, InnerClasses, and Signature attributes when processing a library.

+0

¡Gracias eso me ha acercado mucho más! Sin embargo, el .jar resultante es un poco raro. Los archivos de clase para las enumeraciones están allí, y todo parece estar bien, pero en Eclipse, ninguno de los miembros puede usarse. La finalización del código los muestra correctamente, pero la compilación sigue fallando con "MyEnum no se puede resolver o no es un campo". Estoy usando proguard 4.4. – Jesse

+2

Encontré que si agrega '-keepAttributes **' funcionará. No estoy seguro de qué atributo (s) particular (es) debe (n) conservarse, pero con la [referencia de Proguard] (http://proguard.sourceforge.net/manual/usage.html#keepattributes) y algo de experimentación, apuesto a que podría averiguarlo. –

+0

Gracias @Kevin K, eres un salvavidas. ¡Funciona de maravilla! – Jesse

Cuestiones relacionadas