55

在向市场发布应用程序之前关闭我自己的应用程序的 LogCat 输出很简单。我也知道如何通过标签和/或 id 有选择地过滤 LogCat 消息以方便我自己的调试。

但现在我对可能更困难的事情感兴趣(也许不可能?):禁用所有 LogCat 输出,包括 & 尤其是来自 TtsService、GoogleLoginService 等第三方服务的输出。

这可能吗?

进一步澄清:我对自己过滤掉消息感兴趣。我对从 Android Market 下载我的应用程序的人禁用 3rd-party 消息很感兴趣。这可能吗?

4

8 回答 8

196

您可以使用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 日志。

于 2011-04-05T14:14:05.470 回答
9

如果您不使用 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);
    }
}
于 2012-03-16T21:17:08.607 回答
2

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(...);
}
于 2017-08-01T12:08:21.613 回答
2

在 app 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

它对我有用。

于 2018-03-03T18:48:35.383 回答
0

您可以将debuggable false放在 buildTypes 版本上。

buildTypes {

     release {
        debuggable false
        ...
     }

}
于 2017-09-25T18:58:20.997 回答
0

我通常下一步:

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);
于 2018-03-24T16:44:29.407 回答
0

除了将 Android SDK 中的默认ProGuard设置(“proguard-android.txt”文件)换成“proguard-android-optimize.txt”优化文件之外,我还结合了 David Snabel-Caunt接受的答案。该文件也可在此 Android SDK 文件夹中找到,具有相同的规则,但启用了优化。

于 2019-02-23T23:26:28.687 回答
0

除了枚举所有类的方法之外,您还可以简单地使用<methods>简写:

-assumenosideeffects class a.b.c.DebugLogs {
    <methods>;
}

com.android.tools.build:gradle使用version为我工作4.0.0

于 2020-07-07T16:08:00.733 回答