logging java-me mobile mobile-phones

logging - Iniciando sesión en J2ME



java-me mobile (8)

¿Qué soluciones de registro existen para j2me?

Estoy específicamente interesado en excluir fácilmente el registro para la versión de "lanzamiento", para tener un paquete más pequeño y una huella de memoria.


MicroLog es una apuesta segura. Es una pequeña biblioteca de registro para Java ME (J2ME) como Log4j. Tiene soporte para iniciar sesión en consola, archivo, RecordStore, Canvas, Form, Bluetooth, un puerto serie (Bluetooth, IR, USB), Socket (incluido SSL), UDP, Syslog, MMS, SMS, correo electrónico o Amazon S3 .

http://sourceforge.net/projects/microlog/


Utilicé MIDPLogger en un nivel aceptable en una aplicación de producción, aunque he descubierto que tiene más uso después de la integración en la aplicación en lugar de otro Midlet en suite, etc. También encontré MicroLog pero no lo he usado con gran detalle.


Puede usar los -assumenosideafectos en proguard para eliminar completamente su clase de registro:

-assumenosideeffects public class logger.Logger {*;}

En lugar de tener que preprocesar.


Escribí un optimizador de bytecode, y debido al formato de los archivos de clase, puede apuntar a la codificación UTF de nombre de clase y función que le permite generar registros con MyClass.someFunc () (puede procesar la firma si desea obtener los tipos ) que le permite hacer algo parecido a la depuración de estilo C utilizando macros LINE & FILE .


El uso de la compilación condicional de la clase de registrador no resuelve el problema de eliminar por completo las instrucciones de registro porque con frecuencia registrará más que una cadena simple. Buscará valores variables y los ensamblará en cadenas, por ejemplo: WhateverLog.log ("Loaded" + someclass.size () + "foos").

Ahora, si solo dejas fuera el cuerpo de WhateverLog.log (como se muestra en la solución aceptada), aún dejarás una gran cantidad de código innecesario, incluida la concatenación de cadenas (y por lo tanto una creación de StringBuffer). Es por eso que es mejor utilizar una herramienta de procesamiento de código de bytes como proguard (ya mencionado). Los efectos de Asumenoside de Proguard permitirán que su optimizador elimine no solo las declaraciones de registro, sino también todos los códigos cuyos resultados solo serían utilizados por la llamada de registro.


Si usa preprocesamiento y ofuscación con Proguard, entonces puede tener una clase de registro simple.

public class Log { public static void debug(final String message) { //#if !release.build System.out.println(message); //#endif } }

O haz el registro donde lo necesites. Ahora, si la propiedad release.build se establece en true, este código se comentará, lo que dará como resultado un método vacío. Proguard eliminará todos los usos del método vacío: en efecto, la versión de lanzamiento tendrá todos los mensajes de depuración eliminados.

Editar:

Al pensar en ello a nivel de biblioteca (estoy trabajando en el mapeo de la biblioteca J2ME), probablemente haya encontrado una mejor solución.

public class Log { private static boolean showDebug; public static void debug(final String message) { if (showDebug) { System.out.println(message); } } public static void setShowDebug(final boolean show) { showDebug = show; } }

De esta forma, el desarrollador final puede habilitar los niveles de registro dentro de la biblioteca en los que esté interesado. Si no se habilita nada, todo el código de registro se eliminará en la ofuscación del producto final. Dulce :)

/ JaanusSiim


El teléfono Series60 y UIQ que tiene una máquina virtual Sun modificada por Symbian tiene una redirección de salida estándar.

No solo puede capturar System.out, sino también Throwable.printStackTrace ().

En los primeros teléfonos, necesitaría escribir una aplicación C ++ que se enganche en el proceso del servidor de biblioteca estándar. Symbian produjo la aplicación Redirector que podría capturar la salida estándar de VM a una consola o un archivo.

En teléfonos más nuevos, se introdujo un "redireccionamiento: //" del protocolo GCF que podría leer la salida estándar de la VM en un byte Java [] o un objeto String (lo desearía hacer en un MIDlet separado) y la aplicación Redirector se reescribió en Java.

En la máquina virtual J9 más nueva utilizada en los teléfonos de la Serie 3ª Edición Feature Pack 2 (y posteriores), puede que tenga que probar "redirect: // test" en su lugar.


El marco LWUIT del J2ME proporciona el formulario de registro que puede tener un registro de la declaración dentro de él. Puede agregar el registro en todos los lugares que cree que pueden generar la excepción.

Ejemplo: Log.getInstance (). ShowLog (); Al agregar la línea anterior, puede hacer un seguimiento del registro en los dispositivos J2ME.