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