Android, Does Log reduces application speed?


Ask by : Hesam November 19, 2012 11:02

In my application I have so many lines of logs, such as Log.i(), Log.e() and Log.d(). I use these logs widely through my application.

After I run my application if I connect device to Eclipse I can see hundreds of lines of log. My question is does this behavior reduces application speed?

=============

Update

Thanks to Frank for his suggestion. I added proposed code into proguard.cfg then exported new APK file. It took so much time but finally new APK file generated. However, when I test it in a real device I still can see logs.

This is my proguard.cfg:

# This is a configuration file for ProGuard.
# http://proguard.sourceforge.net/index.html#manual/usage.html

-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-verbose

# Optimization is turned off by default. Dex does not like code run
# through the ProGuard optimize and preverify steps (and performs some
# of these optimizations on its own).
-dontoptimize
-dontpreverify
# Note that if you want to enable optimization, you cannot just
# include optimization flags in your own project configuration file;
# instead you will need to point to the
# "proguard-android-optimize.txt" file instead of this one from your
# project.properties file.

-keepattributes *Annotation*
-keep public class com.google.vending.licensing.ILicensingService
-keep public class com.android.vending.licensing.ILicensingService

# For native methods, see http://proguard.sourceforge.net/manual/examples.html#native
-keepclasseswithmembernames class * {
    native <methods>;
}

# keep setters in Views so that animations can still work.
# see http://proguard.sourceforge.net/manual/examples.html#beans
-keepclassmembers public class * extends android.view.View {
   void set*(***);
   *** get*();
}

# We want to keep methods in Activity that could be used in the XML attribute onClick
-keepclassmembers class * extends android.app.Activity {
   public void *(android.view.View);
}

# For enumeration classes, see http://proguard.sourceforge.net/manual/examples.html#enumerations
-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}

-keep class * implements android.os.Parcelable {
  public static final android.os.Parcelable$Creator *;
}

-keepclassmembers class **.R$* {
    public static <fields>;
}

# The support library contains references to newer platform versions.
# Don't warn about those in case this app is linking against an older
# platform version.  We know about them, and they are safe.
-dontwarn android.support.**

# Hesam - Remove all logs
-assumenosideeffects class android.util.Log {
    public static int v(...);
    public static int d(...);
    public static int i(...);
    public static int w(...);
    public static int e(...);
}

#-libraryjars /libs/gcm.jar
#-libraryjars /libs/libGoogleAnalytics.jar
#-libraryjars /libs/twitter4j-core-android-2.2.6.jar
#-libraryjars /libs/universal-image-loader-1.5.4.jar

-dontwarn javax.management.**
-dontwarn java.lang.management.**
-dontwarn org.apache.**
-dontwarn org.slf4j.**
-dontwarn org.json.*

-keep class com.google.** { *; }
-keep class twitter4j.** { *; }
-keep class com.nostra13.** { *; }
View original question

Answer by : FrankNovember 04, 2012 13:36

The answer is obvious, YES it does.

But there is a solution, you can ask Proguard to remove log statements of any level that you desire. Like this your users are not impacted by the verbose logging that they don't see anyway..

Add folowing to your Proguard config:

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

This will remove LOG.d and LOG.v statements, you can expand as you like..

View original answer