При каких обстоятельствах Android Log.wtf прекратит мое приложение?

Я хотел бы регистрировать отчеты об ошибках для своего приложения на консоли ошибок Android Market; похоже, я могу использовать Log.wtf для этого.

В документации для Log.wtf указано:

Какая ужасная ошибка: сообщите о состоянии, которое никогда не должно происходить. Ошибка всегда регистрируется на уровне ASSERT со стеком вызовов. В зависимости от конфигурации системы отчет может быть добавлен в DropBoxManager и/или процесс может быть немедленно завершен диалоговым окном с ошибкой.

В моем случае я могу поймать эти исключения и восстановить их, показывая сообщение об ошибке; Я не хочу, чтобы мое приложение разбилось, но я хочу, чтобы отчет отправлялся на консоль ошибок.

При каких обстоятельствах Log.wtf прекратит мое приложение? Возможно ли получить отчет об ошибке, не приводя к сбою приложения?

Ответ 1

Это зависит от ваших системных настроек (некоторые параметры могут быть включены для отладки, но отключены на обычных устройствах). Они настраиваются, когда андроид скомпилирован для устройства и, возможно, ядра.

Я бы предложил использовать Log.e() с префиксом вместо Log.wtf(), чтобы избежать каких-либо проблем, например. WTF: Something terrible happened

Вот что происходит, когда вы вызываете 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;
} 

Ответ 2

Следуя информации о небкате. Остерегайтесь использования WTF: уровень API устройства должен быть 8 или выше.