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

jmb*_*ard 21 android android-log

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

Oll*_*e C 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);
    }

}
Run Code Online (Sandbox Code Playgroud)

  • "对生产APK没有任何影响"......错了.这是一个众所周知的反模式.问题是始终评估msg参数是否实际记录消息.例如Trace.e("blah","error was:"+ error.getCode()+",ruh roh!").无论你是否记录,都创建了三个临时字符串objs和两个多余的方法调用. (16认同)
  • 唯一的方法是用if if包装每个日志语句:if(Log.getLevel()> Log.DEBUG)然后Log.d(...); 那么你所做的最糟糕的是一个简单的类型比较.它会产生一些非常非常难看的代码.另一种选择是在编译时应用一些AOP解决方案来注入或不注入日志语句.我没有在Android环境中应用它的经验. (2认同)

Nic*_*ckT 8

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

快速搜索SO使我得到了这个问题的接受答案: 在发布之前删除所有调试日志记录调用:是否有工具来执行此操作?

它工作得很好,您不必更改任何代码.