从Android中的生产代码中删除日志记录?

Cod*_*oid 22 android

从生产android应用程序中删除日志记录的最佳方法是什么.似乎proguard没有完全做到这一点,字符串仍然写入,所以我想知道从生产代码中删除日志记录的最佳解决方案是什么?

zap*_*apl 25

IMO最佳解决方案是在您调用日志记录方法的任何地方编写如下代码.

if (SOME_LOG_CONSTANT) Log.d(TAG, "event:" + someSlowToEvaluateMethod());
Run Code Online (Sandbox Code Playgroud)

通过更改1常量,您可以删除每个不需要的日志记录.这样,后面的部分if (false)甚至不应该进入你的.class文件,因为编译器可以完全删除它(它是无法访问的代码).

这也意味着如果将其包装在其中,则可以从发布软件中排除整个代码块if.这甚至是一些无法做到的事情.

SOME_LOG_CONSTANTBuildConfig.DEBUG如果你使用SDK工具R17及以上.根据构建类型,该常量会自动更改.谢谢@Christopher

  • 如果你必须走这条路,我会补充说,使用`BuildConfig.DEBUG`包装日志子句会自动使用SDK Tools r17及更高版本为你做这件事.这避免了必须更改发布版本的代码的笨拙. (3认同)

Yai*_*lka 9

使用Timber,它是一个很好的库来配置你的日志:https: //github.com/JakeWharton/timber

使用示例:Timber.d("活动创建");

配置示例:

public class ExampleApp extends Application {
  @Override public void onCreate() {
   super.onCreate();

    if (BuildConfig.DEBUG) {
     Timber.plant(new DebugTree());
    } else {
     Timber.plant(new CrashReportingTree());
    }
  }




/** A tree which logs important information for crash reporting. */
 private static class CrashReportingTree extends Timber.Tree {
   @Override protected void log(int priority, String tag, String message, Throwable t) {
     if (priority == Log.VERBOSE || priority == Log.DEBUG) {
       return;
     }

     FakeCrashLibrary.log(priority, tag, message);

     if (t != null) {
       if (priority == Log.ERROR) {
         FakeCrashLibrary.logError(t);
       } else if (priority == Log.WARN) {
         FakeCrashLibrary.logWarning(t);
       }
     }
   }
 }
Run Code Online (Sandbox Code Playgroud)


sty*_*972 6

配置Release for Application会让您Log在发布应用程序之前简单地删除命令.

您可以通过删除源文件中对Log方法的调用来停用日志记录.

我所做的是创建一个专有的静态日志方法,读取这样的全局布尔值:

class MyLog {

    private static final boolean LOGGING = true; //false to disable logging

    public static void d(String tag, String message) {
        if (LOGGING) {
            Log.d(tag, message);
        }
    }

    /* ... same for v, e, w, i */
}
Run Code Online (Sandbox Code Playgroud)

在想要记录的任何地方使用它.

MyLog.d("Tag", "This will only work with LOGGING true");
Run Code Online (Sandbox Code Playgroud)

  • 这样,无论"LOGGING"的值如何,您在"消息"中传递的所有内容都将在运行时进行评估.这对性能不利. (5认同)
  • 我想知道编译器是否足够聪明,知道它永远不会被执行,只是不能将其编译成字节码. (2认同)