Отключить выход LogCat ПОЛНОСТЬЮ в выпуске приложения для Android? - PullRequest
50 голосов
/ 05 апреля 2011

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

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

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

Ответы [ 7 ]

185 голосов
/ 05 апреля 2011

Вы можете использовать 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 не увидитд / в / я логи.

10 голосов
/ 17 марта 2012

если вы не используете 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);
    }
}
2 голосов
/ 03 марта 2018

В файле приложения build.gradle установлено:

release {
    minifyEnabled true
     ……
}

В proguard-rules.pro положено:

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

У меня это сработало.

1 голос
/ 01 августа 2017

Великолепный ответ, предоставленный Дэвидом Каунтом , похоже, не работает для правил, определенных в 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(...);
}
0 голосов
/ 24 февраля 2019

Я объединил принятый ответ Дэвида Снабеля-Каунта в дополнение к замене стандартных настроек ProGuard (файл "proguard-android.txt") из Android SDK для "proguard" -android-optimize.txt "оптимизированный файл. Файл также доступен в этой папке Android SDK с теми же правилами, но с включенной оптимизацией.

0 голосов
/ 24 марта 2018

Я обычно делаю следующее:

if (BuildConfig.DEBUG) Log.i(TAG, msg);

хотя, если у вас много зависимостей (библиотек) и они плохо написаны, тогда да, просто используйте https://stackoverflow.com/a/5553290/4548520

укорочение линий:

private final static boolean DEBUG = BuildConfig.DEBUG;

if (DEBUG) Log.i(TAG, msg_1);

if (DEBUG) Log.e(TAG, msg_error_2);
0 голосов
/ 25 сентября 2017

Вы можете поставить отладочную ложь на выпуск buildTypes.

buildTypes {

     release {
        debuggable false
        ...
     }

}
...