Отключить вывод LogCat ПОЛНОСТЬЮ в версии Android-приложения? - программирование
Подтвердить что ты не робот

Отключить вывод LogCat ПОЛНОСТЬЮ в версии Android-приложения?

Отключение моего собственного приложения Выход LogCat перед выпуском приложения на рынок прост. Я также знаю, как выборочно фильтровать сообщение LogCat по тегу и/или идентификатору для удобства моего отладки.

Но теперь меня интересует то, что может быть намного сложнее (возможно, невозможно?): отключить все выходные данные LogCat, в том числе и особенно те, которые поступают от сторонних сервисов, таких как TtsService, GoogleLoginService и т.д.

Возможно ли это?

Чтобы уточнить: я не заинтересован в фильтрации сообщений для себя. Я заинтересован в отключении сторонних сообщений для тех, кто загружает мое приложение с Android Market. Возможно ли это?

4b9b3361

Ответ 1

Вы можете использовать ProGuard, чтобы полностью удалить любые строки, где возвращаемое значение не используется, сообщая ProGuard о том, что проблем не будет.

Следующий фрагмент proguard.cfg указывает удалить вызовы Log.d, Log.v и Log.i.

-assumenosideeffects class android.util.Log {
    public static *** d(...);
    public static *** w(...);
    public static *** v(...);
    public static *** i(...);
}

Конечным результатом является то, что эти строки журнала не находятся в вашем apk-релизе, поэтому любой пользователь с logcat не будет видеть журналы d/v/i.

Ответ 2

Если вы не используете proguard, вам необходимо самому управлять журналом, а в файле манифеста сделать dubuggable false

<application
    android:name="MyApplication"
    android:icon="@drawable/gift"
    android:label="@string/app_name" android:debuggable="@bool/build_log">

Здесь мой пользовательский класс журнала

public class Lol {

    public static final boolean ENABLE_LOG = true & MyApplication.sDebug;

    private static final boolean DEBUG = true & ENABLE_LOG;

    private static final boolean VERBOSE = true & ENABLE_LOG;

    private static final boolean TEMP = true & ENABLE_LOG;

    private static final boolean WARNING = true & ENABLE_LOG;

    private static final boolean INFO = true & ENABLE_LOG;

    private static final boolean ERROR = true & ENABLE_LOG;

    public static void obvious(String tag, String msg) {
        if (DEBUG) {
            msg = "*********************************\n" + msg
                    + "\n*********************************";
            Log.d(tag, msg);
        }
    }

    public static void d(String tag, String msg) {
        if (DEBUG)
            Log.d(tag, msg);
    }

    public static void d(boolean bool, String tag, String msg) {
        if (TEMP&bool)
            Log.d(tag, msg);
    }

    public static void i(String tag, String msg) {
        if (INFO)
            Log.i(tag, msg);
    }

    public static void e(String tag, String msg) {
        if (ERROR)
            Log.e(tag, msg);
    }

    public static void e(boolean bool, String tag, String msg) {
        if (TEMP&bool)
            Log.e(tag, msg);
    }

    public static void v(String tag, String msg) {
        if (VERBOSE)
            Log.v(tag, msg);
    }

    public static void w(String tag, String msg) {
        if (WARNING)
            Log.w(tag, msg);
    }

    public static String getStackTraceString(Exception e) {
        return Log.getStackTraceString(e);
    }

    public static void w(String tag, String msg, Exception e) {
        if (WARNING)
            Log.w(tag, msg,e);
    }
}

Ответ 3

Отличный ответ David Caunt, похоже, не работает для правил, определенных в proguard-android-optimize.txt.

Вместо использования подстановочного знака *** текущие версии ProGuard, похоже, ожидают отступ от типа возвращаемого параметра:

-assumenosideeffects class android.util.Log {
    public static int   d(...);
    public static int   w(...);
    public static int   v(...);
    public static int   i(...);
    public static int wtf(...);
}

Ответ 4

Вы можете поместить debuggable false в выпуске buildTypes.

buildTypes {

     release {
        debuggable false
        ...
     }

}