chris
chris

Reputation: 4351

Proguard is not removing Log calls

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

Upvotes: 6

Views: 2520

Answers (3)

wviana
wviana

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

forlayo
forlayo

Reputation: 1688

You cannot use assumenosideeffects without Proguard optimization.

Upvotes: 1

slayton
slayton

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

Related Questions