Duplicar posible:
Removing unused strings during ProGuard optimisationExtracción de registro con ProGuard no retire las cuerdas están registrando
Tengo una aplicación Android con decenas de declaraciones de registro. Yo prefiero que no aparecerían en la versión de lanzamiento, por lo que utiliza Proguard con algo como esto en el archivo proguard.cfg
:
-assumenosideeffects class android.util.Log {
public static *** d(...);
}
Pero el problema es que hay una gran cantidad de Log.d("something is " + something)
, y aunque el Log.d()
la instrucción se está eliminando del bytecode, las cadenas todavía están allí.
Así que, siguiendo this respuesta, he creado una clase de contenedor simple, algo a lo largo de las líneas de:
public class MyLogger {
public static void d(Object... msgs) {
StringBuilder log = new StringBuilder();
for(Object msg : msgs) {
log.append(msg.toString());
}
Log.d(TAG, log.toString());
}
}
Entonces editado mi proguard.cfg
:
-assumenosideeffects class my.package.MyLogger {
public static *** d(...);
}
Pero las cadenas todavía se encuentran en el bytecode generado!
Aparte de esto, estoy usando el estándar proguard.cfg
provisto por el SDK de Android. ¿Estoy haciendo algo mal?
Editar: después de examinar el código de bytes generado, vi que las cuerdas estaban allí, pero no se les está siendo agregado a los otros, como yo pensaba. Estaban siendo almacenados en una matriz. ¿Por qué? Para pasarlos como parámetros variables a mi método. Parece que ProGuard no le gusta eso, así que modificó mi clase registrador de la siguiente manera:
public static void d(Object a) {
log(a);
}
public static void d(Object a, Object b) {
log(a, b);
}
(... I had to put like seven d() methods ...)
private static void log(Object... msgs) {
(same as before)
}
Es feo, pero ahora las cuerdas son ninguna parte en el código de bytes.
¿Es esto algún tipo de error/limitación de ProGuard? ¿O simplemente no estoy entendiendo cómo funciona?
Es posible que desee evitar hackers proguard y simplemente usar una constante: http://stackoverflow.com/questions/4199563/android-util-log-when-publishing-what-can-i-do-not-do If a continuación, utilice un proguard constante eliminará las líneas de código cuando == falso. – Blundell
Es cierto que este es un truco, y uno feo, pero creo que es mejor que poner 'if (DEBUG)' en todas partes. El código resultante es más limpio y el resultado es el mismo en la aplicación exportada. Además, por alguna razón, Eclipse gime sobre el código muerto si la constante de depuración es falsa, y eso no me gusta. Gracias por la idea, aunque :) –
Tenga en cuenta que todavía puede haber algún código muerto si pasa tipos de datos básicos. Proguard no elimina el tipo de datos básico a la conversión 'Objeto' correspondiente. P.ej. si pasa un 'int', Proguard saldrá en la línea' Integer.valueOf (someVar); ' – crazymaik