在发布Android应用程序中完全禁用LogCat输出?

时间:2011-04-05 14:04:11

标签: android release google-play logcat android-logcat

在将应用程序发布到市场之前关闭我自己的应用程序的LogCat输出非常简单。我也知道如何根据标签和/或id选择性地过滤LogCat消息,以便我自己调试。

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

这可能吗?

进一步澄清:我有兴趣为自己过滤消息。对于从Android电子市场下载我的应用程序的用户,我很感兴趣禁用第三方邮件。这可能吗?

8 个答案:

答案 0 :(得分:185)

通过告诉ProGuard假设没有问题,您可以使用ProGuard完全删除任何未使用返回值的行。

以下proguard.cfg chunk指示删除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日志。

答案 1 :(得分:10)

如果你不使用proguard,你必须自己管理日志,并在清单文件中make 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 :(得分:1)

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(...);
}

答案 3 :(得分:1)

在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

它对我有用。

答案 4 :(得分:0)

您可以在buildTypes版本中添加 debuggable false

buildTypes {

     release {
        debuggable false
        ...
     }

}

答案 5 :(得分: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);

答案 6 :(得分:0)

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

答案 7 :(得分:0)

代替枚举类的所有方法,您似乎还可以简单地使用<methods>速记:

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

使用com.android.tools.build:gradle4.0.0为我服务。