2008-09-23 28 views
17

¿Qué soluciones existen para la tala J2ME?Inicio de sesión en J2ME

Estoy especialmente interesado en excluir fácilmente el registro para la versión "versión", para tener un paquete más pequeño & espacio de memoria.

Respuesta

12

Si está utilizando procesamiento previo y la ofuscación con Proguard, entonces usted 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 sea que 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:

Pensando en ello el nivel de la biblioteca (estoy trabajando en la biblioteca J2ME mapeo) He, probablemente, encontrado una solución mejor.

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 manera desarrollador final puede permitir niveles de registro dentro de la biblioteca que él/ella está interesada en. Si nada se habilitará, todo el código de registro se eliminará en la ofuscación producto final. Dulce :)

/JaanusSiim

+0

¿Cómo se eliminaría el código en la segunda versión? Ha eliminado los comandos de preprocesamiento – Casebash

+0

La parte de preproceso está en el código de la aplicación alrededor de 'Log.setShowDebug (true)'. De esta forma, 'showDebug' siempre será falso y la magia de ProGuard sucederá. Es posible que deba jugar con el número de pases de optimización. – JaanusSiim

1

He utilizado MIDPLogger a un nivel aceptable en una aplicación de producción, aunque he encontrado 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.

19

MicroLog es apuesta segura. Es una pequeña biblioteca de registro para Java ME (J2ME) como Log4j. Tiene soporte para el registro de la consola, archivo, RecordStore, Lona, Forma, Bluetooth, un puerto serie (Bluetooth, infrarrojos, USB), (SSL incluido), UDP, Syslog, MMS, SMS, correo electrónico o en Amazon S3 .

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

+0

MicroLog se ve muy bien, pero necesita CLDC 1.1 – Casebash

+1

Encontré una biblioteca llamada [J4me] (http://code.google.com/p/j4me/wiki/Logging) que se ejecutará en cualquier dispositivo. Microlog se ve mejor si puede administrarlo aunque – Casebash

+0

En realidad, J4me parece demasiado simplista para mis necesidades (solo realmente proporciona niveles de registro). Creo que voy a hacer mi propio uso de Proguard – Casebash

3

La Serie 60 y UIQ teléfono que tiene una máquina virtual Sun modificado por Symbian sí tienen redirección de salida estándar.

no sólo se puede capturar System.out pero Throwable.printStackTrace() también funciona.

En los primeros terminales, lo que se necesita para escribir una aplicación C++ que se engancha en el proceso de 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 protocolo GCF "redirigido: //" que podría leer la salida estándar VM en un byte Java [] o un objeto String (lo desearía en un MIDlet separado) y el Redirector la aplicación fue reescrita en Java.

En el más reciente J9 VM usado en Feature Pack Serie 60 3ª Edición 2 auriculares (y más adelante), es posible que tenga que probar "redirigir: // test" en su lugar.

7

Puede utilizar los -assumenosideaffects en Proguard que están completamente y eliminar el registro de su clase:

-assumenosideeffects public class logger.Logger {*;} 

En lugar de tener que procesar previamente.

0

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

0

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

Ahora, si solo omite el cuerpo de WhateverLog.log (como se muestra en la solución aceptada), aún dejará 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 le permitirán a su optimizador eliminar no solo las declaraciones de registro sino también todos los códigos cuyos resultados solo serían utilizados por la llamada de registro.

+1

Tengo que estar en desacuerdo: P Como se menciona, solo funciona si usa proguard. Después de comentar el contenido del método debug(), usted tendrá un método vacío que proguard eliminará. Esto significa que todas las llamadas al método también se eliminarán. No tendrá ningún código inútil;) – JaanusSiim

+0

Muchas bibliotecas de registro usan cadenas de formato por este motivo. Entonces la llamada sería algo así como 'WhateverLog.log (" Loaded% d foos ", someclass.size());'. El formateo solo se realiza si el registro está habilitado. Idealmente, también evitaría hacer una llamada extra de 'tamaño' si es posible. –

0

LWUIT marco de la J2ME proporciona el formulario de registro que puede tener un registro de la declaración dentro de ella. 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.

+0

Bueno, que estás viendo publicaciones antiguas – Lucifer

Cuestiones relacionadas