2012-05-08 5 views
6

Me gustaría que proguard ofusque los nombres de las clases. Tengo esta línea en Proguard.cfgCómo decirle a Proguard que ofusque los nombres de las clases

-keepclasseswithmembers class * { 
public static <fields>; 
} 

-keepnames class * implements java.io.Serializable 
-keep public class com.google.** 

Y noto que lo que no está ofuscado son los nombres de las clases. Entonces ejecutando jdgui veo com/test/abcd/ActualClass.java public class ActualClassName extends Activity etc

además veo métodos que devuelven nombres de clases reales. como

ActualClassname aa(); 

e importa declaraciones como

import com.abcd.ActualClassName 

¿Cómo consigo Proguard a ofuscar el nombre de clase en sí. No es solo para Actividades que veo que mis Adaptadores no se ofuscan. Bueno, hay ofuscación pero no nombres de clase.

¿Están las reglas anteriores lo que impide que los nombres de las clases se ofusquen?

Actualización: desde entonces he eliminado las reglas anteriores y una clase de utilidad que no se extiende desde Android no se ofusca. Ahora me pregunto si existe alguna regla implícita sobre mantener los nombres de clase de las clases a las que se hace referencia desde clases que se mantienen como clases derivadas de actividades. Las clases cuyos nombres no se ofuscan tienen algunas cosas en común:

1) Métodos estáticos 2) Importación de otros tipos que se mantienen como aquellos derivados de la actividad o serializables. 3) Tienen métodos con parámetros de otras clases (algunos de los cuales pueden necesitar mantenerse).

Sin embargo, no hay ningún lugar donde específicamente solicite que se mantengan estas clases de servicios.

+0

Estoy funcionando con el mismo problema. Encontraste una solución a este problema ? – lnreddy

Respuesta

1

Creo que su problema proviene de su primera línea: '-keepclasseswithmembers' incluye el nombre de la clase, por lo que en su caso cualquier clase con un campo estático mantendrá su nombre. Cambiarlo simplemente a '-emp class members' ofuscará los nombres de las clases y dejará intactos los campos estáticos (que asumo que usted desea hacer).

Sin embargo, no estoy seguro de por qué quieres hacer esto. Si intenta preservar los nombres de las variables estáticas, ¿no debería querer conservar también los nombres de las clases, dado que así es como accederá a los campos estáticos? ¿Por qué intentas conservar todos tus nombres de variables estáticos?

+0

He eliminado esa línea. Ahora veo que se conserva una clase de Utilidad que no se extiende desde que se mantiene algo. Simplemente está siendo utilizado por las clases que se guardan e importan, etc. –

+1

Hmm, ¿puedes poner tu archivo .cfg completo? – alexc

3

Existen varias clases que aparecen en su código que deben conservar el mismo nombre de clase completo para que puedan encontrarlas. Un ejemplo como el anterior son todas las clases Activity, ya que están definidas en el manifiesto por su nombre completo como una Cadena. Si cambiasen el nombre de la clase, Android ya no podría encontrarlos.

La configuración típica Proguard se referirá a la configuración Proguard en el SDK de Android que incluirá varias líneas importantes como ésta:

-keep public class * extends android.app.Activity 
+0

Bueno, estoy viendo que todos los nombres de las clases se mantienen. Desde entonces, ¿eliminé las clases de mantenimiento con miembros pero aún obtuve el mismo resultado? –

+0

Por ejemplo, tengo una clase de utilidad y se guarda. Entonces, tal vez exista alguna regla implícita sobre mantener nombres de clase que hagan referencia a otras clases o que sean referenciadas por otras clases –

+0

(solo verificando los primeros principios) en su proyecto Android, ¿ha comentado la definición de 'proguard.config' en' project.properties' y cual es el valor? –

Cuestiones relacionadas