Reputation: 4351
When compiling my app using Ant I can see the verbose Proguard output, and I have things setup to remove the log statements (see below), but when I run the release apk all the log statements I was trying to remove are there.
I have 2 projects each of which include a common project. The 2 main projects and the common project each have a proguard.cfg file, all of which contain the snippet to remove log statements.
Is there something that I am missing?
** All my log statements are Log.d(...)
-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontpreverify
-verbose
-dontobfuscate
-forceprocessing
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.app.backup.BackupAgentHelper
-keep public class * extends android.preference.Preference
-keep public class com.android.vending.licensing.ILicensingService
-keepclasseswithmembernames class * {
native <methods>;
}
-keepclasseswithmembers class * {
public <init>(android.content.Context, android.util.AttributeSet);
}
-keepclasseswithmembers class * {
public <init>(android.content.Context, android.util.AttributeSet, int);
}
-keepclassmembers class * extends android.app.Activity {
public void *(android.view.View);
}
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
}
-assumenosideeffects class android.util.Log {
public static *** d(...);
public static *** v(...);
}
Upvotes: 6
Views: 2520
Reputation: 1957
Here your proguard file is ok, but there is a detail that you may be missing.
In your gradle file you probably have something like this:
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt), 'proguard-rules.pro'
}
}
Check the getDefaultProguardFile('proguard-android')
, so if you intent to optimize it, you should change it to getDefaultProguardFile('proguard-android-optimize.txt')
.
I spent some time to realize it, saw your question but still not able to remove my Log
calls on my code. So I've found this link that explains that is necessary to change to the optimize file to proguard be able to optimize.
https://developer.android.com/tools/help/proguard.html#enabling-gradle
Upvotes: 4
Reputation: 20319
Instead of deleting or commenting out all of your log messages using pro-guard you could do something like this. Create a utility class that is basically a wrapper around the android logging system
public class Util{
public static boolean showLogs = true;
public static String myTag = 'My Tag';
public static void logD(String message){
if (Util.showLogs)
Log.d(myTag, message);
}
}
Before I compile my app for distribution I simply call showLogs = true;
and then all log messages are supressed
You can easily extend this class to allow you to specify the tag and produce more than debugging messages.
Upvotes: -1