Отключить вывод LogCat ПОЛНОСТЬЮ в версии Android-приложения?
Отключение моего собственного приложения Выход LogCat перед выпуском приложения на рынок прост. Я также знаю, как выборочно фильтровать сообщение LogCat по тегу и/или идентификатору для удобства моего отладки.
Но теперь меня интересует то, что может быть намного сложнее (возможно, невозможно?): отключить все выходные данные LogCat, в том числе и особенно те, которые поступают от сторонних сервисов, таких как TtsService, GoogleLoginService и т.д.
Возможно ли это?
Чтобы уточнить: я не заинтересован в фильтрации сообщений для себя. Я заинтересован в отключении сторонних сообщений для тех, кто загружает мое приложение с Android Market. Возможно ли это?
Ответы
Ответ 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
...
}
}