My log messages are not removed with proguard configuration
Asked Answered
E

3

7

I am developing my Android app.

Then I enable & configure proguard by:

Step 1. Enable proguard:

In project.properties I have:

proguard.config=${sdk.dir}/tools/proguard/proguard-android-optimize.txt:proguard-project.txt

I also tried the following:

# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
proguard.config=proguard.cfg

Step 2. Configure proguard:

In proguard.cfg I have:

-assumenosideeffects class android.util.Log { *; }

I think the above configuration should remove all logs.

But when I install the APK under target/ folder & run my app, I can still see all my Log messages in logcat console. Why?

Epiphragm answered 28/3, 2014 at 13:46 Comment(5)
You would still see some messages from code you do not control. What are you seeing?Enesco
I see all the log messages where I used LogEpiphragm
did proguard run? did you export the application (Eclipse)?Hunger
Yes, proguard run. I didn't export from Eclipse, but I have configured in pom.xml & run maven command to generate the APK. I can see from terminal that proguard has run, I install the apk file generated by proguard in target/ folderEpiphragm
Adding proguard.config=proguard.cfg to project.properties works just fine. Your issue lies elsewhere.Trinomial
P
11

You should use the first line in your project.properties:

proguard.config=${sdk.dir}/tools/proguard/proguard-android-optimize.txt:proguard-project.txt

You should then add these lines to your proguard-project.txt (not the deprecated proguard.cfg):

-assumenosideeffects class android.util.Log {
    public static boolean isLoggable(java.lang.String, int);
    public static int v(...);
    public static int i(...);
    public static int w(...);
    public static int d(...);
    public static int e(...);
}

These options only have any effect if the file does not contain -dontoptimize.

Ant and Eclipse pick up the settings from project.properties. Gradle and Maven require equivalent settings that specify the configuration files, in build.gradle and in pom.xml respectively.

Similar questions and answers:

Peterec answered 31/3, 2014 at 23:53 Comment(6)
Since when the proguard.cfg is deprecated?Epiphragm
@Epiphragm It's not, at all. Simply add proguard.config=proguard.cfg to project.properties.Trinomial
The SDK Tools Revision 20 started combining proguard-project.txt with a central proguard-android.txt, in favour of proguard.cfg, at least when you create a new project. The new approach is definitely preferable, since it separates the project-specific configuration (maintained by you) from the generic configuration (maintained by Google's Android team). It appears the documentation hasn't been updated yet.Peterec
There are some risk of using proguard-android-optimize. Checkout the comment in android.googlesource.com/platform/sdk/+/master/files/….Flirt
There are other approach of removing debug message. Checkout medium.com/@elye.project/…Flirt
@Epiphragm proguard.cfg is just a different name for proguard-rules.txt, which was combined in proguard-android.txt in newer SDKs. Now, even proguard-android.txt is no longer maintained... Since any name can be specified in build.gradle, I am therefore back to the nostalgic proguard.cfg name.Prescribe
P
1

I can't remember where I found the reference to this method, but I've always used this:

-assumenosideeffects class android.util.Log {
    public static *** d(...);
    public static *** v(...);
}

in my configuration. It does remove debug and verbose logging that I wrote

Porta answered 28/3, 2014 at 14:8 Comment(0)
G
0

You can create your own Log utilit class and use it,

What I do when I release my apps is: I create my own Log class with methods i, d, e, w etc and use this Log class instead of the Android one, because then I can use a simple switch like boolean debug = true according to which I write to the LogCat or don't. That way I can leave all my log statements in the app. When you've written your own Log class, to use it all over your app, you can simply replace all,

Remove:

import android.util.Log; 

Add

import your.package.Log; 

Like this:

    public class Log {

        public static void i(String logTag, String logString) {

            if (isLogsEnabled) {
                Log.i(logTag, logString);
             }
        }

        public static void v(String logTag, String logString) {

            if (isLogsEnabled) {
                Log.v(logTag, logString);
             }
        }

          // you can add method for w,d,wtf also...
    }

Logging is a very handy debugging and diagnostic technique used by developers. Use the logging class provided as part of the Android SDK to log important information about your application to LogCat, but make sure you review your application’s logging implementation prior to publication, as logging has performance drawbacks.

Before releasing your application Review your log carefully so its doesn't leek any confidential data,

Log is very important whenever your application in testing mode, Logs will provide you current state and scenario of your application on current device. So its very helpful whenever you will update your application.

Sometime Google play reject your application if they was found your Logging mechanism violate the rules.

Giulia answered 3/4, 2014 at 10:10 Comment(3)
the question was specific to trim the log messages with proguardTelles
Using proguard, you'll need proguard-android-optimize, which is risky as per stated by the comment in android.googlesource.com/platform/sdk/+/master/files/….Flirt
Hence the above is a good option. There are other options as stated in medium.com/@elye.project/…Flirt

© 2022 - 2024 — McMap. All rights reserved.