2011-07-19 13 views
11

Me gustaría registrar informes de errores para mi aplicación en la consola de error de Android Market; parece que puedo usar Log.wtf para esto.¿Bajo qué circunstancias finalizará la aplicación Log.wtf de Android?

La documentación para Log.wtf dice:

qué fracaso terrible: comunicar un estado que nunca debe suceder. El error siempre se registrará en el nivel ASSERT con la pila de llamadas. Dependiendo de la configuración del sistema, se puede agregar un informe al DropBoxManager y/o el proceso puede finalizar inmediatamente con un cuadro de diálogo de error.

En mi caso, puedo detectar estas excepciones y recuperarlas al mostrar un mensaje de error; No quiero que mi aplicación se bloquee, pero sí quiero que se envíe el informe a la consola de error.

¿En qué circunstancias se Log.wtf terminar mi aplicación? ¿Es posible obtener un informe de error sin hacer que la aplicación se cuelgue?

+2

No tengo una respuesta directa a su pregunta, pero podría considerar el uso de Remote Stacktrace: http://code.google.com/p/android-remote-stacktrace/ Lo he usado en el pasado, y ha sido de gran ayuda para encontrar todos mis errores. – danh32

Respuesta

11

Depende de la configuración del sistema (ciertas opciones se pueden habilitar para la depuración, pero están desactivados en los dispositivos normales). Son configuraciones habilitadas cuando se compila Android para el dispositivo y posiblemente el kernel.

se recomienda usar Log.e() con un prefijo en lugar de Log.wtf() para evitar cualquier problema, por ejemplo, WTF: Something terrible happened

Esto es lo que sucede cuando se llama a un Log.wtf()

-> Log.java

/** 
* What a Terrible Failure: Report an exception that should never happen. 
* Similar to {@link #wtf(String, Throwable)}, with a message as well. 
* @param tag Used to identify the source of a log message. 
* @param msg The message you would like logged. 
* @param tr An exception to log. May be null. 
*/ 
public static int wtf(String tag, String msg, Throwable tr) { 
    TerribleFailure what = new TerribleFailure(msg, tr); 
    int bytes = println_native(LOG_ID_MAIN, ASSERT, tag, getStackTraceString(tr)); 
    sWtfHandler.onTerribleFailure(tag, what); 
    return bytes; 
} 

-> Log.java

private static TerribleFailureHandler sWtfHandler = new TerribleFailureHandler() { 
     public void onTerribleFailure(String tag, TerribleFailure what) { 
      RuntimeInit.wtf(tag, what); 
     } 
    }; 

-> RuntimeInit. java

/** 
* Report a serious error in the current process. May or may not cause 
* the process to terminate (depends on system settings). 
* 
* @param tag to record with the error 
* @param t exception describing the error site and conditions 
*/ 
public static void wtf(String tag, Throwable t) { 
    try { 
     if (ActivityManagerNative.getDefault() 
       .handleApplicationWtf(mApplicationObject, tag, 
         new ApplicationErrorReport.CrashInfo(t))) { 
      // The Activity Manager has already written us off -- now exit. 
      Process.killProcess(Process.myPid()); 
      System.exit(10); 
     } 
    } catch (Throwable t2) { 
     Slog.e(TAG, "Error reporting WTF", t2); 
    } 
} 

-> ActivityManagerNative.java

public boolean handleApplicationWtf(IBinder app, String tag, 
     ApplicationErrorReport.CrashInfo crashInfo) 
     throws RemoteException { 
    Parcel data = Parcel.obtain(); 
    Parcel reply = Parcel.obtain(); 
    data.writeInterfaceToken(IActivityManager.descriptor); 
    data.writeStrongBinder(app); 
    data.writeString(tag); 
    crashInfo.writeToParcel(data, 0); 
    mRemote.transact(HANDLE_APPLICATION_WTF_TRANSACTION, data, 
      reply, 0); 
    reply.readException(); 
    boolean res = reply.readInt() != 0; 
    reply.recycle(); 
    data.recycle(); 
    return res; 
} 
+0

Al leer el código, parece que Log.wtf bloqueará la aplicación según la respuesta de mRemote. Parece que tendré que usar Remote Stacktrace después de todo. –

0

Siguiendo nebkat information. Cuidado con el uso de WTF: el nivel de API del dispositivo debe ser 8 o superior.

Cuestiones relacionadas