我应该在创建最终包时评论我的日志调用吗?

时间:2011-02-10 15:14:45

标签: android android-log

我有一个使用大量Log.d()Log.e()调用的应用程序。现在我想创建我的最终发布包。 Eclipse中的Android Export功能提到删除清单中的"Debuggable"标志,我已经完成了。我是否还要评论所有Log次调用以提高应用程序的性能,或者这些调用在不可调试的最终版本包中什么也不做?

4 个答案:

答案 0 :(得分:18)

我将Log类子类化为一个名为Trace的类,它反映了Log上的方法。所以我做了Trace.d(TAG,“blah”),然后在Trace.d方法中,代码只根据一个名为LOGGING_LEVEL的静态最终类变量执行,该变量的级别为1-5(无,只有错误,错误&警告,错误和警告&信息,以及包括调试在内的所有内容。在制作制作APK时,Proguard会删除应用程序中未使用的所有代码,因此它会为我完成。

对我来说,日志记录对于从源代码中删除非常重要,但出于性能,安全和知识产权的原因,必须将其从生产应用程序中删除。

这种结构允许我向应用程序添加大量的日志记录,这使得调试问题变得更加容易,但对生产APK没有任何影响

public class Trace
{
    public static final int    NONE                         = 0;
    public static final int    ERRORS_ONLY                  = 1;
    public static final int    ERRORS_WARNINGS              = 2;
    public static final int    ERRORS_WARNINGS_INFO         = 3;
    public static final int    ERRORS_WARNINGS_INFO_DEBUG   = 4;

    private static final int          LOGGING_LEVEL   = ERRORS_ONLY;        // Errors + warnings + info + debug (default)

    public static void e(String tag, String msg)
    {
        if ( LOGGING_LEVEL >=1) Log.e(tag,msg);
    }

    public static void e(String tag, String msg, Exception e)
    {
        if ( LOGGING_LEVEL >=1) Log.e(tag,msg,e);
    }

    public static void w(String tag, String msg)
    {
        if ( LOGGING_LEVEL >=2) Log.w(tag, msg);
    }

    public static void i(String tag, String msg)
    {
        if ( LOGGING_LEVEL >=3) Log.i(tag,msg);
    }

    public static void d(String tag, String msg)
    {
        if ( LOGGING_LEVEL >=4) Log.d(tag, msg);
    }

}

答案 1 :(得分:8)

这使我检查了我的假设,即代码中的log.d行不会出现在签名版本的apk上,而没有在清单中设置debuggable标志,我错了,他们仍然出现。

快速搜索SO让我接受了这个问题的接受答案: Remove all debug logging calls before publishing: are there tools to do this?

效果很好,您无需更改任何代码。

答案 2 :(得分:4)

来自developer.android.com:

  

关闭日志记录和调试并清理数据/文件对于发布,您   应该确保调试设施   关闭,调试和   其他不必要的数据/文件   从您的应用程序项目中删除。

     

删除android:debuggable =“true”   来自的属性   清单的元素。删除日志   文件,备份文件等   来自应用程序的不必要文件   项目。检查私人或   专有数据并将其删除   必要。停用对Log的任何调用   源代码中的方法。

Source

答案 3 :(得分:2)

我会删除日志代码,如下所示:

-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(...);
    public static java.lang.String getStackTraceString(java.lang.Throwable);
}

-assumenosideeffects class java.lang.Exception {
    public void printStackTrace();
}

-assumenosideeffects class * implements org.slf4j.Logger {
    public void trace(...);
    public void debug(...);
    public void info(...);
    public void warn(...);
    public void error(...);
    public boolean isTraceEnabled(...);
    public boolean isDebugEnabled(...);
    public boolean isInfoEnabled(...);
    public boolean isWarnEnabled(...);
    public boolean isErrorEnabled(...);
}

如果需要,可以保留错误和警告类别。但是请确保为构建启用优化和收缩,然后才能删除代码