Disable LogCat Output COMPLETELY in release Android app? Disable LogCat Output COMPLETELY in release Android app? android android

Disable LogCat Output COMPLETELY in release Android app?


You can use ProGuard to remove completely any lines where a return value is not used, by telling ProGuard to assume that there will be no problems.

The following proguard.cfg chunk instructs to remove Log.d, Log.v and Log.i calls.

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

The end result is that these log lines are not in your release apk, and therefore any user with logcat won't see d/v/i logs.


if you don't use proguard, you have to manage the log yourself and in the manifest file make dubuggable false

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

Here my custom log class

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


The great answer provided by David Caunt doesn't seem to work for the rules defined in proguard-android-optimize.txt.

Instead of using the wildcard ***, current versions of ProGuard seem to expect the return parameter's type qualifier:

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