6

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

proguard.cfg

-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(...); } 
2
  • Just double checked as you had me worried. I definitely see none of my Log.d o/p for the Ant release build. I'm filtering Logcat o/p by its PID and I just see the dalvik GC_CONCUURRENT stuff Commented Feb 17, 2012 at 22:27
  • I have this issue. I run Proguard 4.4 Commented May 5, 2012 at 12:46

3 Answers 3

4

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

Sign up to request clarification or add additional context in comments.

1 Comment

proguard-android-optimize.txt fixed it for me ! Thanks for the explanation - you definitely deserve a Beer for that !
1

You cannot use assumenosideeffects without Proguard optimization.

Comments

-1

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.

4 Comments

I have to disagree here. I rely on an identical assumenosideeffects statement to remove Log lines from my project and it works - I get no log o/p in Ant release builds. The only differences between my proguard.cfg and this one are I have only the one project and I don't state -dontobfuscate or -forceprocessing
@NickT: I removed the two items that you mentioned you don't have in your proguard.cfg file, but I still see the log statements. It was worth a try.
@slayton: according to the Proguard docs the assumenosideeffects will remove calls to methods that don't appear to have side effects matching the class specifications. proguard.sourceforge.net/index.html#manual/usage.html
This will not be the same result. You are still doing String concatenation here while removing the code will not.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.