que tienen una aplicación que utiliza una gran cantidad de Log.d()
o Log.e()
llamadas para la depuración. Ahora quiero crear mi paquete final para el lanzamiento. La función de exportación de Android de Eclipse menciona eliminar el indicador "Debuggable"
en el manifiesto, lo cual he hecho. ¿Debo también comentar todas las llamadas Log
para mejorar el rendimiento de mi aplicación o estas llamadas no harán nada en el paquete de versión final no depurable?¿Debo comentar mis llamadas de registro al crear mi paquete final?
Respuesta
He subclase de la clase de registro a una clase llamada de seguimiento, que refleja los métodos de registro. Así que hago Trace.d (TAG, "bla") y luego dentro del método Trace.d el código sólo se ejecuta basa en una variable de clase static final llamada logging_level, que tiene los niveles 1-5 (ninguno, sólo errores, errores & advertencias , errores & advertencias & información, y todo, incluida la depuración). Al producir un APK de producción, Proguard elimina todo el código que no se utiliza en la aplicación, por lo que lo hace por mí.
Para mí, el registro es demasiado importante como para eliminar de la fuente, pero debe ser retirado de la aplicación de producción, para el funcionamiento, razones de propiedad seguros e intelectuales.
Esta estructura permite que añada mucho más el registro de la aplicación, lo que hace que los problemas de depuración mucho más fácil, pero sin impacto alguno sobre la producción APK
public class Trace
{
public static final int NONE = 0;
public static final int ERRORS_ONLY = 1;
public static final int ERRORS_WARNINGS = 2;
public static final int ERRORS_WARNINGS_INFO = 3;
public static final int ERRORS_WARNINGS_INFO_DEBUG = 4;
private static final int LOGGING_LEVEL = ERRORS_ONLY; // Errors + warnings + info + debug (default)
public static void e(String tag, String msg)
{
if (LOGGING_LEVEL >=1) Log.e(tag,msg);
}
public static void e(String tag, String msg, Exception e)
{
if (LOGGING_LEVEL >=1) Log.e(tag,msg,e);
}
public static void w(String tag, String msg)
{
if (LOGGING_LEVEL >=2) Log.w(tag, msg);
}
public static void i(String tag, String msg)
{
if (LOGGING_LEVEL >=3) Log.i(tag,msg);
}
public static void d(String tag, String msg)
{
if (LOGGING_LEVEL >=4) Log.d(tag, msg);
}
}
De developer.android.com:
Desactivar el registro y depuración y limpieza de datos/archivos para su liberación, que debe asegurarse de que las instalaciones de depuración estén apagados y que depurar y otra innecesaria los datos/archivos son eliminados de su proyecto de aplicación.
Elimina el atributo android: debuggable = "true" del elemento del manifiesto. Quitar ingrese archivos, archivos de seguridad y otros archivos innecesarios del proyecto de aplicación . Compruebe si hay datos privados o patentados y elimínelos como necesarios. Desactive todas las llamadas a los métodos Log en el código fuente.
No sería tan estricto para eliminar todo el registro, pero el registro de depuración es seguro. –
Ya vi esa información en el sitio web android dev pero no estaba claro si había un mecanismo para "Desactivar el registro" que no fuera comentar todo. Además, cuando dicen "Desactivar cualquier llamada a los métodos de registro en el código fuente" no está claro si significan "comentario" o si hay otra manera. – jmbouffard
me pregunto qué hipócrita escribió eso? el registro de Android está lleno en un 98% de mensajes de aplicaciones y servicios de Android. quizás lo que querían decir es "deshabilitar todo el registro para que no atestara el registro cuando queremos encontrar nuestros mensajes de registro". –
Esto me hizo revisar mi suposición de que los log.d
líneas en el código de alguna manera no aparecerían en una apk autorización firmada sin la bandera depurable establecido en el manifiesto, que estaba equivocado, todavía Aparecer.
Una búsqueda rápida en lo que me llevó a la respuesta aceptada a esta pregunta: Remove all debug logging calls before publishing: are there tools to do this?
Funciona muy bien y que no tiene que cambiar ningún código.
Parece ser una buena solución, pero no estoy seguro de si quiero usar Proguard. – jmbouffard
@jmbouffard: Si ya está usando Ant para compilar su apk de lanzamiento, entonces es bastante simple agregar Proguard, ya que ya hay un objetivo en el archivo main_rules.xml del SDK. Si no estás familiarizado con Ant, entonces estoy de acuerdo, podría ser un poco molesto. – NickT
que eliminaría el código de registro de la siguiente manera:
-assumenosideeffects class android.util.Log {
public static boolean isLoggable(java.lang.String, int);
public static int v(...);
public static int i(...);
public static int w(...);
public static int d(...);
public static int e(...);
public static java.lang.String getStackTraceString(java.lang.Throwable);
}
-assumenosideeffects class java.lang.Exception {
public void printStackTrace();
}
-assumenosideeffects class * implements org.slf4j.Logger {
public void trace(...);
public void debug(...);
public void info(...);
public void warn(...);
public void error(...);
public boolean isTraceEnabled(...);
public boolean isDebugEnabled(...);
public boolean isInfoEnabled(...);
public boolean isWarnEnabled(...);
public boolean isErrorEnabled(...);
}
Si es necesario, se pueden conservar las categorías de error y advertencia.Pero asegúrese de que la optimización y la contracción estén habilitadas para la construcción solo cuando la eliminación del código sea efectiva
- 1. ¿Debo poner .htm al final de mis URL?
- 2. ¿Debo usar el modificador "final" al crear objetos de fecha?
- 3. ¿DEBO RESTABLECER mis llamadas RPC a través de HTTP?
- 4. ¿Cómo debo marcar el final de un paquete TCP?
- 5. ¿Debo usar glDeleteTextures() al final del programa?
- 6. ¿Cómo debo crear mi GUID?
- 7. ¿Con qué código Delphi debo reemplazar mis llamadas al método TThread en desuso Suspender?
- 8. ¿Debo usar las funciones listas para DOM si mis scripts están al final del cuerpo?
- 9. ¿Cómo debo formatear mis datos para el paquete R mlogit?
- 10. ¿Debo encapsular mi contenedor IoC?
- 11. ¿Debo capitalizar mis constantes?
- 12. ¿Debo crear mi próxima aplicación web en ASP.NET MVC?
- 13. ¿Debo eliminar NSLogs al liberar mi aplicación
- 14. Eliminar llamada del registro de llamadas después del final de la llamada
- 15. ¿Debo firmar mis archivos DLL?
- 16. ¿Cómo crear un paquete Debian para mi aplicación web Java?
- 17. Obtenga un paquete de llamadas en Clojure
- 18. ¿Debo probar mis controladores (MVC)?
- 19. ¿Cómo aseguro mis llamadas JSONResult GET?
- 20. Cómo asegurar que mi jQuery .ready se ejecuta al final
- 21. ¿Debo liberar mi aplicación si incluyo MySQL Connector/J (GPL) como parte de mi paquete?
- 22. ¿Debo comentar la declaración o la definición en C++?
- 23. Registro/historial de llamadas de iPhone
- 24. ¿Por qué mi loop de Perl está apagado al final?
- 25. ¿Cómo debo nombrar mis clases de CSS?
- 26. Comentar SVN sin actualizar
- 27. Incluir/Excluir archivos al crear el paquete Azure
- 28. ¿Debo asignar explícitamente mi NSNumber?
- 29. Vinculación de varios archivos al crear un paquete en R
- 30. ¿Cómo puedo encadenar mis llamadas a métodos?
Pensé que esto ya estaba incluido en la clase Log de Android. ¿Por qué no podemos simplemente hacer Log.setLogLevel (Log.ERROR)? Si no, tu solución parece realmente buena. – jmbouffard
"sin impacto alguno en la APK de producción" ... mal. este es un antipatrón conocido. el problema es que el argumento msg siempre se evalúa independientemente de si realmente registra el mensaje. por ejemplo Trace.e ("blah", "error fue:" + error.getCode() + ", ruh roh!"). ya sea que inicie sesión o no, hay tres objs de cadena temporales creados y dos llamadas a métodos superfluas. –
@jmbouffard No hay un método en el registro llamado setLogLevel() –