Reputation: 14974
Shutting off my own app's LogCat output before releasing an app to the market is straightforward. I also know how to selectively filter LogCat message by tag and/or id for my own debug convenience.
But now I am interested in something that may be much more difficult (perhaps impossible?): Disable all LogCat output, including & especially those coming from 3rd-party services like TtsService, GoogleLoginService, etc.
Is this possible?
To further clarify: I am not interested in filtering out messages for myself. I am rather interested in disabling 3rd-party messages for whoever downloads my app from the Android Market. Is this possible?
Upvotes: 58
Views: 47729
Reputation: 9357
Instead of enumerating all the class's methods it looks like you can also simply use the <methods>
shorthand :
-assumenosideeffects class a.b.c.DebugLogs {
<methods>;
}
Worked for me with com.android.tools.build:gradle
version 4.0.0
.
Upvotes: 0
Reputation: 143
I combined David Snabel-Caunt's accepted answer in addition to swapping out the default ProGuard settings ("proguard-android.txt" file) from the Android SDK for the "proguard-android-optimize.txt" optimized file. The file is also available in this Android SDK folder with the same rules but with optimizations enabled.
Upvotes: 0
Reputation: 3195
I usually do next:
if (BuildConfig.DEBUG) Log.i(TAG, msg);
though if you have a lot of dependencies (libraries) and they written bad then yeah just use https://stackoverflow.com/a/5553290/4548520
making lines shorter:
private final static boolean DEBUG = BuildConfig.DEBUG;
if (DEBUG) Log.i(TAG, msg_1);
if (DEBUG) Log.e(TAG, msg_error_2);
Upvotes: 0
Reputation: 181
In app build.gradle file set:
release {
minifyEnabled true
……
}
In proguard-rules.pro put:
-assumenosideeffects class android.util.Log {
public static *** v(...);
public static *** d(...);
public static *** i(...);
public static *** w(...);
public static *** e(...);
}
-ignorewarnings
It worked for me.
Upvotes: 3
Reputation: 596
You can put debuggable false on buildTypes release.
buildTypes {
release {
debuggable false
...
}
}
Upvotes: -2
Reputation: 4262
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(...);
}
Upvotes: 3
Reputation: 58361
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.
Upvotes: 201
Reputation: 5457
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);
}
}
Upvotes: 9