我应该在创build最终包时对我的日志调用发表评论吗?

我有一个应用程序使用大量的Log.d()Log.e()调用进行debugging。 现在我想创build我的最终包发布。 Eclipse的Android导出function提到删除清单中的"Debuggable"标志,我已经完成了。 我还应该评论所有的Log调用,以提高我的应用程序的性能,否则这些调用将不会在不可debugging的最终版本包中做什么?

Solutions Collecting From Web of "我应该在创build最终包时对我的日志调用发表评论吗?"

我已经将Log类inheritance为一个名为Trace的类,它反映了Log上的方法。 所以我做了Trace.d(TAG,“blah”),然后在Trace.d方法中,代码只执行一个叫做LOGGING_LEVEL的静态final类variables,其级别为1-5(none,errors only,errors&warnings ,错误&警告&信息,以及一切,包括debugging)。 当生产生产APK时,Proguard将删除所有未在应用程序中使用的代码,所以它对我来说是这样。

对于我来说,日志logging太重要了,不能从源头上删除,但是为了性能,安全和知识产权的原因,它必须从生产应用程序中删除。

这种结构允许我在应用程序中添加更多的日志logging,这使得debugging问题变得更容易,但对生产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); } } 

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

在SO上进行快速search,让我接受了这个问题的答案: 在发布前删除所有debugging日志logging调用:是否有工具可以执行此操作?

它工作得很好,你不必改变任何代码。

来自developer.android.com:

closures日志logging和debugging并清理数据/文件对于发行版,您应该确保closuresdebugging工具,并将debugging和其他不必要的数据/文件从应用程序项目中删除。

从清单的元素中删除android:debuggable =“true”属性。 从应用程序项目中删除日志文件,备份文件和其他不必要的文件。 检查私人或专有数据,并根据需要删除它。 取消激活源代码中任何对Log方法的调用。

资源

我将删除日志代码如下:

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

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